发新帖我要提问
12
返回列表
打印
[其他ST产品]

串口相关配置寄存器、库函数(UART一般步骤)

[复制链接]
楼主: 4c1l
手机看帖
扫描二维码
随时随地手机跟帖
21
4c1l|  楼主 | 2023-9-25 18:57 | 只看该作者 回帖奖励 |倒序浏览
由于res是一个u8类型的数,若一次性向串口发送很多的数据,串口使用此程序进行接收的时候,一个u8很多装不下。而这个函数中使用的是if判断,如果一次装不下,if判断程序就走一遍,怎么把所有的数据全部接受呢?

解答:其实我们看一下RXNE标志位引发的中断,当RDR移位寄存器中的数据被转移到USART_DR寄存器中时,也就是有数据可以被接收到的时候,该位置1,引发中断,进入中断处理函数。但是我们在这个中断处理函数中,并没有和其他中断一样做清除中断位的操作,这就导致该位一直是1,不断地进入中断。那么什么时候停止呢?当数据接收完毕了,此时该位清零。

使用特权

评论回复
22
4c1l|  楼主 | 2023-9-25 18:58 | 只看该作者
printf函数
printf函数支持的代码在SYSTEM文件夹下的usart.c文件中定义了,加入下面的代码就可以通过printf函数向串口发送需要的内容。这段代码不需要修改,只要引入到usart.h即可使用。

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

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif

使用特权

评论回复
23
4c1l|  楼主 | 2023-9-25 18:58 | 只看该作者
整个代码块比较奇怪,重定义了fputc函数之后,也并没有printf函数的显示声明,这样就可以向串口发送内容了。

使用特权

评论回复
24
Bblythe| | 2024-2-21 07:07 | 只看该作者

超出 120 个字节则必须用 idata 显式的指定为间接寻址

使用特权

评论回复
25
周半梅| | 2024-2-21 09:03 | 只看该作者

靠近功率开关管或整流器的电容分到的纹波电流远多于相距较远的电容分到的纹波电流

使用特权

评论回复
26
Pulitzer| | 2024-2-21 10:06 | 只看该作者

small 模式下未指存储类型的变量默认为data型

使用特权

评论回复
27
童雨竹| | 2024-2-21 12:02 | 只看该作者

离线式变换器

使用特权

评论回复
28
Wordsworth| | 2024-2-21 13:05 | 只看该作者

一般要进行内存优化,尽量提高内存的使用效率

使用特权

评论回复
29
Clyde011| | 2024-2-21 14:08 | 只看该作者

让尽可能多的变量使用直接寻址,提高速度

使用特权

评论回复
30
公羊子丹| | 2024-2-21 15:01 | 只看该作者

经变压器映射成这么多节点

使用特权

评论回复
31
万图| | 2024-2-21 16:04 | 只看该作者

访问时采用不同的指令,所以并不会占用 RAM 空间

使用特权

评论回复
32
Uriah| | 2024-2-21 17:07 | 只看该作者

极限情况下可以定义的变量可占 247 个字节

使用特权

评论回复
33
帛灿灿| | 2024-2-21 19:03 | 只看该作者

51 单片机不使用线性编址

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则