本帖子使用了 stm32f103rbt6 mcu 。
使用了配置寄存器方式实现了串口输出。
以下是寄存器的几个重要的点讲解。
涉及到关键的外设有:rcc gpio uart。
0 原理图
使用stlink的虚拟串口实现uart的数据读写,省一个串口模块
如下图
实际使用的引脚为pa2-tx pa3-rx。
外设使用的uart2,如下图
如上,硬件上就一目了然,可以进行寄存器配置了。
1 rcc寄存器
配置的内容,开启gpioa时钟,uart2的时钟。
由于uart2外设挂在apb1总线,所以需要不要调整apb1总线的时钟。
如下,因为基于原子的代码修正apb1的分频,导致实际上波特率成了配置的一半,这里消耗了一下午才定位并解决。
我们的时钟线如下
如下进行对uart2的配置,配置了波特率,开启了中断,主要用于接收数据的服务。
代码,对于uart数据的发送和接收,如过接收到数据后,原封不动的发送回去。
while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度 printf("\r\n you send data is:len[%d]\r\n\r\n",len); for(t=0;t<len;t++) { USART2->DR=USART_RX_BUF[t]; while((USART2->SR&0X40)==0);//等待发送结束 } printf(" ----123\r\n\r\n");//插入换行 USART_RX_STA=0; }else { times++; if(times%5000==0) { printf("\r\n 3333\r\n"); printf("正点原子@ALIENTEK\r\n\r\n"); } if(times%200==0)printf("end----\r\n"); if(times%30==0)LED01=!LED01;//闪烁LED,提示系统正在运行. delay_ms(10); } }
效果如下:
代码: