STM32第15天串口中断接收
一:库函数实现串口接收
软件流程设计
初始化系统
初始化 GPIO 、串口外设、 LED 时钟
初始化串口和 LED 引脚
串口发送控制 LED 灯
usart.c
#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"void my_usart_Init()//千万不要和32库里面串口定于的名字一样,不然会报错
{GPIO_InitTypeDef Usart_Initstruct;USART_InitTypeDef My_usart_Initstruct;NVIC_InitTypeDef NVIC_Initstruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);Usart_Initstruct.GPIO_Pin=GPIO_Pin_9 ;Usart_Initstruct.GPIO_Mode=GPIO_Mode_AF_PP;Usart_Initstruct.GPIO_Speed= GPIO_Speed_10MHz;GPIO_Init(GPIOA,&Usart_Initstruct);Usart_Initstruct.GPIO_Pin=GPIO_Pin_10;Usart_Initstruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOA,&Usart_Initstruct);My_usart_Initstruct.USART_BaudRate=115200;My_usart_Initstruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;My_usart_Initstruct.USART_Mode= USART_Mode_Rx | USART_Mode_Tx ;My_usart_Initstruct.USART_Parity=USART_Parity_No ;My_usart_Initstruct.USART_StopBits=USART_StopBits_1 ;My_usart_Initstruct.USART_WordLength=USART_WordLength_8b ;USART_Init(USART1, &My_usart_Initstruct);USART_Cmd(USART1,ENABLE);USART_ITConfig( USART1,USART_IT_RXNE, ENABLE);NVIC_Initstruct.NVIC_IRQChannel= USART1_IRQn;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_Initstruct.NVIC_IRQChannelSubPriority=0;NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_Initstruct);}void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data)
{USART_SendData(USARTx, Data);while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);}void My_Usart_Send_Sting(USART_TypeDef* USARTx, char * str)
{uint16_t i=0;do{My_Usart_Send_Byte(USARTx, * (str+i));i++;}while(* (str+i) != '\0');while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);}int fputc(int ch, FILE * p)
{USART_SendData(USART1, (u8)ch );while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);return ch;}void USART1_IRQHandler()
{char str;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){str=USART_ReceiveData(USART1);printf("receive date: %c \r\n",str);if(str == '0'){GPIO_ResetBits(GPIOA,GPIO_Pin_1);printf("LED IS ON \r\n");}if(str == '1'){GPIO_SetBits(GPIOA,GPIO_Pin_1);printf("LED IS OFF \r\n");}USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}
usart.h
#ifndef USART_H_
#define USART_H_void my_usart_Init(void);
void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data);
void My_Usart_Send_Sting(USART_TypeDef* USARTx, char * str);#endif
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"
#include "usart.h"
#include "stdio.h"void delay(uint16_t time)//延时1ms 软件延时粗延时
{uint16_t i=0;while(time --){i=12000;while(i --);}}int main()
{my_usart_Init();LED_Init();// My_Usart_Send_Byte( USART1, 'A');
// My_Usart_Send_Byte( USART1, 'B');
// My_Usart_Send_Byte( USART1, 'C');// My_Usart_Send_Sting( USART1, "kobe \r\n");
// printf("kobe is king \r\n");while(1){
// USART_SendData( USART1, 'A');}}
代码心得
写串口中断void USART1_IRQHandler()去startup_stm32f10x_hd.s找到WEAK的弱定义