STM32F103C8 Bluepill板HAL_delay()问题
Posted
技术标签:
【中文标题】STM32F103C8 Bluepill板HAL_delay()问题【英文标题】:STM32F103C8 Bluepill board HAL_delay() problem 【发布时间】:2021-05-10 10:44:56 【问题描述】:我使用 STM32 cubeMX 进行配置,使用 Keil 进行编程。 已将板载 LED 引脚 pc13 引脚设置为输出引脚,默认为推挽模式。将调试器设置为串行线,因为我使用 ST-link V2 作为调试器。 RCC 将 HSE 设置为晶体/陶瓷谐振器。 并将时钟配置设置为默认值并生成项目。
现在我从一个简单的 LED 闪烁程序开始。如下
HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
HAL_Delay(1000);
成功构建,没有错误并上传,我想知道我的 LED 没有闪烁和震惊,因为我以前这样做过,现在这不起作用。 当我一步一步调试时,我的代码只是重复来自两个函数。
while ((HAL_GetTick() - tickstart) < wait)
__weak uint32_t HAL_GetTick(void)
return uwTick;
在这段代码中没有发生任何事情我知道代码是正确的,但是 HAL_delay 配置中有一些错误。 在挠了一天之后,我尝试上传以下代码
HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
HAL_Delay(100);
奇怪的是,现在我的 LED 只闪烁,我将 HAL_dealy 值从 1000 更改为 100 并且工作正常,但是当使用 1000 时根本不起作用。 所以为了测试,我逐渐增加了延迟值,发现超过HAL_delay(400)就不行了。
无法找到导致此问题的原因任何帮助将不胜感激。
按照 Tom 的建议,我使用 STstudio 调试了 uwTickFreq。 我得到了以下输出波形。
之后,我还上传了以下代码。并将变量定义为“unsigned long int a;”
HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
HAL_Delay(100);
a= HAL_GetTick();
现在我使用 STstudio 调试了 a 的值。奇怪的是,一旦达到 300 左右,a 的值就会变为 0。
【问题讨论】:
每次通过的uwTickFreq、tickstart和uwTick的值是多少? 您发布的代码显然不是错误所在。您在展示的片段中过于激进。展示好的代码片段并询问它们为什么不起作用会让你猜不到答案。 @TomV 我发现我的 Keil 项目中设计了以下代码行。 HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ 我知道那行,但是你能用调试器检查变量的内容吗? @TomV 我已经调试了一些东西,请参阅我从 STstudio 获得的附加波形图像。我不认为变量 a 的值一旦达到 300 左右就应该重置,对吧? 【参考方案1】:似乎终于,当我发现控制器中的重置问题时,我遇到了问题,我四处搜索并找到了一些东西here。
所以我用 STM32 立方体编程器检查了我在 MCU 中设置的可选字节。 设置如下。
因此我启用了这三个可选字节。
重置的问题消失了,我现在可以正常使用 HAL_delay 函数,现在 HAL_GetTick() 的值也增加了 300 多。
还有一个问题,我认为看门狗导致了重置,但为什么它只在我使用计时功能时才导致。
【讨论】:
以上是关于STM32F103C8 Bluepill板HAL_delay()问题的主要内容,如果未能解决你的问题,请参考以下文章
基于STM32F103C8T6最小系统板HAL库CubeMX驱动HC-SR501红外人体传感模块
基于STM32F103C8T6最小系统板HAL库CubeMX驱动HC-SR501红外人体传感模块
基于STM32F103C8T6最小系统板HAL库CubeMX驱动HC-SR501红外人体传感模块
基于STM32F103C8T6最小系统板HAL库CubeMX SPI驱动7针 OLED显示屏(0.96寸 1.3寸通用)
基于STM32F103C8T6最小系统板HAL库CubeMX SPI驱动7针 OLED显示屏(0.96寸 1.3寸通用)
基于STM32F103C8T6最小系统板HAL库CubeMX SPI驱动7针 OLED显示屏(0.96寸 1.3寸通用)