#有奖活动# #申请原创# @21ic小管家 【CH32X035评估板测评】+3、基于定时器的呼吸灯实现 1、程序解读
这段程序主要实现了使用 TIM1 定时器和 PWM 输出模式来控制 GPIOB 引脚 9 的 PWM 输出。
下面是对程序的详细总结:
定义了一些宏,包括 PWM_MODE1 和 PWM_MODE2,用于选择 PWM 输出模式,以及 PWM_SPE_MODE_DISABLE 和 PWM_SPE_MODE_ENABLE,用于选择 PWM 特殊模式。
TIM1_PWMOut_Init 函数用于初始化 TIM1 定时器和 PWM 输出。首先使能 GPIOB 和 TIM1 的时钟。然后配置 GPIOB 引脚 9 为复用推挽输出模式,设置输出速度为 50MHz。接着配置 TIM1 定时器的周期、预分频器、时钟分割和计数模式。根据宏定义的 PWM_MODE,选择 PWM 输出模式为 PWM1 或 PWM2。设置 PWM 输出状态为使能,设置 PWM 脉冲宽度为 ccp,设置 PWM 输出极性为高电平。如果宏定义的 PWM_SPE_MODE 为使能,则启用 PWM 特殊模式。最后使能 TIM1 的 PWM 输出,配置 TIM1 的 PWM 输出预装载和 ARR 预装载,使能 TIM1 定时器。
在 main 函数中,首先更新系统时钟和初始化串口。然后打印系统时钟和芯片 ID。调用 TIM1_PWMOut_Init 函数初始化 TIM1 定时器和 PWM 输出。最后进入一个无限循环。
总体而言,这段程序使用 TIM1 定时器和 PWM 输出模式来控制 GPIOB 引脚 9 的 PWM 输出。通过配置定时器的周期、预分频器和 PWM 脉冲宽度,可以控制 PWM 输出的频率和占空比。
2、程序
#include "debug.h"
#define PWM_MODE1 0
#define PWM_MODE2 1
#define PWM_MODE PWM_MODE1
#define PWM_SPE_MODE_DISABLE 0
#define PWM_SPE_MODE_ENABLE 1
#define PWM_SPE_MODE PWM_SPE_MODE_DISABLE
void TIM1_PWMOut_Init(u16 arr, u16 psc, u16 ccp)
{
GPIO_InitTypeDef GPIO_InitStructure={0};
TIM_OCInitTypeDef TIM_OCInitStructure={0};
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOB, &GPIO_InitStructure );
TIM_TimeBaseInitStructure.TIM_Period = arr;
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);
#if (PWM_MODE == PWM_MODE1)
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
#elif (PWM_MODE == PWM_MODE2)
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
#endif
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = ccp;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init( TIM1, &TIM_OCInitStructure );
#if (PWM_SPE_MODE == PWM_SPE_MODE_ENABLE)
TIM_OC12_SupersedeModeCmd( TIM1, TIM_Supersede_Mode_OC1_H, TIM_Supersede_Mode_OC2_H, ENABLE);
#endif
TIM_CtrlPWMOutputs(TIM1, ENABLE );
TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Disable );
TIM_ARRPreloadConfig( TIM1, ENABLE );
TIM_Cmd( TIM1, ENABLE );
}
int main(void)
{
SystemCoreClockUpdate();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n",SystemCoreClock);
printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
TIM1_PWMOut_Init( 100, 48000-1, 20 );
while(1);
}
3、现象
|