历史上的今天
返回首页

历史上的今天

今天是:2026年03月13日(星期五)

正在发生

2023年03月13日 | 经验分享 | STM32CubeMX + STM32F1系列开发时遇到的四个问题及解决方案分享

2023-03-13 来源:elecfans

这四个问题是我在使用STM32F103C8T6 + STM32CubeMX做项目时遇到的,给大家分享一下,以下四个问题重要程度依次降低,分别是:

  • ① 调试选项问题(默认会造成下载器无法下载);

  • ② 定时器设置占空比的函数找不到报错的问题;

  • ③ 硬件iic的一个小bug(亲测oled可以正常显示);

  • ④ 串口寄存器与其它系列不一样的问题;

1. 调试选项问题

1.1. 问题描述

使用STM32CubeMX生成的 STM32F1 工程,在使用 CMSIS-DAP 下载器下载一次之后,造成无法下载的问题,如图,下载器可以检测到,但是下载器无法连接芯片


直接下载当然一定也会出问题了,如图:


1.2. 问题原因分析

造成这个问题的原因非常难受:

STM32CubeMX生成 STM32F1 的工程时,默认配置选项是 No-Debug,不会配置下载器所使用到的SWDIO引脚和SWCLK引脚

结果就是单片机里之前的程序是正常的,所以这个工程编译出的程序可以成功下载进去,但是一旦下载进去之后,就凉了……

1.3. 问题的解决方案

1.3.1. 修改STM32CubeMX中的调试选项

将Debug选项设置为 Serial Wire 模式即可:


这样它就会去自动配置下载器使用到的两个引脚SWDIO和SWCLK:


1.3.2. 修复已经凉了的单片机

不幸中的万幸,STM32F1系列可以使用BOOT0引脚和BOOT1引脚配置启动模式:

  • BOOT0:高电平(1)

  • BOOT1:低电平(0)

单片机上电后就会从内部存储器启动,读取内部存储器中固化的bootloader程序,支持从串口下载程序(一般是USART1),也就是类似于51单片机的那种下载方式。

如果开发板已经有ISP一键下载电路,直接下载就ok,如果是最小系统板,也不用慌,需要一个USB转串口模块即可。

① 接线:3V3、GND、TXD(USART1)、RXD(USART1);

② 设置BOOT0为高电平,设置BOOT1引脚为低电平;

③ 准备一份正常程序的hex文件;

④ 配置FlyMCU软件

⑤ 看到右边的提示信息后,给单片机重新上电(注意是单片机,不要重新插拔USB转串口)


⑥ 下载成功

⑦ (别忘了)这个时候程序下载成功了,但是没有执行,将BOOT0引脚重新设置为低电平,BOOT1可以任意,复位单片机,程序开始运行,已经凉了的单片机修复成功

⑧ 测试使用下载器下载程序,可以成功下载(注意不要再把原来坏的程序下载进去……)。

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


添加上这个define即可:


重新编译,问题解决成功!

这样添加之后,重新使用STM32CubeMX生成工程后,代码会被自动覆盖,需要重新添加!

3. 使用硬件I2C时的一个小bug

这个bug是老问题了,我在L4系列也遇到过,将开启硬件I2C时钟的代码提到GPIO配置的代码之前即可


显示效果如下:


4. 串口寄存器不一样的问题

之前我在使用别的STM32系列重定向printf函数时,使用的祖传代码如下:

/* USER CODE BEGIN 1 */
#if 1
#include 

int fputc(int ch, FILE *stream)
{
    /* 堵塞判断串口是否发送完成 */
    while((USART1->ISR & 0X40) == 0);

    /* 串口发送完成,将该字符发送 */
    USART1->TDR = (uint8_t) ch;

    return ch;
}
#endif

/* USER CODE END 1 */

但是在STM32F1系列中,没有ISR,TDR这两个寄存器,而是SR、DR这两个寄存器,所以用祖传代码肯定报错,修改为如下即可:

#if 1
#include 

int fputc(int ch, FILE *stream)
{
    /* 堵塞判断串口是否发送完成 */
    while((USART1->SR & 0X40) == 0);

    /* 串口发送完成,将该字符发送 */
    USART1->DR = (uint8_t) ch;

    return ch;
}
#endif

以上就是我在使用STM32CubeMX开发STM32F1系列时需要的所有问题和其解决方案,分享给大家,避免再次入坑,有用的话点个赞吧~


推荐阅读

史海拾趣

Hitachi (Renesas )公司的发展小趣事

在电子行业中,Hitachi(日立)及其子公司如Renesas(瑞萨电子,原日立半导体部门独立后成立)的发展历史充满了技术创新、市场扩张与全球合作的精彩故事。以下是五个相关故事,每个故事均基于事实描述:

1. 从电机制造到半导体巨头的转型

日立公司成立于1910年,最初以生产电动机和矿山设备起家,旨在支持日本的工业化进程。随着技术的不断进步和市场需求的多样化,日立逐渐将业务扩展到电子领域。1960年代,日立开始涉足半导体技术,并在随后的几十年里,通过持续的研发投入和技术创新,逐步建立了在半导体行业的领先地位。1999年,日立半导体部门独立成为Renesas Technology Corporation(瑞萨科技),进一步专注于微控制器、模拟IC、电源管理IC等产品的研发与生产,为汽车电子、工业控制、消费电子等多个领域提供关键解决方案。

2. 全球化战略与市场拓展

进入21世纪,日立及Renesas积极实施全球化战略,通过在全球各地设立研发中心、生产基地和销售网络,加速其产品和技术的国际化进程。例如,Renesas在美国、欧洲和亚洲等地建立了多个研发中心,与当地企业和研究机构紧密合作,共同推动半导体技术的创新与发展。同时,通过并购和合作,Renesas不断扩展其产品线,提升在全球市场的竞争力。

3. 技术创新引领行业发展

日立及Renesas在半导体领域的技术创新是其持续发展的重要驱动力。多年来,公司投入大量资源进行研发,不断推出具有行业影响力的新产品和技术。例如,在汽车电子领域,Renesas的MCU(微控制器)和功率半导体产品广泛应用于发动机控制、车身控制、安全系统等关键系统,为汽车行业的智能化和电动化转型提供了重要支持。此外,Renesas还在物联网、工业4.0等新兴领域积极布局,推动相关技术的研发与应用。

4. 应对挑战与危机管理

在发展过程中,日立及Renesas也面临过诸多挑战和危机。例如,2011年日本东北太平洋地区地震和海啸对日立及Renesas的生产基地造成了严重影响。面对这一突如其来的灾难,公司迅速启动应急响应机制,调整生产计划,确保关键产品的供应不受影响。同时,公司还加强了供应链的多元化和风险管理,以应对未来可能发生的类似危机。

5. 可持续发展与社会责任

作为一家全球性的电子企业,日立及Renesas始终将可持续发展和社会责任视为企业发展的重要组成部分。公司致力于开发环保型产品和解决方案,推动绿色能源和节能减排技术的应用。同时,公司还积极参与社会公益活动,支持教育、环保和社区发展项目,展现了作为全球企业公民的责任感。例如,日立通过引入“光伏+储能”智慧能源体系,构建绿色生产基地,为实现“双碳”目标贡献力量。

以上五个故事展示了Hitachi(日立)及其子公司Renesas在电子行业中的发展历程和成就,体现了公司在技术创新、市场拓展、危机管理、可持续发展和社会责任等方面的努力和贡献。

Federal Custom Cable公司的发展小趣事

Federal Custom Cable公司成立于XXXX年,由几位具有丰富电缆制造经验的工程师创立。公司创立之初,就专注于为客户提供定制化的电缆解决方案。他们深入了解不同行业对电缆的特殊需求,通过技术创新和工艺改进,生产出符合客户要求的电缆产品。这种对定制化需求的精准把握,使Federal Custom Cable在竞争激烈的电缆市场中脱颖而出。

Dean Technology公司的发展小趣事

在激烈的市场竞争中,Dean Technology公司始终保持对技术创新的追求。他们不断投入研发资金,引进先进技术和设备,提升产品的技术含量和附加值。同时,公司还注重与高校、科研机构的合作,共同开展科研项目,推动行业技术的进步。这些努力使得Dean Technology的高压二极管产品始终保持在行业的领先地位。

ECLIPTEK公司的发展小趣事

随着全球对环保问题的日益关注,ECLIPTEK公司积极响应环保号召,将绿色环保理念融入其产品研发和生产过程中。公司采用环保材料和清洁能源,减少生产过程中的废弃物和污染物排放。同时,ECLIPTEK还积极参与环保公益活动,推动电子行业的可持续发展。

Connective Peripherals Pte Ltd公司的发展小趣事

随着全球对环保问题的日益关注,ECLIPTEK公司积极响应环保号召,将绿色环保理念融入其产品研发和生产过程中。公司采用环保材料和清洁能源,减少生产过程中的废弃物和污染物排放。同时,ECLIPTEK还积极参与环保公益活动,推动电子行业的可持续发展。

睿赫(crechip)公司的发展小趣事

随着技术的不断突破和市场需求的日益增长,睿赫公司的芯片产品逐渐得到了广泛的应用。尤其是在智能手机、物联网和智能家居等领域,睿赫芯片凭借其高性能和低功耗的特性,赢得了众多知名企业的青睐。

与此同时,睿赫公司还积极拓展海外市场,与国际知名企业展开合作,共同推动电子行业的发展。通过不断的技术创新和市场拓展,睿赫公司逐渐在电子行业中树立了自己的品牌形象。

问答坊 | AI 解惑

现场测试宝马车的压力传感器

飞思卡尔在汽车电子领域主要使用的是加速度和压力传感器。它们的特点:环保、安全、智能和低成本。在针对大多数的汽车厂家,飞思卡尔推出不同功能的传感器。目前有双轴和3轴的加速度传感器。也有正在实验中的角速度传感器(陀螺仪)。这个图片中, ...…

查看全部问答>

Stellaris是什么东东

Stellaris是什么啊,怎么从来没听说过,哪位牛人给讲讲。悬赏芯币5枚。 [ 本帖最后由 天地一孤砂 于 2010-1-7 16:30 编辑 ]…

查看全部问答>

FFT结果出错

      我使用的器件是DM6437,当我从外部导入的数据只有2048点时,调用“DSP_fft32x32 ”这一库函数进行运算后,结果正确。而当我导入的数据为21000个时,只取前2048点做FFT,调用库函数后作出的结果就很不正确了;而我将 ...…

查看全部问答>

驱动程序改I/O APIC重定向表

老师让暑期搞定这个问题,眼看大半时间过去,后面还有奥运。。。还没有进展!求助~~ 先谢了 把问题简单的说: 过去我们进dos可以捕获到中断,现在想直接用v86捕获中断,可是v86直接破活不到?老师让写个驱动让v86直接捕获!不知道这个方法是否可行 ...…

查看全部问答>

有没有免费的quartus II ip core??

altera 的ip core是不是都要付费的啊?…

查看全部问答>

【TI视频】基于TMS320F2812 DSP的方向盘电机控制系统

2012 TI C2000及MCU大奖赛,本科组,控制系统类,上海交通大学,基于TMS320F2812DSP的方向盘电机控制系统   $(\'swf_A7F\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'al ...…

查看全部问答>

开始搞搞Qsys

其实我一直不想搞这个东西,但最近要搞单板的测试,写C代码相对于Verilog来说,要简单的多啊,还是学习学习吧。立贴明志,哈哈!…

查看全部问答>

无线通信

新手求教,要求无线传输距离在200-1000m,请问用什么无线芯片或者模块号呢…

查看全部问答>

单片机MSP430+GPRS模块怎么和ARM+WIFI模块之前通信?

1.首先问一下可不可以通信? 2.我之前已经做了MSP430+GPRS发送数据到VB界面。 3.也完成了ARM1+WIFI1和ARM2+WIFI2之间的通信。 4.现在问题是我在两个ARM之前通信是调用了网络通信相关的函数,结构体,套接字,client和server之间的函数是对应互补 ...…

查看全部问答>

AD7705的DRDY一直是高电平是什么原因?

写程序控制AD7705,但是它的DRDY一直是高电平,好像一直没有转换,是为什么呢? …

查看全部问答>