当前位置:首页 > 单片机 > 单片机
[导读]本文分为两部分,即”以USART1为例的串口初始化”和“调试中遇到的问题”以USART1为例的串口初始化本程序调用了stm32自带的固件库,工程中具体的文件见下图:一.GPIO及USART1初始化结构体变量定义GPIO_InitTypeD

本文分为两部分,即”以USART1为例的串口初始化”和“调试中遇到的问题”

以USART1为例的串口初始化

本程序调用了stm32自带的固件库,工程中具体的文件见下图:

一.GPIO及USART1初始化结构体变量定义

GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;12

二.串口时钟及GPIO端口时钟使能
USART1是挂在APB2总线上的外设。
TX,RX分别是PA9,PA10端口的复用。

要使用到端口复用,就要使能端口的时钟,并使能相应外设的时钟。这里可使用|同时使能这两个时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA"RCC_APB2Periph_USART1,ENABLE);1

三.TX,RX配置
GPIO端口模式的配置包括

确定需要配置的引脚

确定端口速度

确定端口工作模式

初始化该引脚

//USART1Tx(PA.09)GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOA,&GPIO_InitStructure);//USART1Rx(PA.10)GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA,&GPIO_InitStructure);12345678910

四.串口参数初始化
以下为默认的参数:

USART_InitStructure.USART_BaudRate=9600;//波特率USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//收发模式USART_Init(USART1,&USART_InitStructure);//初始化USART1USART_Cmd(USART1,ENABLE);//USART1使能12345678

至此,串口相关的配置已全部完成,接下来可以写串口程序了。

五.串口程序
这里以stm32与PC通信为例。
例1.PC向stm32发送一个字符,stm32再将该字符发回去。

while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=SET);//等待PC的消息order=USART_ReceiveData(USART1);//读取收到的消息USART_SendData(USART1,order);//发送消息while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待数据发送完1234

关于两次等待的说明:
RXNE和TC都是寄存器USART_SR中的位。当寄存器收到消息后,RXNE会置1,此时读取消息可令其清零。当数据发送完成后,TC会置1,此时读取状态可令其清零。

例2.stm32向PC发一个字符串

字符串内容如下:

#defineSENDBUF_LEN23unsignedcharorder[SENDBUF_LEN]="01061111/11052121";123

发送程序如下:

for(i=0;iSR;//防止首字符丢失USART_SendData(USART1,order[i]);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);}123456

关于USART1->SR作用的解释:
stm32在复位时TC位被置1,因此while语句中的内容直接成立,while语句直接跳出,第一个字符还没发送完,寄存器就发送了第二个字符,导致第一个字符被掩盖。解决方法是在发送前先将TC为清零,方法是读USART->SR。由此可知,在发字符串时,一定要先读一次USART->SR,而例1中发一个字符时就不必要了,因为不会有第二个字符来覆盖第一个字符。


调试中遇到的问题

无论PC发什么,stm32都没有回应。调试过程:我把初始化的程序与网上众多程序员写的初始化程序做了比较,没有发现不一样的地方。接着我就怀疑USART_SendData(USART1,order)这句代码中的order的数据类型有问题。这个函数的定义如下:

voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData){/*Checktheparameters*/assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_USART_DATA(Data));/*TransmitData*/USARTx->DR=(Data&(uint16_t)0x01FF);}123456789

可知Data的数据类型是uint16_t,我就试着把order的数据类型分别改成了char,uint8_t,uint16_t,但问题仍无法解决(实际上,这个数据类型是没有任何影响的)。

值得一提的是,之前我们设置USART1的参数时,一次发送的数据长度设置的是8位USART_InitStructure.USART_WordLength = USART_WordLength_8b;,那么为什么这里写的却是16位的无符号整型呢?看这句话USARTx->DR = (Data & (uint16_t)0x01FF);,可知理论上发送的内容应该是Data的低9位。然而,由于之前设置了数据长度为8位,故实际发送的内容只有低8位。那么为什么Data会&0x01ff呢?其实这多余的一位是用于奇偶校验的,当需要配置奇偶校验时,需要将数据长度设置为9位即USART_InitStructure.USART_WordLength = USART_WordLength_9b;,记住,stm32的数据位是包括奇偶校验位的,而PC上调试助手上的数据位仍需设置为8位,这样互发数据才不会出问题。

回到之前的问题上来——更改完发现仍解决不了问题后,我在程序中加了一个LED闪烁程序,即接收数据之前LED亮,发送完数据后LED灭,结果发现LED始终是亮的。后改成LED先灭后亮,发现LED始终是灭的。故猜想程序卡死在了这两句程序之间,接着怀疑到函数delay_ms()上,接着发现这个由淘宝卖家提供的delay_ms()函数需要先初始化才能使用。(这个延时函数不是简单的for循环延时,比较复杂和精准,初始化函数为delay_init();)由于没有初始化,导致程序死在这条语句上。
2. stm32发回来的内容与PC发送的内容不一致。调试过程:用示波器观测数据,发现收发的数据都是正确的,但电平宽度不一致,由此得知两者的波特率不一致,进一步计算得知是stm32的串口波特率不对。后发现程序默认的外部高速时钟是8MHz,而我的板子上的晶振是11.0592MHz,故波特率计算错误。解决方法是更改头文件stm32f10x.h中的HSE_VAULE,见下图


需要说明的是,博主更改这里后仍不能接受到正确消息,当时我设置的波特率是1200,后来改成9600就正常了。博主没有去深入了解寄存器,只能猜想stm32应该不支持过低的波特率吧。
3.当stm32向c51发送字符串时,c51接收不到正确的数据。我用示波器看了下PC向c51发送的波形,又看了下stm32向c51发送的波形,发送数据所用时间差不多,所以波特率应该是对的,波形由于太长,每个脉冲太窄,不好观察,看起来也差不多。最后我让stm32把之前发的数据发给PC,发现了问题——那就是之前提到的首字符丢失问题。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭