现象: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函数!!!如下图
相关推荐
通过“STM32自学笔记”这样的资料,你可以系统地学习STM32的基础知识和实践技巧,逐步掌握单片机开发的全貌。在实践中,不断实验和调试,加深对外设的理解,是提升技能的关键。同时,参与社区交流,参考他人的项目,...
此外,对于不同型号的STM32,进入下载模式和具体的串口配置可能会有所不同,因此在实际操作前应查阅对应芯片的数据手册和应用笔记。 此压缩包中的"stm32单片机通过串口更新程序工具(附操作说明)"文件可能包含更详细...
2. **STM32的外设**:STM32集成了众多外设,如GPIO、定时器、串口、ADC、DAC、SPI、I2C、USB、CAN等。应用笔记会详细介绍如何配置和使用这些外设,以便实现通信、数据采集、控制等功能。 3. **HAL库与LL库**:STM32...
7. **调试与测试**:完成以上步骤后,需要通过USB连接器将STM32F1设备连接到电脑,并使用串口终端软件进行测试。通过发送和接收数据,确认USB虚拟串口功能是否正常工作。 在"USB虚拟串口"这个压缩包中,可能包含的...
5. **串口通信**:UART、SPI、I2C是常见的串行通信协议,STM32支持这些协议,用于芯片间的数据交换。 6. **ADC转换**:STM32的模拟数字转换器(ADC)用于将模拟信号转换为数字信号,是处理传感器数据的关键。 7. *...
本资源“STM32自学笔记 随书资料”是一份全面的学习STM32开发的参考资料,旨在帮助初学者快速入门并深入理解STM32的工作原理和编程技巧。 一、STM32架构与特性 STM32系列涵盖了多种型号,主要基于Cortex-M0、M3、M4...
10. **调试与仿真**:介绍如何利用STM32CubeMX设置调试选项,配合硬件调试器进行程序调试。 11. **系统设置与功耗优化**:讲解系统设置中的电源管理模式,如何进行低功耗设计,以及在STM32CubeMX中实现功耗优化。 ...
本文主要根据提供的“stm32F1读书笔记.zip”资料,围绕STM32F1的手册摘要、主要特性以及常见应用进行详述。 首先,STM32F1系列是STM32家族的一员,其核心为32位Cortex-M3处理器,运行速度高达72MHz,提供了强大的...
1. 简易调试器:这种调试器集成了STM32调试器和DEMO板,提供USB连接、复位、指示灯、JTAG接口、按键、LED以及串口等基本功能。 2. 学习目标:采用STM32F103C8T6作为学习芯片,而目标是STM32F103CBT6和STM32F103RET6...
7. **项目实例**:笔记可能会包含一些实际的项目示例,如LED闪烁、串口通信、ADC采集、PWM输出等,通过这些实例帮助读者更好地理解和掌握STM32的编程实践。 8. **Bootloader开发**:高级话题可能涉及到STM32的...
- 了解并运用STM32内置的调试工具,如串口打印、GPIO状态指示等,辅助问题定位。 10. **实例分析** - 通过具体的应用案例,如LED闪烁、温湿度传感器读取、无线模块通信等,深入理解STM32在实际项目中的应用。 ...
3. **连接串口**:使用串口线连接STM32的串口通信引脚到PC或其他编程设备。 4. **执行下载**:启动编程软件,选择正确的波特率和端口,然后发送编译好的二进制文件至STM32。 5. **复位STM32**:下载完成后,释放BOOT...
STM32F4 应用笔记 1 灵致开发板串口 FATFS 调试 本文档主要介绍了 STM32F4 系列开发板串口 FATFS 文件系统调试的相关信息,包括开发板串口功能使用简介、STM32F429 开发板串口使用注意事项、FATFS 简介、开发板 ...
- 使用串口调试助手查看发送和接收的数据,以便于定位问题。 - 使用断点和单步执行功能在IDE中调试代码。 - 检查GPIO配置,确保TX和RX引脚正确复用为UART功能。 - 查看USART的状态寄存器,确认是否有错误发生。 ...
在本篇STM32学习笔记中,我们将深入探讨如何利用STM32F103ZET6开发板上的串口通信功能。串口通信是一种在嵌入式系统中广泛使用的通信方式,尤其在单片机(如STM32)与PC或其他微控制器之间交换数据时。本文将基于STM...
### STM32学习笔记知识点概览 #### 一、STM32选择原因分析 STM32作为基于ARM Cortex-M3内核的微控制器,凭借其卓越的性能、丰富的外设资源以及良好的性价比,成为了众多工程师的首选。SW笨笨在其学习笔记中详细...
STM32学习笔记(一)主要探讨了STM32微控制器的基础知识以及如何开始学习STM32开发。STM32是意法半导体公司(STMicroelectronics)推出的一种基于ARM Cortex-M内核的微控制器系列,广泛应用在嵌入式系统设计中。这篇...
标题《STM32 入门笔记》的含义在于,这是一份关于学习和入门STM32微控制器(一款广泛使用的32位ARM Cortex-M微控制器)的个人笔记。描述中提到作者已经掌握STM32的调试环境和一些基础知识,并希望与他人共享所学成果...