本文分为两部分,即”以USART1为例的串口初始化”和“调试中遇到的问题”
以USART1为例的串口初始化
本程序调用了stm32自带的固件库,工程中具体的文件见下图:

一.GPIO及USART1初始化结构体变量定义
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
二.串口时钟及GPIO端口时钟使能
USART1是挂在APB2总线上的外设。
TX,RX分别是PA9,PA10端口的复用。

要使用到端口复用,就要使能端口的时钟,并使能相应外设的时钟。这里可使用|同时使能这两个时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
三.TX,RX配置
GPIO端口模式的配置包括
确定需要配置的引脚
确定端口速度
确定端口工作模式
初始化该引脚
//USART1 Tx(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);
//USART1 Rx(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);
四.串口参数初始化
以下为默认的参数:
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);//初始化USART1
USART_Cmd(USART1, ENABLE); //USART1使能
至此,串口相关的配置已全部完成,接下来可以写串口程序了。
五.串口程序
这里以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);//等待数据发送完
关于两次等待的说明:
RXNE和TC都是寄存器USART_SR中的位。当寄存器收到消息后,RXNE会置1,此时读取消息可令其清零。当数据发送完成后,TC会置1,此时读取状态可令其清零。
例2.stm32向PC发一个字符串
字符串内容如下:
#define SENDBUF_LEN 23
unsigned char order[SENDBUF_LEN]="0 1 06 1111/1 1 05 2121";
发送程序如下:
for(i=0;i USART1->SR;//防止首字符丢失 USART_SendData(USART1,order[i]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } 关于USART1->SR作用的解释: stm32在复位时TC位被置1,因此while语句中的内容直接成立,while语句直接跳出,第一个字符还没发送完,寄存器就发送了第二个字符,导致第一个字符被掩盖。解决方法是在发送前先将TC为清零,方法是读USART->SR。由此可知,在发字符串时,一定要先读一次USART->SR,而例1中发一个字符时就不必要了,因为不会有第二个字符来覆盖第一个字符。 调试中遇到的问题 无论PC发什么,stm32都没有回应。调试过程:我把初始化的程序与网上众多程序员写的初始化程序做了比较,没有发现不一样的地方。接着我就怀疑USART_SendData(USART1,order)这句代码中的order的数据类型有问题。这个函数的定义如下: void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) { /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_DATA(Data)); /* Transmit Data */ USARTx->DR = (Data & (uint16_t)0x01FF); } 可知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,发现了问题——那就是之前提到的首字符丢失问题。
上一篇:RTC--根据年月日计算[星期]的函数
下一篇:STM32 PA6引脚输出低电平不正常的问题
推荐阅读
史海拾趣
在作为Cirrus Logic分公司运营了五年后,Apex Microtechnology于2012年重新回归独立私营状态。这次变革使得Apex Microtechnology能够更加灵活地应对市场变化,加速产品创新和研发。同时,公司也扩大了其业务范围,进一步巩固了在电子行业的地位。
进入21世纪后,GSI Technology继续加大研发投入,不仅巩固了其在SRAM领域的领先地位,还成功扩展了产品线,包括同步突发SRAM、无总线周转SRAM等。同时,公司还推出了SigmaRAM、SigmaQuad、SigmaQuad II等系列产品,这些产品以其卓越的性能、高可靠性和低功耗特性,赢得了市场的广泛认可。此外,GSI还致力于提供超长产品支持生命周期和完整的售前售后服务,进一步增强了客户粘性。
背景:随着技术的成熟,Galaxy Microelectronics开始寻求与大型电子产品制造商的合作。
发展:2005年,Galaxy Microelectronics与一家领先的智能手机制造商达成合作协议,为其旗舰产品提供定制化的NAND闪存解决方案。这一合作不仅让Galaxy Microelectronics的产品迅速进入市场,还显著提升了其品牌知名度。随后,公司陆续与多家知名电子产品厂商建立合作关系,进一步巩固了其在闪存市场的地位。
CCC深知产品质量对于企业生存和发展的重要性。因此,公司始终将质量管理放在首位,建立了严格的质量检测体系和售后服务体系。从原材料采购到产品生产、再到售后服务,CCC都严格按照质量标准进行操作,确保每一件产品都符合客户的要求。这种对质量的执着追求让CCC赢得了客户的信赖和口碑相传。
随着市场的不断变化和客户需求的多样化,奇力新开始拓展产品线,推出了更多类型的电感器产品。这些产品不仅涵盖了传统领域,还涉及到了新能源汽车、工业控制等新兴市场。为了保持市场竞争优势,奇力新不断加大研发投入,提升产品质量和性能。通过不断的市场推广和客户服务,奇力新逐渐赢得了客户的信任和市场的认可。
|
EAGLE官方网站发布中文版本了,安装后的手册和用户指南也是中文的,终于不用看让人头大的英文了。 这次出的是中文Beta版,下载地址http://www.cadsoft.de/betatest.htm。… 查看全部问答∨ |
|
|
请问下有人遇到过在对ENC28J60进行读写的时候,发现用同样的代码,地址正确,却只能够对ETH寄存器正确读写,而MAC寄存器和MII寄存器却不能正确读写? 有人遇到过吗? 希望得到高手提醒,谢谢!… 查看全部问答∨ |
|
|
急急急!!谁有物联网应用的具体实例,要具体的有每个流程的操作过程 谁有物联网应用的具体实例,要具体的有每个流程的操作过程和具体叙述内容的,分不多 只有200分。。 在线等 谢谢了 。 QQ:504648743… 查看全部问答∨ |
MODEL MR821 D ( + IS = 5.989e-09 + RS = 0.00477 + CJO = 1.139e-10 + VJ = 0.7174 + TT = 3.25e-08 + M = 0.2698 + BV = 100 + N = 2 + EG = 1.11 + XTI = 3 + KF = 0 + AF = 1 + FC = 0.5 + IBV = 0.0001 + TNOM ...… 查看全部问答∨ |
|
用FPGA控制RTL8019AS实现与PC机的以太网通信问题 最近一直在看RTL8019AS芯片的相关知识,网上有很多用单片机控制的资料,但是用FPGA的较少,我想原理应该都差不多吧。目前主要有以下几个问题: 1、RTL8019AS可以接收PC机发送的UDP数据包吗?还是只能接收以太网数据帧格式的数据包? ...… 查看全部问答∨ |
|
|
LM3S9B96的两个CAN模块能同时配置吗,通过其CAN接口再与外部接口卡连接? 这样是不是就构成了两个节点? 每个模块又具有32个报文对象,这个报文对象一次又能配置几个呢? 节点的数据是报文对象的数目还是集成的CAN模块的数目? [ 本帖最后由 喜 ...… 查看全部问答∨ |



XC6406PP60DL






京公网安备 11010802033920号