开贴记录STM32工程遇到的各种问题及解决方法
STM32工程问题集锦
针对工程开发过程中常见问题进行备注
文章目录
问题列表
初始化要点
1.将程序编译下载到MCU后无法进行调试。
时钟设置
- 串口输出乱码,检查后串口配置正确,将接收端波特率修改为单片机初始化时波特率的一半,接受正常。
串口设置
- 串口输出乱码,检查后串口配置正确,将接收端波特率修改为单片机初始化时波特率的一半,接受正常。
- 如何在STM32CUBEIDE上在Eclipse上集成串口终端显示。
- 串口中文乱码,英文正常。
- STM32CUBEMX中串口数据位的选择
STM32CUBEIDE
- 如何安装插件。
- STM32CUBEMX更新代码后出现中文乱码,及串口中文乱码的解决办法。
- 默认初始化程序顺序与工程不符,每次生成后需要手动调整,如何在软件设置里修改初始化程序顺序。
- 在使用STM32CUBEIDE看代码的大纲Outline的时候,有的文件显示:Outline is disabled due to scalability mode(option),未能正常显示大纲。
ADC
- ADC采用DMA方式多通道不能循环工作只采样一次,需要重新运行HAL_ADC_Start_DMA(&hadc1, &ADC_Value, 3)才能再次采集,并且只有第一个通道有数值,数值还不是正确的转换值。
DMA
- 采用DMA方式控制外设输出时,确定外设的配置和相关程序没有问题,但是没有正常输出。
定时器
- 定时器中断是怎样一个处理过程,应该把中断后要处理的程序放在哪个地方?
串口通信
- 直接采用单片机的串口TTL电平通信正常,增加MAX485芯片后,通信不稳定,误码率高。
HardFault
- 调试时,程序时不时进入void HardFault_Handler(void),有时存在偶然性,有时一直进入?
处理方法
初始化要点
1.将程序编译下载到MCU后无法进行调试。
由于问题是在使用STM32CUBE配置时发现,解决办法如下:检查System Core->SYS设置,是否启用Serial Wire模式,如果没有需要启用。如果此时开发软件(STM32CUBEIDE)无法和MCU通信,可以使用STM32CubeProgrammer连接芯片,将FLASH清空,清空后开发软件就能连接上MCU。
时钟设置
- 串口输出乱码,检查后串口配置正确,将接收端波特率修改为单片机初始化时波特率的一半,接受正常。
检查时钟设置,HSE的时钟值是否与板上相符,经检查发现板上为8MHz,设置为16MHz,导致出现串口乱码问题。
串口设置
- 串口输出乱码,检查后串口配置正确,将接收端波特率修改为单片机初始化时波特率的一半,接受正常。
检查时钟设置,HSE的时钟值是否与板上相符,经检查发现板上为8MHz,设置为16MHz,导致出现串口乱码问题。 - 如何在STM32CUBEIDE上在Eclipse上集成串口终端显示。
安装“Terminals”插件(eclipse自带 Kepler ):
安装地址:
http://download.eclipse.org/releases/kepler
->Mobile and Device Development->Target Management Terminal
安装 "TXRX"插件:
安装地址(选择最新版本):
http://rxtx.qbang.org/eclipse/
安装完成后重启Eclipse,重启后选择Window -> Show View -> Other … -> Terminal -> Terminal 进行简单的配置,即可打开串口调试终端。
(安照教程设置后未成功:参考教程链接) - 串口中文乱码,英文正常。
点击编辑->设置编码->其他:gbk(手动键入) - STM32CUBEMX中串口数据位的选择
8位数据+带奇偶校验,数据长度选择9位(带奇偶校验)
8位数据+无奇偶校验,数据长度选择8位(带奇偶校验)
7位数据+带奇偶校验,数据长度选择8位(带奇偶校验)
如果没有这么设置,会出现=某些数据能满足要求,某些数据异常
STM32CUBEIDE
- 如何安装插件。
打开STM32CUBEIDE->帮助->安装新软件->输入或者选择一个站点->选择要安装的插件,根据安装提示进行操作,重启后检查插件是否正常工作。 - STM32CUBEMX更新代码后出现中文乱码,及串口中文乱码的解决办法。
点击编辑->设置编码->其他:gbk(手动键入) - 修改初始化程序顺序
打开软件:STM32CUBEMX->Project Manager->Advanced Setting->Generated Function Calls。如下图所示: 4. 在使用STM32CUBEIDE看代码的大纲Outline的时候,有的文件显示:Outline is disabled due to scalability mode(option),未能正常显示大纲。
由于Eclipse在文件大于5000行时会自动进入scalability模式,需要去除scalability模式的限制就可以看Outline。点击大纲窗口显示的Outline is disabled due to scalability mode(option)的option,进入窗口首选项(或者在软件的窗口菜单找到该项)->C/C+±>Editor->Scalability->Scalability mode settings,取消勾选第一项:Disable editor live parsing
ADC
- ADC采用DMA方式多通道不能循环工作只采样一次,需要重新运行HAL_ADC_Start_DMA(&hadc1, &ADC_Value, 3)才能再次采集,并且只有第一个通道有数值,数值还不是正确的转换值。
STM32CUBEMX生成程序代码后,手动调换了DMA和ADC1的初始化顺序,先初始化DMA,再初始化ADC,程序正常运行。程序顺序如下:
/* Initialize all configured peripherals */
MX_DMA_Init();
MX_ADC1_Init();
为方便后续更新STM32CUBEMX设置,可在STM32CUBEMX软件中修改初始化程序顺序,具体做法如下:STM32CUBEMX->Project Manager->Advanced Setting->Generated Function Calls。如下图所示:
DMA
- 采用DMA方式控制外设输出时,确定外设的配置和相关程序没有问题,但是没有正常输出。
此时着重检查DMA的设置:存储器到存储器模式(存储器到存储器模式不能与循环模式同时使用)、配置DMA通道循环模式、优先级、数据宽度、是否增量、传输方向(!!!重点检查:输出/输入的设备传输方向不一样!!!)、是否增量参数、可编程的数据传输宽度、对齐方式和数据大小端、可编程的数据量。
定时器
- 定时器中断是怎样一个处理过程,应该把中断后要处理的程序放在哪个地方?
中断触发后,先进入定时器中断函数void TIM2_IRQHandler(void) 执行定时器中断处理函数 HAL_TIM_IRQHandler(&htim2)判断产生的是哪一类定时器中断(溢出中断/PWM中断…) 和定时器通道,然后执行相对应中断回调函数void HAL_TIM_PeriodElapsedCallback(&htim2);用户要进行处理的中断任务可以添加在中断回调函数里面,直接在main.c文件中定义对应中断回调函数即可(HAL库已对中断回调函数进行弱定义)。
串口通信
- 直接采用单片机的串口TTL电平通信正常,增加MAX485芯片后,通信不稳定,误码率高。
首先确保MAX485电路正常,降低波特率,查看通信质量,此前测试115200的波特率用在MAX485误码率极高,更换为9600,工作正常,最高可以用到多少还待测试。
HardFault
- 调试时,程序时不时进入void HardFault_Handler(void),有时存在偶然性,有时一直进入?
检测程序中是否存在做出发语句,特别是除数为外部输入数值,如果除数为0时,会进入void HardFault_Handler(void)程序,此时需要在做除法前先对除数进行判断是否大于0。时不时进入该程序,经常出现在输入为ADC采样值时,会因外部输入电压变化,发生偶然性事件。