STM32CubeMX生成freertos默认设置卡死,卡在HAL_Init不动,裸机运行程序正常跑,解决方法

1、简介

最近通过STM32CubeMX生成freertos发现任务不执行,卡在HAL_Init不动,网上找很久不好使,刚开始怀疑硬件问题,但是裸机运行程序正常跑,然后怀疑软件有问题,但是对F1,F3系列都好使,仅仅对F4系列不行,然后通过对F4固件包升级得以解决。

2、解决办法

找到F4,点击Refresh刷新,然后安装。

 

### STM32 HAL 库结合 FreeRTOS 实现 PWM 功能 在 STM32 中,可以利用 HAL 库和 FreeRTOS 来实现对 PWM 的精确控制。以下是具体的实现方式: #### 配置硬件资源 首先需要完成基本的硬件资源配置工作,包括 GPIO 和定时器的初始化设置。这一步可以通过 CubeMX 工具自动生成代码来简化流程[^1]。 ```c // 初始化 TIMx 用于生成 PWM 波形 __HAL_RCC_TIMx_CLK_ENABLE(); // 启用定时器时钟 TIM_HandleTypeDef htim; htim.Instance = TIMx; htim.Init.Prescaler = (SystemCoreClock / 1000000) - 1; // 设置预分频值 htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 999; // 设定计数周期为 1ms if (HAL_TIM_PWM_Init(&htim) != HAL_OK) { Error_Handler(); } ``` #### 创建 FreeRTOS 任务 接着,在应用层面上创建一个 FreeRTOS 任务专门负责调整占空比参数。此任务会定期更新 PWM 输出信号的脉宽比例以达到动态调节速度的效果[^2]。 ```c void StartPWMTask(void const * argument) { uint32_t dutyCycle = 50; // 初始占空比设定为 50% while(1){ __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, ((uint32_t)(dutyCycle*10))); // 更新比较寄存器 vTaskDelay(pdMS_TO_TICKS(100)); // 延迟一段时间再改变下一次循环中的占空比数值 } } int main(void) { osThreadDef(PWMTASK, StartPWMTask, osPriorityNormal, 0, configMINIMAL_STACK_SIZE); taskHandle = osThreadCreate(osThread(PWMTASK), NULL); if(taskHandle != NULL){ osKernelStart(); // 开始调度运行所有的 RTOS 线程 } while (1){} // 主函数进入死循环等待中断或其他事件触发处理逻辑 } ``` 以上代码片段展示了如何基于 HAL 库配合 FreeRTOS 构建简单的 PWM 控制机制[^3]。其中 `vTaskDelay` 函数用来指定两次连续修改之间的时间间隔长度;而通过调用 `__HAL_TIM_SET_COMPARE()` 可直接更改当前通道对应的捕获/比较寄存器内的数据从而影响最终输出波形形态特征。 #### 注意事项 当把裸机程序迁移到带操作系统环境里执行的时候需要注意一些细节问题比如全局变量访问冲突以及上下文中断优先级配置等等情况都需要额外加以考虑以免引发不可预期的行为表现出来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值