这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【分享评测,赢取加热台】NUCLEO-64STM32F103RBEVALBRD实

共3条 1/1 1 跳转至

【分享评测,赢取加热台】NUCLEO-64STM32F103RBEVALBRD实现寄存器的串口输出

菜鸟
2025-01-17 18:43:56     打赏

本帖子使用了 stm32f103rbt6 mcu 。

使用了配置寄存器方式实现了串口输出。

以下是寄存器的几个重要的点讲解。

涉及到关键的外设有:rcc gpio uart。

0 原理图

使用stlink的虚拟串口实现uart的数据读写,省一个串口模块

如下图

image.png

实际使用的引脚为pa2-tx pa3-rx。image.png

外设使用的uart2,如下图

image.png

如上,硬件上就一目了然,可以进行寄存器配置了。

1 rcc寄存器

配置的内容,开启gpioa时钟,uart2的时钟。

由于uart2外设挂在apb1总线,所以需要不要调整apb1总线的时钟。

如下,因为基于原子的代码修正apb1的分频,导致实际上波特率成了配置的一半,这里消耗了一下午才定位并解决。

image.png

    我们的时钟线如下

image.png

如下进行对uart2的配置,配置了波特率,开启了中断,主要用于接收数据的服务。

image.png

代码,对于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);   
		}
	}		

效果如下:

EB6B83FF-33F9-462c-BF4D-AB638F7BA912.png

代码:

sout.zip













院士
2025-01-19 08:35:50     打赏
2楼

基于寄存器的方式可以加速程序的运行。

楼主这寄存器是不是有点纯了,有点不利于阅读与code review了


助工
2025-02-14 17:16:06     打赏
3楼

image.png

从楼主的代码中看到,代码与输出的实际不相符


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]