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
}
}
}
|