嵌入式STM32学习——串口USART 2.2(串口中断接收)
实现串口接收
库函数实现串口接收
软件流程设计
初始化系统
- 初始化GPIO、串口外设、LED时钟
- 初始化串口和LED引脚
串口发送控制LED灯
usart.c
#include"stm32f10x.h"
#include"usart.h"
#include "stdio.h"void my_usart_init(void)
{GPIO_InitTypeDef GPIOInitstruct;USART_InitTypeDef Usart_initstruct;NVIC_InitTypeDef NVIC_Usart_Initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);//A9 TXGPIOInitstruct.GPIO_Pin = GPIO_Pin_9;GPIOInitstruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIOInitstruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIOInitstruct);//A10 RXGPIOInitstruct.GPIO_Pin =GPIO_Pin_10;GPIOInitstruct.GPIO_Mode =GPIO_Mode_IPU;GPIO_Init(GPIOA,&GPIOInitstruct);//´®¿Ú1Usart_initstruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //ģʽ Usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //Ó²¼þ¿ØÖÆÁ÷¹¦ÄÜ£¬Í¨¹ý¶îÍâµÄÐźÅÏߣ¨RTS/CTS£©À´Ðµ÷Êý¾Ý´«Ê䣬·ÀÖ¹Êý¾ÝÒç³öUsart_initstruct.USART_BaudRate = 115200; //²¨ÌØÂÊUsart_initstruct.USART_Parity = USART_Parity_No; //УÑéλUsart_initstruct.USART_StopBits = USART_StopBits_1; //ֹͣλUsart_initstruct.USART_WordLength = USART_WordLength_8b; //Êý¾ÝλUSART_Init(USART1,&Usart_initstruct);USART_Cmd(USART1,ENABLE); //ʹÄÜ´®¿ÚÍâÉèNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC分组USART_ITConfig( USART1, USART_IT_RXNE, ENABLE); //中断线,检查串口接收缓冲区是否有数据NVIC_Usart_Initstruct.NVIC_IRQChannel = USART1_IRQn;NVIC_Usart_Initstruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_Usart_Initstruct.NVIC_IRQChannelSubPriority = 0;NVIC_Usart_Initstruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_Usart_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 * string)
{uint16_t i=0;do{My_Usart_Send_Byte(USARTx,*(string+i));i++;}while(*(string+i) != '\0');while( USART_GetFlagStatus( USARTx, USART_FLAG_TC) == RESET);
}int fputc(int ch, FILE * p) //printfÖØ¶¨Òå
{USART_SendData(USART1, (u8)ch);while( USART_GetFlagStatus( USART1, USART_FLAG_TXE) == RESET);return ch;
}
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "shake.h"
#include "usart.h"
#include "stdio.h"
void delay(uint16_t time)
{uint16_t i=0;while(time--){i =12000;while(i--);}}int main()
{my_usart_init();
// My_Usart_Send_Byte( USART1, 'A');
// My_Usart_Send_Byte( USART1, 'B');
// My_Usart_Send_Byte( USART1, 'C');
// My_Usart_Send_Sting( USART1, "\r\n");
// My_Usart_Send_Sting(USART1 , "fei \r\n");printf("Hello,shi \r\n");while(1){}
}void EXTI0_IRQHandler() //中断函数
{if(EXTI_GetITStatus(EXTI_Line0) != RESET){GPIO_ResetBits(GPIOA,GPIO_Pin_1);EXTI_ClearITPendingBit(EXTI_Line0); //Çå³ýÍⲿÖжϱê־룬ҪÓëEXTI_GetITStatus´îÅäʹÓÃ}
}void USART1_IRQHandler()
{char receive_data;if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)//获取中断标志位,检查接收接收数据寄存器非空{receive_data = USART_ReceiveData(USART1); //获取接收数据printf("receive data: %c \r\n", receive_data); //输出接收数据并输出USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除串口接收数据寄存器非空中断标志位}}
实验结果