OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5421|回复: 6

STM32串口的学习心得学习笔记.1

[复制链接]

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-12-27
在线时间
0 小时
发表于 2014-7-29 01:51:26 | 显示全部楼层 |阅读模式
本人也是新手,下面是学习串口过程中自己的一点认识,与君共享。

STM32的串口有很多值得关注的地方。

 

TEXTC标志位的概念:

TEXTransmit data register empty)发送数据寄存器非空标志位

TCTransmission complete)发送完成标志位

两个标志关系很密切同时又有很大的差别,串口发送需要两个寄存器,我们可以“看见”操作的是影子寄存器——即Data Register(数据寄存器),实际用来发射和接收的是移位寄存器,Shift Register(移位寄存器)我们无法直接操作。当数据发送的时候,我们把要操作的数写进了Data Register,在串口发送使能的情况下,单片机内部会将数据整体放进Shift Register(并行传输,8位数同时进入),此时数据寄存器为空,从而TEX被置1。随后Shift Register将数据以特定的波特率串行输出,当最后一位也输出完成之后,发送过程结束,从而TC位置1,这样就完成了一个字节数据的传送。

以上理解以后,发送一个字符串就有了两种方法:判断TEX置位和判断TC置位。

判断TEX置位,程序如下:

void USART_SendString(char *str)

{

         while(*str)

         {

                   USART_SendData(COM_USART,*str);

                   while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

                            str++;       //str的地址增加1,到下一个字符

         }

}

判断TC位,程序如下:

void USART_SendString(char *str)

{

         while(*str)

         {

                   USART_SendData(COM_USART,*str);

                   while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

                            str++;       //str的地址增加1,到下一个字符

         }

}

至于什么时候使用哪个标志,需要根据你的需要自己决定。但我认为TXE允许程序有更充裕的时间填写TDR寄存器,保证发送的数据流不间断。TC可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序。(此段摘自网上)

 

关于第一个数据发送失败的问题

请注意:在当USART被使能的时候,单片机自身会自动一个Idle preamble,也就是一个全为1的字符。发送完成之后,TXE = 1TC = 1。如果这时发送字符串使用的是判断TC置位的方法的话,程序第一次while没有等待,立即循环执行第二次的USART_SendData(COM_USART,*str);程序,第一个数据来不及发送出去就被第二个数据覆盖,造成丢失。解决的方法是在USART_Cmd(USART1,ENABLE)之后加上两行:

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//空帧发送完毕

USART_ClearFlag USART1,USART_FLAG_TC);//清除TC标志位

这样第一个数据就能正常发送了。当然,如果发送字符串使用的是判断TEX置位的方法,就不会出现丢失首自己的现象。因为把数据写入Data Register后,必须等待直到数据被送到Shift Register才能继续往后执行。



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-29 08:18:07 | 显示全部楼层
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-29 10:44:41 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-7-29 11:25:40 | 显示全部楼层
谢谢楼主分享。。。
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

6

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-5-20
在线时间
2 小时
发表于 2014-7-29 17:50:17 | 显示全部楼层
楼主也是喜欢寄存器操作?
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-12-27
在线时间
0 小时
 楼主| 发表于 2014-7-29 23:41:51 | 显示全部楼层
回复【5楼】小达人:
---------------------------------
平常开发都用库函数,只不过喜欢刨根问底
回复 支持 反对

使用道具 举报

15

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2014-3-2
在线时间
2 小时
发表于 2014-7-30 21:23:11 | 显示全部楼层
回复【6楼】紫宸:
---------------------------------
问一下,这句话什么意思?
     在当USART被使能的时候,单片机自身会自动一个Idle preamble,也就是一个全为1的字符
1369813157  衣冠民
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 16:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表