(图为Ma TJ-STM32F103C8的最小系统)当我使用STM32F103C8T6 + STM32CubeMX进行项目时会遇到这四个问题。

让我与你分享。

以下四个问题的重要性按顺序降低,即:①调试选项问题(默认设置将导致下载程序无法下载); ②定时器设定占空比功能找不到错误; ③硬件错误(在测试前可以正常显示); ④串口寄存器与其他系列不同同一个问题; 1.调试选项问题1.1。

问题描述由STM32CubeMX生成的STM32F1项目在使用CMSIS-DAP下载器下载一次后,导致无法下载的问题,如图所示,下载器可以检测到该下载器,但下载器无法连接芯片:当然,直接下载时会出现问题,如下图所示:1.2。

问题原因分析原因造成的问题非常令人不适:当STM32CubeMX生成STM32F1项目时,默认配置选项为No-Debug,并且将不配置下载程序。

使用过的SWDIO引脚和SWCLK引脚:结果是MCU中以前的程序是正常的,因此可以成功下载由该项目编译的程序,但是一旦下载,它将变得很冷... 1.3。

问题的解决方案解决方案1.3.1。

修改STM32CubeMX中的debug选项,并将Debug选项设置为Serial Wire模式:然后,它将自动配置下载程序使用的两个引脚SWDIO和SWCLK:1.3.2。

维修已经很冷了,幸运的是,STM32F1系列可以使用BOOT0引脚和BOOT1引脚来配置启动模式:BOOT0:高电平(1)BOOT1:低电平(0)单片机上电后,它将从读取内部存储器中的引导加载程序,并支持从串行端口(通常为USART1)下载程序,这与51单片机的下载方法类似。

如果开发板已经具有ISP一键下载电路,请直接下载。

如果它是最小的系统板,请不要慌张,只需要一个USB到串行端口模块即可。

①接线:3V3,GND,TXD(USART1),RXD(USART1); ②将BOOT0设置为高电平,将BOOT1引脚设置为低电平; ③准备正常程序的十六进制文件; ④配置FlyMCU软件⑤观看在到达右侧提示信息后,再次打开微控制器的电源(请注意它是微控制器,请勿再次将USB插入并拔出USB串行端口)⑥成功下载⑦(不要忘记)这时,程序已成功下载,但未执行,因此将BOOT0引脚复位。

设置为低电平,BOOT1可以任意重置MCU,程序开始运行,并且成功修复了冷MCU。

using使用下载器进行测试,以下载程序,然后可以成功下载该程序(请注意不要再次下载原始错误的程序...)。

2.找不到__HAL_TIM_SetCompare函数2.1。

问题描述用STM32CubeMX生成STM32F103C8T6 MDK项目后,更改main.c中的定时器占空比计数值时,将报告错误:简而言之,找不到HAL库的内部API函数__HAL_TIM_SetCompare。

2.2。

解决方案该函数在stm32_hal_legacy.h文件中:包括此文件时,STM32F1系列的HAL库需要定义宏USE_HAL_LEGACY:只需添加以下定义:重新编译,问题就成功解决了!添加此方式后,在重新使用STM32CubeMX生成项目后,代码将自动覆盖并且需要再次添加! 3.使用硬件I2C时的一个小错误。

该错误是一个老问题。

我也在L4系列中遇到过。

只需在GPIO配置代码之前提到打开硬件I2C时钟的代码即可:显示效果如下:4.串行端口不同寄存器的问题在我使用其他STM32系列重定向printf函数之前,使用了祖先代码如下所示:/ *用户代码开始1 * /#if 1#include< stdio.h& lt; int fputc(int ch,FILE * stream){/ *阻塞以判断是否已发送串行端口是否* / while(((USART1-& ISR& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp ;; 0X40)== 0); / *发送串行端口后,发送字符* / USART1-> TDR =(uint8_t)ch; return ch;}#endif / *用户代码END 1 * /但是,在STM32F1系列中,没有ISR和TDR寄存器,但是有SR和DR寄存器,因此必须用祖传代码报告错误,如下修改: #if 1#include< stdio.h& gt; int fputc(int ch,FILE * stream){/ *块,以确定是否将串行端口发送到完成* / while((USART1-& SR& amp; 0X40)== 0); / *发送串行端口,并发送字符* / USART1-> DR =(uint8_t)ch;还原