STM32:TIM_OCxInit函数用法解释

TIM_OC3Init函数是用于初始化定时器TIM的PWM输出通道3的函数,可以使用以下步骤进行使用:

  1. 创建一个TIM_OC_InitTypeDef类型的结构体对象,例如命名为TIM_OCInitStruct。
  2. 使用TIM_OCStructInit函数将结构体对象TIM_OCInitStruct初始化为默认值。
  3. 设置TIM_OCInitStruct中的成员变量,包括: TIM_OCMode、TIM_OutputState、TIM_OCPolarity和TIM_Pulse。
  4. 调用TIM_OC3Init函数,并将TIM_HandleTypeDef类型的定时器句柄作为第一个参数传递给该函数;并将上述初始化好的TIM_OCInitStruct结构体作为第二个参数传递给该函数。

下面是一个示例代码:

/* 定义一个定时器句柄 */
TIM_HandleTypeDef htim;
/* 定义一个结构体对象来配置TIM的PWM通道3 */
TIM_OC_InitTypeDef TIM_OCInitStruct;

/* 对该对象进行初始化 */
TIM_OCStructInit(&TIM_OCInitStruct);

/* 配置需要的TIM_OCInitStruct成员变量 */
TIM_OCInitStruct.TIM_OCMode       = TIM_OCMODE_PWM1;
TIM_OCInitStruct.TIM_OutputState  = TIM_OUTPUTSTATE_ENABLE;
TIM_OCInitStruct.TIM_OCPolarity   = TIM_OCPOLARITY_HIGH;
TIM_OCInitStruct.TIM_Pulse        = 499;

/* 初始化TIM的PWM通道3*/
HAL_TIM_OC_Init(&htim);
HAL_TIM_OC_ConfigChannel(&htim, &TIM_OCInitStruct, TIM_CHANNEL_3);

在上述代码中,我们定义了一个定时器句柄htim和一个初始化结构体TIM_OCInitStruct。我们通过调用TIM_OCStructInit函数将TIM_OCInitStruct初始化为默认值,然后根据需要进行配置。在这个示例中,我们将PWM模式设置为1,输出状态设置为启用,输出极性设置为高电平,脉冲延迟设置为499。

最后,我们可以使用HAL_TIM_OC_Init和HAL_TIM_OC_ConfigChannel函数来初始化定时器的PWM通道3。

#include "pwm_breathing.h" #include <math.h> // ?????? __IO uint16_t period_class = 5; // ??????(???) uint16_t POINT_NUM = 200; // ?????? // ???? static uint16_t pwm_index = 0; // ??PWM?? static uint16_t sin_table[200]; // ???? /** * @brief ??????? * @param ? * @retval ? */ static void SinTable_Init(void) { for(uint16_t i = 0; i < POINT_NUM; i++) { // ?????? (??: 0~1000) // ??????????? sin_table[i] = (uint16_t)(500.0f * (1 + sinf(2 * M_PI * i / POINT_NUM))); } } /** * @brief ???PWM?????? * @param ? * @retval ? */ void TIMx_Breathing_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 1. ???? BRE_TIM_APBxClock_FUN(BRE_TIM_CLK, ENABLE); // ????? BRE_TIM_GPIO_APBxClock_FUN(BRE_TIM_GPIO_CLK, ENABLE); // GPIO?? // 2. GPIO?? GPIO_InitStructure.GPIO_Pin = BRE_TIM_LED_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // ?????? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BRE_TIM_LED_PORT, &GPIO_InitStructure); // 3. ?????(????) BRE_GPIO_REMAP_FUN(); // 4. ??????? TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); // ?????? TIM_TimeBaseStructure.TIM_Period = 999; // ARR? (PWM???=1000) TIM_TimeBaseStructure.TIM_Prescaler = 71; // 72MHz/(71+1)=1MHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(BRE_TIMx, &TIM_TimeBaseStructure); // 5. PWM???? TIM_OCStructInit(&TIM_OCInitStructure); // ?????? TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM??1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 0; // ?????0 BRE_TIM_OCxInit(BRE_TIMx, &TIM_OCInitStructure); // ??OC?? // 6. ???????? BRE_TIM_OCxPreloadConfig(BRE_TIMx, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(BRE_TIMx, ENABLE); // 7. ???? NVIC_InitStructure.NVIC_IRQChannel = BRE_TIMx_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 8. ?????? TIM_ITConfig(BRE_TIMx, TIM_IT_Update, ENABLE); // 9. ?????? SinTable_Init(); // 10. ????? TIM_Cmd(BRE_TIMx, ENABLE); } /** * @brief ????????? * @param ? * @retval ? */ void BRE_TIMx_IRQHandler(void) { if (TIM_GetITStatus(BRE_TIMx, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(BRE_TIMx, TIM_IT_Update); // ??PWM???(??????) switch(LIGHT_COLOR) { case RED_LIGHT: TIM3->CCR2 = sin_table[pwm_index]; break; case GREEN_LIGHT: TIM3->CCR3 = sin_table[pwm_index]; break; case BLUE_LIGHT: TIM3->CCR4 = sin_table[pwm_index]; break; } // ????(?????) pwm_index += period_class; if(pwm_index >= POINT_NUM) { pwm_index %= POINT_NUM; // ???????????? } } }
最新发布
06-10
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值