现象:stm32复位之后串口打印的第一个字节误码或者消失。
原因:误码多是由于端口初始化有问题。使用ST官方v3.5的标准库时,对串口输出端口进行了重复初始化。
如下代码:
/* PA[15:0] 设置为推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 串口TX端口PA9 设置为复用推挽输出 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
可以看到串口TX端口所在的PA9引脚被进行了两次初始化,这种情况会导致第一字节误码。
误码解决方案:上面的程序明显是为了偷懒用了GPIO_Pin_All,如果挨个写就没问题了。或者直接操作寄存器也是可以的。
第一字节消失的情况是怎么回事呢?先看数据手册
一般我们的串口查询方式的发送代码如下,包括ST官方例程里的printf串口打印的实现也是这样的代码。
{ USART_SendData(USART1, dat); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} }
结合上面的图和程序很容易发现问题。
‘TXE’和‘TC’ 标志位复位值都是‘1’。
那么当我们复位之后通过USART_SendData函数向USART_DR寄存器写入第一个字节,然后通过while查询TC标志的时候,因为TC初始值是‘1’,所以直接就跳出了while,哪怕此时串口并没有开始发送!第一字节就是这样被跳过去了。。
第一字节消失的解决方案:调用USART_SendData函数之前,先将‘TC’标志位清‘0’就OK,代码如下
{ USART_ClearFlag(USART1, USART_FLAG_TC); USART_SendData(USART1, dat); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} }
----------------------------------------------------------------printf-----------------------------------------------------------------
在keil中使用printf函数,ST官方有例程,需要在main.c中添加如下代码:
#include <stdio.h> #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ /** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_ClearFlag(USART1, USART_FLAG_TC); USART_SendData(USART1, (uint8_t) ch); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; }
注意:还需要在设置中添加MicroLib才能够正常使用printf函数!!!如下图
相关推荐
STM32F4应用笔记1灵致开发板串口FATFS调试.pdf
本文介绍了自己在学习RT-Thread操作系统时,移植操作系统后,添加串口外设的一些总结和调试笔记。操作系统:RT-Thread;芯片:stm32f407vet6.
此外,还有STM32CubeIDE集成开发环境,集成了编译器、调试器和仿真器支持。 软件库:STM32Cube软件包包含HAL(硬件抽象层)库和LL(低层)库,前者提供跨平台、跨系列的统一API接口,后者直接面向寄存器提供高效...
这一篇来说说STM32的串口通信功能,可以说串口通信是每个工程师在开发过程中第一或者第二个进行调试的程序(第一个可能是点灯,固定时间闪烁的那种),因为作为一种通信手段,单片机可以输出一些必要的信息,为调试...
STM32_USB_HID_学习心得:基于STM32 的USB程序开发笔记、修改STM32的USB例程为自己所用、初涉USB,初学者USB入门总结——枚举。 STM32_固件库说明文档:STM32_USB_Demo例子的中文说明文档。 STM32F107 鼠标USB改 HID...
程序功能是把ADC1模块里通道14的输入电压转换后通过USART2发送到PC,在PC机上用串口调试助手观察接收数据: STM32是12位ADC,测量结果基本还可以!程序用了DMA来传输ADC...串口部分用是上一篇串口调试笔记里的代码。
ComMagic 是一款让您爱不释手的工具软件,串口调试 + 常用MCU设 备ISP上载软件, 使用完全免费! 本软件可以在Win95/98、Win2000、 WinNT、WinXP、Vista下面运行.软件功能主要为: 1.接收从串口进来的数据并在窗口显示...
3、代码使用KEIL开发,当前在STM32F103C8T6运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 4、软件下载时,请注意keil选择项是jtag还是stlink. 5、软、硬件技术服务:...
客户调试 STM32WLE5JB 样机的时候遇到这样一个问题:在调试 LPUART,不打开外 部时钟的时候,能够正常打印,若开启外部的 HSE 和 LSE 后就没有打印。
这两天一直在调试用普通IO口来承担串口的角色,再次做个笔记。当然广泛参考广大网友的代码在此感谢网友。首先串口的最最最基本的数据格式是由10位数据组成,注意是最最最基本的当然要有些带各种校验的那些暂时不考虑...
论文首先讨论了基ARMCortex- M3的嵌入式开发技术,介绍了WiFi网络的发展现状及前景,利用STM32F103VCT6串口连接 WiFi模块,介绍了UCGUI在STM32平台上的移植,最后,在此基础上进行基于uC/GUI的多 窗口应用界面的设计...
文档中包含了串口的基础知识讲解(图示加笔记),并添加了串口的应用代码和PWM的代码示例,代码编写的平台是在keil5,使用的开发板是STM32进行测试
本应用笔记描述了如何使用 RT-Thread 的串口设备,包括串口配置、设备操作接口的应用。并给出了在正点原子 STM32F4 探索 者开发板上验证的代码示例。
3、建立一个STM32的工程,为方便调试,我们应重载printf()底层函数实现串口打印输出。可以参考已经建立好的printf()打印输出工程:https://www.viewtool.com/bbs/foru ... d=77&extra=page=1(或者“相关附件”...
其中STM32做客户端,在华为云服务器上开的网络调试助手(具有固定IP端口)做服务器,esp8266的作用是将串口数据透传到网络上,是客户端的一部分。 STM32与esp8266通讯采用串口通讯,应用层协议使用AT指令集,STM32做...
使用串口接收不定长数据时,可以有多种方法,比如最常见的有额外使能一个定时器,在超过定时范围未收到后续的字节时,认为此帧结束;或者利用 IDLE 中断,当数据空闲时,自动产生中断;亦或每接收到一个字节后都通过...
STM32_USB_HID_学习心得:基于STM32 的USB程序开发笔记、修改STM32的USB例程为自己所用、初涉USB,初学者USB入门总结——枚举。 STM32_固件库说明文档:STM32_USB_Demo例子的中文说明文档。 STM32F107 鼠标USB改 HID...
我们在调试的时候,经常会需要使用到printf指令,通过串口调试工具来查看变量的值,如果是单步或在线调试时,就需要连接JLINK和串口线,对于笔记本,现在都是需要USB转串口,使用起来比较麻烦。
(4)创建一个热点,名称和密码都与(1)的步骤相同,让ESP32的wifi能连上,我就用笔记本电脑创建了一个热点,然后打开串口Arduino监视器或者打开一个串口调试助手,打开电脑与CH340链接的串口,拔掉cam模块中IO0与...