6.2 串口通信程序精讲
- #include "stm32f4xx.h"
- #include "delay.h"
- #include "LED.h"
- #include "BEEP.h"
- #include "Key.h"
- #include "usart.h"
-
- int main(void)
- {
- unsigned char t,len;//定义最大接收的字节数
- unsigned int times=0;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统的中断优先级分组2
- delay_init(168);//初始化延迟函数
- uart_init(115200);//串口初始化波特率设置为115200
- LED_Init();//LED初始化
- LED0=0;//默认程序输入时LED0点亮
- while(1)
- {
- if(USART_RX_STA&0x8000)//USART_RX_STA接收状态标记 USART_RX_STA&0x8000如果为真,则表示最高位为1,也就是bit15接收完成标志
- //bit15:接收完成标志 bit14:接收到0x0D标志 bit13-0:接收到的有效数据个数
- //程序要求,发送的字符是以回车换行结束(0x0D,0x0A)
- //0x0D是回车的ASCII码
- {
- len=USART_RX_STA&0x3FFF;
- //因为USART_RX_STA是16位,第16位和第15位是判断是否接收完成和停止的标志位,0-14位是数据位
- //USART_RX_STA&0x3FFF是USART_RX_STA&0011 1111 1111 1111把数据位全部拿出来
- printf("\r\n您发送的消息为:\r\n");//打印您发送的消息为:不断发送到串口
- for(t=0;t<len;t++)//串口通信是串行通信,需要一位一位的传
- {
- USART1->DR=USART_RX_BUF[t];//接收缓冲,最大USART_REC_LEN个字节,末字节为换行符
- //串口接收到的数据保存在USART_RX_BUF中,t是接收到的字节数
- //将接收到的数据保存在DR数据寄存器中
- while((USART1->SR&0x40)==0);//SR是状态寄存器,状态寄存器的最高位如果是0,表示数据传输完成,可以执行下一步
- }
- printf("\r\n\r\n");//打印换行
- USART_RX_STA=0;//状态标志位置0,表示本次传输完成,可以执行下一次的传输了
- }
- else//最高位不是1,数据还没有接收完成,继续接收,传至数据位
- {
- times++;//设置一个时间位,时间++,类似于定时器中断的T0Count;
- if(times%5000==0)//每过5s,打印一次下述程序
- {
- printf("\r\nALIENTEK 探索者 STM32F407开发板 串口实验\r\n");
- printf("正点原子@ALIENTEK\r\n\r\n\r\n");
- }
- if(times%200==0)//每过200ms,打印一次:请输入数据,以回车键结束
- printf("请输入数据,以回车键结束\r\n");
- if(times%30==0)//每过30ms,LED0闪烁
- LED0=!LED0;
- delay_ms(10);//延迟10ms
- }
- }
- }
|