一、工具
二、在Env中勾選本工程需要的pkgs
在RT-Thread Components—->Device Drivers下勾選 Using hardware timer device drivers和Using PWM device drivers


勾選完成后保存、退出更新,再返回此界面查看是否已經(jīng)更新好(勾好)
最后使用 scons —target=mdk5生成新的工程
會(huì)發(fā)現(xiàn)工程中多出了一個(gè)關(guān)鍵性的文件drv_pwm.c

三、修改配置文件
在 rtconfig.h 中可以查看 RT_USING_HWTIMER 和 RT_USING_PWM 的設(shè)備驅(qū)動(dòng)宏定義。

stm32h7xx_hal_conf.h 頭文件查看是否已宏定義HAL_TIM_MODULE_ENABLED 和 HAL_PWR_MODULE_ENABLED,如果沒(méi)有自動(dòng)配置則手動(dòng)取消相關(guān)注釋打開(kāi)并保存

在board.h 增加 #define BSP_USING_PWM3 和 #define BSP_USING_PWM3_CH4 宏定義,然后保存(會(huì)在drv_pwm.c中使用)

為什么要選擇TIM3的第4通道呢?因?yàn)榇薸o(PB1)在正點(diǎn)原子stm32H743上連接了DS0(紅燈),方便我們看實(shí)驗(yàn)
接下來(lái),查看drv_pwm.c中TIM設(shè)備硬件驅(qū)動(dòng)代碼
可以看到,PWM3已經(jīng)被啟用

四、使用STM32CubeMX生成代碼
drv_pwm.c的static rt_err_t stm32_hw_pwm_init(struct stm32_pwm device) 中調(diào)用了 HAL_TIM_MspPostInit(TIM_HandleTypeDef htim) 這個(gè)函數(shù),這樣就需要通過(guò)STM32Cube配置自動(dòng)生成相關(guān)驅(qū)動(dòng)代碼。

首先,找到工程下—->board—->CubeMX_Config文件夾下的CubeMX_Config.ioc文件

用管理員方式打開(kāi)STM32CubeMX,再載入此ioc文件

配置TIM3 PWM CH4通道(即PB1)




修改完成后,點(diǎn)擊右上角GENERATE CODE,可能會(huì)下載許多文件,如果下載失敗,有可能是沒(méi)有用管理員方式運(yùn)行,也有可能是連接未建立
可以這樣檢查一下


等下載完成后,可以看到Src文件夾多了一些文件,并且這些文件已經(jīng)加入了工程,其中核心文件就是stm32h7xx_hal_msp.c,里面包含了前文提到的HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim) 這個(gè)函數(shù)


這里可以看一下其中我們用到的重要函數(shù):
打開(kāi)TIM3時(shí)鐘(初始化)
/**
@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參考手冊(cè)官網(wǎng)找到pwm_led.c例程,在之前的工程下建立pwm_led.c,復(fù)制代碼后保存,把文件加入工程,查看是否有警告(按理說(shuō)現(xiàn)在沒(méi)有了)

但是編譯后出錯(cuò)(小問(wèn)題,而且按理說(shuō)不應(yīng)該出現(xiàn)該問(wèn)題)

Error_Handler函數(shù)沒(méi)有實(shí)體,所以到STM32CubeMX生成的文件(main.c)中找到該函數(shù)并重新加入(main.h)文件中,再編譯后無(wú)誤。

下載到開(kāi)發(fā)版,使用串口調(diào)用pwm_led_sample命令后,紅燈變?yōu)榱撕粑鼰簟?/p>
-
PWM
+關(guān)注
關(guān)注
116文章
5872瀏覽量
225734 -
呼吸燈
+關(guān)注
關(guān)注
10文章
117瀏覽量
44107 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1614瀏覽量
44907 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
290瀏覽量
17373 -
HAL庫(kù)
+關(guān)注
關(guān)注
1文章
121瀏覽量
7642
發(fā)布評(píng)論請(qǐng)先 登錄
keil+env在STM32H743上實(shí)現(xiàn)pwm呼吸燈
stm32h743 keil5 HAL如何主動(dòng)觸發(fā)死機(jī)?
請(qǐng)問(wèn)stm32h743 NC引腳如何連接?
在STM32H743芯片上實(shí)現(xiàn)CAN通信
STM32H743 Flash用來(lái)存什么
為什么STM32H743的DMA中斷不起作用?
在STM32H743芯片上實(shí)現(xiàn)CAN通信的步驟
RT-Thread文件系統(tǒng)組件在STM32H743上的應(yīng)用
stm32h750/stm32h743原理圖和pcb源文件
stm32h743外部RAM非字節(jié)對(duì)齊訪問(wèn),引起的hard fault
STM32 使用PWM實(shí)現(xiàn)呼吸燈
用STM32cube實(shí)現(xiàn)STM32H743的USB驅(qū)動(dòng)
keil+env在STM32H743上實(shí)現(xiàn)pwm呼吸燈
評(píng)論