一、
1、配置RT-Thread Settings
配置完畢記得保存配置
2、開啓board.h及stm32xxxx_hal_config.h的宏定義
這裏只需要先開啓宏,函數複製看下面的步驟。
3、複製PWM初始化函數
初始化相關的函數有兩種獲取方式,第一種可以使用stm32cube配置工程,然後打開工程的stm32f1xx_hal_msp.c和main.c進行復制;第二種可以打開RTThread源代碼的板級支持包BSP進行復制,BSP中包含很多芯片的例程代碼,但代碼中是沒有初始化全部的外設的,所以最好還是採用第一種方法。
需要複製的函數有:
1、void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim);//在stm32f1xx_hal_msp.c中,放在board.c最下面,也可自己分配位置
2、void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm);//在stm32f1xx_hal_msp.c中,放在board.c最下面,也可自己分配位置
3、static void MX_TIM2_Init(void);//main.c中,位置自己配置吧
第1、2個函數會被系統檢索自動初始化,第3個函數需要用戶主動初始化,放在mian函數中自己初始化吧,其中的有些內容會與後面初始化內容重複,但最終還是會以程序最後的配置爲準,不影響使用。
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
{
if(htim_pwm->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspInit 0 */
/* USER CODE END TIM2_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM2_CLK_ENABLE();
/* USER CODE BEGIN TIM2_MspInit 1 */
/* USER CODE END TIM2_MspInit 1 */
}
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(htim->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspPostInit 0 */
/* USER CODE END TIM2_MspPostInit 0 */
/**TIM2 GPIO Configuration
PA0-WKUP ------> TIM2_CH1
PA1 ------> TIM2_CH2
PA2 ------> TIM2_CH3
PA3 ------> TIM2_CH4
*/
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN TIM2_MspPostInit 1 */
/* USER CODE END TIM2_MspPostInit 1 */
}
}
TIM_HandleTypeDef htim2;
/* TIM2 init function */
static void MX_TIM2_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 72;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 100;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
sConfigOC.Pulse = 200;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
sConfigOC.Pulse = 300;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
sConfigOC.Pulse = 400;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_MspPostInit(&htim2);
}
4、初始化最終需要使用的PWM代碼
RTThread關於PWM相關的部分已經開啓完畢,接下來就是使用,使用系統帶的接口函數進行操作,具體參照RT關於PWM章節RT官方PWM章節
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
static void MX_TIM2_Init(void);
/* PLEASE DEFINE the LED0 pin for your board, such as: PA5 */
#define LED0_PIN GET_PIN(B, 0)
TIM_HandleTypeDef htim2;
#define PWM_DEV_NAME "pwm2" /* PWM設備名稱 */
#define PWM_DEV_CHANNEL 3 /* PWM通道 */
struct rt_device_pwm *pwm_dev; /* PWM設備句柄 */
rt_uint32_t period, pulse;
int main(void)
{
int count = 1;
/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
MX_TIM2_Init();
period = 5000; /* 週期爲5ms,單位爲納秒ns period*pwm頻率=1000000ns*/
pulse = 1000; /* PWM脈衝寬度值,單位爲納秒ns */
/* 查找設備 */
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
/* 設置PWM週期和脈衝寬度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
/* 使能設備 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
rt_pwm_set(pwm_dev, 4, period, pulse);
rt_pwm_enable(pwm_dev, 4);
while (count++)
{
/* set LED0 pin level to high or low */
rt_pin_write(LED0_PIN, count % 2);
LOG_D("Hello RT-Thread!");
rt_thread_mdelay(1000);
}
return RT_EOK;
}