串口,可以理解为是用来和上位机(比如电脑)对话的,本节实验实现的是stm32接收上位机发送过来的信息,在原原本本的返回过去
stm32有5路串口,本节学习的是其中之一的USB串口(USART1)和学习IO口一样,首先要配置串口,由于原子已经配好了写在sys文件里,本渣就本着不造轮子的理念(其实是太难不懂orz),先跳过去了。。
所以本工程只需要一个main函数即可
#include "led.h" #include "sys.h" #include "delay.h" #include "usart.h" void init(void) { delay_init(); LED_Init(); NVIC_Configuration();//设置中断分组 uart_init(9600);//串口初始化,波特率9600 } int main(void) { u8 i,len; u16 times=0; init(); while(1) { if(USART_RX_STA&0X8000)//接收到了数据 { len=USART_RX_STA&0xfff //printf("\r\n泥发送的消息为:\r\n"); for(i=0;i<len;i++) { USART1->DR=USART_RX_BUF[i]; while((USART1->SR&0X40)==0);//等待发送结束 } printf("\r\n\r\n"); USART_RX_STA=0; } else//不接收数据时 { ++times; if(times%5000==0)printf("\r\nlove\r\n"); if(times%30==0)LED0=!LED0; delay_ms(10); } } }
可能上面的代码有点看不懂,我们翻到usart.c 里面有这么一段代码
//串口1中断服务程序 //注意,读取USARTx->SR能避免莫名其妙的错误 u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 u16 USART_RX_STA=0; //接收状态标记
0x8000对应的2进制 100000000000000
0x3fff 对应的2进制 0011111111111111
这样就很明显了。。(感觉离底层越来越远了)
将程序烧进去之后打开串口调试助手 界面显示如下:
还会看到LED一直闪烁。。说明程序应该没问题
时间: 2024-09-30 05:45:22