本帖子使用了 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);
}
} 效果如下:

代码:

我要赚赏金
