一、工具
keil+Env+STM32CubeMX
二、在Env中勾选本工程需要的pkgs
在RT-Thread Components—->Device Drivers下勾选 Using hardware timer device drivers和Using PWM device drivers
勾选完成后保存、退出更新,再返回此界面查看是否已经更新好(勾好)
最后使用 scons —target=mdk5生成新的工程
会发现工程中多出了一个关键性的文件drv_pwm.c
三、修改配置文件
在 rtconfig.h 中可以查看 RT_USING_HWTIMER 和 RT_USING_PWM 的设备驱动宏定义。
stm32h7xx_hal_conf.h 头文件查看是否已宏定义HAL_TIM_MODULE_ENABLED 和 HAL_PWR_MODULE_ENABLED,如果没有自动配置则手动取消相关注释打开并保存
在board.h 增加 #define BSP_USING_PWM3 和 #define BSP_USING_PWM3_CH4 宏定义,然后保存(会在drv_pwm.c中使用)
为什么要选择TIM3的第4通道呢?因为此io(PB1)在正点原子stm32H743上连接了DS0(红灯),方便我们看实验
接下来,查看drv_pwm.c中TIM设备硬件驱动代码
可以看到,PWM3已经被启用
四、使用STM32CubeMX生成代码
drv_pwm.c的static rt_err_t stm32_hw_pwm_init(struct stm32_pwm device) 中调用了 HAL_TIM_MspPostInit(TIM_HandleTypeDef htim) 这个函数,这样就需要通过STM32Cube配置自动生成相关驱动代码。
首先,找到工程下—->board—->CubeMX_Config文件夹下的CubeMX_Config.ioc文件
用管理员方式打开STM32CubeMX,再载入此ioc文件
配置TIM3 PWM CH4通道(即PB1)
修改完成后,点击右上角GENERATE CODE,可能会下载许多文件,如果下载失败,有可能是没有用管理员方式运行,也有可能是连接未建立
可以这样检查一下
等下载完成后,可以看到Src文件夹多了一些文件,并且这些文件已经加入了工程,其中核心文件就是stm32h7xx_hal_msp.c,里面包含了前文提到的HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim) 这个函数
这里可以看一下其中我们用到的重要函数:
打开TIM3时钟(初始化)
/**
@brief TIM_Base MSP Initialization
This function configures the hardware resources used in this example
@param htim_base: TIM_Base handle pointer
@retval None
/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef htim_base)
{
if(htim_base->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspInit 0 /
/ USER CODE END TIM3_MspInit 0 /
/ Peripheral clock enable /
__HAL_RCC_TIM3_CLK_ENABLE();
/ USER CODE BEGIN TIM3_MspInit 1 /
/ USER CODE END TIM3_MspInit 1 */
}
}
io初始化(drv_pwm.c中使用)
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(htim->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspPostInit 0 /
/ USER CODE END TIM3_MspPostInit 0 */
__HAL_RCC_GPIOB_CLK_ENABLE();
/**TIM3 GPIO Configuration
PB1 ------> TIM3_CH4
/
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/ USER CODE BEGIN TIM3_MspPostInit 1 /
/ USER CODE END TIM3_MspPostInit 1 */
}
}
解除配置(释放资源)
/**
@brief TIM_Base MSP De-Initialization
This function freeze the hardware resources used in this example
@param htim_base: TIM_Base handle pointer
@retval None
/
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef htim_base)
{
if(htim_base->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspDeInit 0 /
/ USER CODE END TIM3_MspDeInit 0 /
/ Peripheral clock disable /
__HAL_RCC_TIM3_CLK_DISABLE();
/ USER CODE BEGIN TIM3_MspDeInit 1 /
/ USER CODE END TIM3_MspDeInit 1 */
}
}
四、跑pwm
到RT-Thread API参考手册官网找到pwm_led.c例程
直接全部复制,在之前的工程下建立pwm_led.c,复制代码后保存,把文件加入工程,查看是否有警告(按理说现在没有了)
但是编译后出错(小问题,而且按理说不应该出现该问题)
Error_Handler函数没有实体,所以到STM32CubeMX生成的文件(main.c)中找到该函数并重新加入(main.h)文件中,再编译后无误。
下载到开发版,使用串口调用pwm_led_sample命令后,红灯变为了呼吸灯。
上一篇:基于STM32F429芯片的单片机芯片内存映射图
下一篇:如何评估MCU满足项目需求?STM32系列单片机如何选型?
推荐阅读最新更新时间:2024-11-15 12:00
设计资源 培训 开发板 精华推荐
- 仿制稚晖君ESP32开发板
- L7815A负输出电压电路的典型应用
- LT3091IDE 正输出电流监视器的典型应用
- Si2457-EVB,带有 UART 接口的 SI2457 ISOmodem 芯片的评估板
- LDK120C18R 1.8V低压降稳压器典型应用(D版)电路
- PF8121电源管理IC评估板
- 使用 Microchip Technology 的 TC05BC 的参考设计
- ADP2107-EVALZ,用于降压型 DC 至 DC 转换器解决方案的评估板,可调输出电压初始设置为 2.5 V
- TRK-S12ZVHY64: 适用于摩托车仪表板应用的S12 MagniV
- LT1086IT-5 电池后备稳压电源的典型应用
- 热烈庆祝坛友coyoo新书《FPGA设计实战演练》出版,参与讨论即有机会赢新书!
- 下载有好礼!TE 户外监控,创建安全稳定社会的重要保障和趋势之选!
- TI 培训积分全新上线!学课程 领积分 兑礼品
- 以拆会友,你拆、你评我送礼!
- 【转发无最,分享有礼】ADI实验室电路电子书!
- 国产FPGA有奖直播:安路全新FPSoC产品SF1系列(FPGA+MCU),Demo板介绍和案例解析
- 了解PI高性能AC-DC产品,答题赢好礼
- 嵌入式工程师AI挑战营(初阶):基于RV1106,动手部署手写数字识别落地
- 安全在任何时候都是第一要素,你的嵌入式设计也是!诚邀参加英飞凌 OPTIGA™ Trust M 安全防御大揭秘!
- 端午节芯币兑换礼品专场