[其他ST产品] 串口相关配置寄存器、库函数(UART一般步骤)

[复制链接]
3491|32
 楼主| 4c1l 发表于 2023-9-25 18:57 | 显示全部楼层
由于res是一个u8类型的数,若一次性向串口发送很多的数据,串口使用此程序进行接收的时候,一个u8很多装不下。而这个函数中使用的是if判断,如果一次装不下,if判断程序就走一遍,怎么把所有的数据全部接受呢?

解答:其实我们看一下RXNE标志位引发的中断,当RDR移位寄存器中的数据被转移到USART_DR寄存器中时,也就是有数据可以被接收到的时候,该位置1,引发中断,进入中断处理函数。但是我们在这个中断处理函数中,并没有和其他中断一样做清除中断位的操作,这就导致该位一直是1,不断地进入中断。那么什么时候停止呢?当数据接收完毕了,此时该位清零。
 楼主| 4c1l 发表于 2023-9-25 18:58 | 显示全部楼层
printf函数
printf函数支持的代码在SYSTEM文件夹下的usart.c文件中定义了,加入下面的代码就可以通过printf函数向串口发送需要的内容。这段代码不需要修改,只要引入到usart.h即可使用。

  1. #if 1
  2. #pragma import(__use_no_semihosting)            
  3. //标准库需要的支持函数                 
  4. struct __FILE
  5. {
  6.         int handle;

  7. };

  8. FILE __stdout;      
  9. //定义_sys_exit()以避免使用半主机模式   
  10. _sys_exit(int x)
  11. {
  12.         x = x;
  13. }
  14. //重定义fputc函数
  15. int fputc(int ch, FILE *f)
  16. {      
  17.         while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
  18.     USART1->DR = (u8) ch;      
  19.         return ch;
  20. }
  21. #endif
 楼主| 4c1l 发表于 2023-9-25 18:58 | 显示全部楼层
整个代码块比较奇怪,重定义了fputc函数之后,也并没有printf函数的显示声明,这样就可以向串口发送内容了。
Bblythe 发表于 2024-2-21 07:07 | 显示全部楼层

超出 120 个字节则必须用 idata 显式的指定为间接寻址
周半梅 发表于 2024-2-21 09:03 | 显示全部楼层

靠近功率开关管或整流器的电容分到的纹波电流远多于相距较远的电容分到的纹波电流
Pulitzer 发表于 2024-2-21 10:06 | 显示全部楼层

small 模式下未指存储类型的变量默认为data型
童雨竹 发表于 2024-2-21 12:02 | 显示全部楼层

离线式变换器
Wordsworth 发表于 2024-2-21 13:05 | 显示全部楼层

一般要进行内存优化,尽量提高内存的使用效率
Clyde011 发表于 2024-2-21 14:08 | 显示全部楼层

让尽可能多的变量使用直接寻址,提高速度
公羊子丹 发表于 2024-2-21 15:01 | 显示全部楼层

经变压器映射成这么多节点
万图 发表于 2024-2-21 16:04 | 显示全部楼层

访问时采用不同的指令,所以并不会占用 RAM 空间
Uriah 发表于 2024-2-21 17:07 | 显示全部楼层

极限情况下可以定义的变量可占 247 个字节
帛灿灿 发表于 2024-2-21 19:03 | 显示全部楼层

51 单片机不使用线性编址
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部