实现串口接收
库函数实现串口接收
软件流程设计
初始化系统
- 初始化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 TX
GPIOInitstruct.GPIO_Pin = GPIO_Pin_9;
GPIOInitstruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIOInitstruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIOInitstruct);
//A10 RX
GPIOInitstruct.GPIO_Pin =GPIO_Pin_10;
GPIOInitstruct.GPIO_Mode =GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIOInitstruct);
//´®¿Ú1
Usart_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); //清除串口接收数据寄存器非空中断标志位
}
}
实验结果