- /*
- * [url=/u/brief]@brief[/url] PWM引脚初始化
- *
- * @param None
- *
- * @retval None
- *
- */
- static void bsp_tim_pwm_gpio_init(void)
- {
- GPIO_Config_T gpioConfig;
-
- /* PA8 -> TMR1_CH1
- * PA9 -> TMR1_CH2
- * PA10 -> TMR1_CH3
- * PA11 -> TMR1_CH4
- *
- * PB12 -> TMR1_BKIN
- * PB13 -> TMR1_CH1N
- * PB14 -> TMR1_CH2N
- * PB15 -> TMR1_CH3N
- */
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB);
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11;
- gpioConfig.mode = GPIO_MODE_AF;
- gpioConfig.outtype = GPIO_OUT_TYPE_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_NO;
- GPIO_Config(GPIOA, &gpioConfig);
- gpioConfig.pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
- GPIO_Config(GPIOB, &gpioConfig);
-
- GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_8, GPIO_AF_PIN2);
- GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_9, GPIO_AF_PIN2);
- GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_10, GPIO_AF_PIN2);
- GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_11, GPIO_AF_PIN2);
- GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_12, GPIO_AF_PIN2);
- GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_13, GPIO_AF_PIN2);
- GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_14, GPIO_AF_PIN2);
- GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_15, GPIO_AF_PIN2);
- }
- /*
- * @brief 定时器初始化
- *
- * @param ms: 定时间隔
- *
- * @retval None
- *
- */
- void bsp_tim_init(uint16_t ms)
- {
- TMR_TimeBase_T timeBaseConfig;
- TMR_OCConfig_T OCcongigStruct;
- TMR_BDTInit_T BDTStruct;
-
- /* 寄存器AUTORLD为16bit */
- if ((ms >= 1) && (ms <= 6553)) {
- bsp_tim_pwm_gpio_init();
-
- /* 定时器周期 */
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR1);
- TMR_Reset(TIM_INS);
- TMR_ConfigTimeBaseStruct(&timeBaseConfig);
- /* CK_CNT=fCK_PSC/(PSC+1) */
- timeBaseConfig.div = 7200 - 1; /* 10KHz */
- timeBaseConfig.period = (ms * 10) - 1;
- timeBaseConfig.clockDivision = TMR_CKD_DIV1;
- timeBaseConfig.counterMode = TMR_COUNTER_MODE_UP;
- timeBaseConfig.repetitionCounter = 0;
- TMR_ConfigTimeBase(TIM_INS, &timeBaseConfig);
-
- /* PWM */
- DUTY_100 = timeBaseConfig.period;
- TMR_OCConfigStructInit(&OCcongigStruct);
- /* PWM 模式 1(计数器值 < 输出比较值时置为高,否则反之) */
- OCcongigStruct.OC_Mode = TMR_OC_MODE_PWM1;
- /* 输出使能 */
- OCcongigStruct.OC_OutputState = TMR_OUTPUT_STATE_ENABLE;
- /* 互补输出使能 */
- OCcongigStruct.OC_OutputNState = TMR_OUTPUT_NSTATE_ENABLE;
- /* 默认50%占空比 */
- OCcongigStruct.Pulse = (DUTY_100 + 1) / 2;
- OCcongigStruct.OC_Polarity = TMR_OC_POLARITY_HIGH;
- OCcongigStruct.OC_NPolarity = TMR_OC_NPOLARITY_HIGH;
- OCcongigStruct.OC_Idlestate = TMR_OCIDLESTATE_RESET;
- OCcongigStruct.OC_NIdlestate = TMR_OCNIDLESTATE_RESET;
- TMR_OC1Config(TIM_INS, &OCcongigStruct);
- TMR_OC2Config(TIM_INS, &OCcongigStruct);
- TMR_OC3Config(TIM_INS, &OCcongigStruct);
- TMR_OC4Config(TIM_INS, &OCcongigStruct);
- /* 使能预装载功能: 写入比较寄存器CC的值在更新事件后才起作用 */
- TMR_OC1PreloadConfig(TIM_INS, TMR_OC_PRELOAD_ENABLE);
- TMR_OC2PreloadConfig(TIM_INS, TMR_OC_PRELOAD_ENABLE);
- TMR_OC3PreloadConfig(TIM_INS, TMR_OC_PRELOAD_ENABLE);
- TMR_OC4PreloadConfig(TIM_INS, TMR_OC_PRELOAD_ENABLE);
- /* 刹车 */
- TMR_ConfigBDTStructInit(&BDTStruct);
- BDTStruct.RMOS_State = TMR_RMOS_STATE_DISABLE;
- BDTStruct.IMOS_State = TMR_IMOS_STATE_DISABLE;
- BDTStruct.lockLevel = TMR_LOCK_LEVEL_OFF;
- /* 定时器时钟源为72MHz, 死区时间1us = 72 */
- BDTStruct.deadTime = 72;
- /* 使能刹车功能 */
- BDTStruct.breakState = TMR_BREAK_STATE_ENABLE;
- /* 刹车信号高电平有效 */
- BDTStruct.breakPolarity = TMR_BREAK_POLARITY_HIGH;
- /* 刹车信号无效时自动恢复输出 */
- BDTStruct.automaticOutput = TMR_AUTOMATIC_OUTPUT_ENABLE;
- TMR_ConfigBDT(TIM_INS, &BDTStruct);
- /* 不使能刹车信号无效自动恢复输出功能时,需调用此函数手动开启互补输出 */
- // TMR_EnablePWMOutputs(TIM_INS);
-
- /* 使能更新中断 */
- TMR_EnableInterrupt(TIM_INS, TMR_INT_UPDATE);
- /* 使能刹车中断 */
- TMR_EnableInterrupt(TIM_INS, TMR_INT_BRK);
- /* 使能中断 */
- NVIC_SetPriority(TMR1_BRK_UP_TRG_COM_IRQn, 0);
- NVIC_EnableIRQ(TMR1_BRK_UP_TRG_COM_IRQn);
-
- /* 使能定时器 */
- TMR_Enable(TIM_INS);
- }
- }
- /*
- * @brief 中断
- *
- * @param None
- *
- * @retval None
- *
- */
- void TMR1_BRK_UP_TRG_COM_IRQHandler(void)
- {
- /* 更新标志 */
- if (TMR_ReadIntFlag(TIM_INS, TMR_INT_FLAG_UPDATE) == SET) {
- TMR_ClearIntFlag(TIM_INS, TMR_INT_FLAG_UPDATE);
- (tim_update_deal_func != NULL) ? tim_update_deal_func() : NULL;
- }
- /* 刹车标志 */
- if (TMR_ReadIntFlag(TIM_INS, TMR_INT_FLAG_BRK) == SET) {
- TMR_ClearIntFlag(TIM_INS, TMR_INT_FLAG_BRK);
- }
- }
- /*
- * @brief 定时器更新处理函数注册
- *
- * @param func: 定时器更新中断处理函数
- *
- * @retval None
- *
- */
- void bsp_tim_update_deal_func_register(tim_update_deal_func_f func)
- {
- tim_update_deal_func = func;
- }
- /*
- * @brief PWM占空比设置
- *
- * @param duty1: PWM1占空比
- * duty2: PWM2占空比
- * duty3: PWM3占空比
- * duty4: PWM4占空比
- *
- * @retval None
- *
- */
- void bsp_pwm_duty_set(uint8_t duty1, uint8_t duty2, uint8_t duty3, uint8_t duty4)
- {
- (duty1 <= 100) ? \
- TMR_SetCompare1(TIM_INS, (DUTY_100 + 1) * duty1 / 100) : NULL;
- (duty2 <= 100) ? \
- TMR_SetCompare2(TIM_INS, (DUTY_100 + 1) * duty2 / 100) : NULL;
- (duty3 <= 100) ? \
- TMR_SetCompare3(TIM_INS, (DUTY_100 + 1) * duty3 / 100) : NULL;
- (duty4 <= 100) ? \
- TMR_SetCompare4(TIM_INS, (DUTY_100 + 1) * duty4 / 100) : NULL;
- }
测试代码如下:
- /* 占空比 */
- uint8_t pwm1_duty = 20;
- uint8_t pwm2_duty = 40;
- uint8_t pwm3_duty = 60;
- uint8_t pwm4_duty = 80;
- void test_gpio_init(void)
- {
- GPIO_Config_T gpioConfig;
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.pin = GPIO_PIN_5;
- gpioConfig.mode = GPIO_MODE_OUT;
- gpioConfig.outtype = GPIO_OUT_TYPE_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_NO;
- GPIO_Config(GPIOA, &gpioConfig);
- }
- void test_gpio_toggle(void)
- {
- (GPIO_ReadOutputBit(GPIOA, GPIO_PIN_5) == BIT_SET) ? \
- GPIO_ClearBit(GPIOA, GPIO_PIN_5) : \
- GPIO_SetBit(GPIOA, GPIO_PIN_5);
- }
- // 应用初始化
- void app_init(void)
- {
- test_gpio_init();
- bsp_tim_update_deal_func_register(test_gpio_toggle);
- bsp_tim_init(100);
- }
- // 应用任务
- void app_task(void)
- {
- bsp_pwm_duty_set(pwm1_duty, pwm2_duty, pwm3_duty, pwm4_duty);
- }
详细代码,请查看附件!
PWM_TIM1.zip
(2.14 MB, 下载次数: 0)