时钟初始化TIM2 在 APB2 总线上,需要使能时钟。TIM2 的通道 1 复用 PA0 引脚,需要使能 GPIOA 时钟。
/* Enable TIM. */
RCC_EnableAPB1Periphs(RCC_APB1_PERIPH_TIM2, true);
RCC_ResetAPB1Periphs(RCC_APB1_PERIPH_TIM2);
/* Enable GPIOA for TIM2_CH1. */
RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOA, true);
RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOA);
初始化输出引脚GPIO_Init_Type gpio_init;
gpio_init.Pins = GPIO_PIN_0;
gpio_init.PinMode = GPIO_PinMode_AF_PushPull;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio_init);
GPIO_PinAFConf(GPIOA, gpio_init.Pins, GPIO_AF_2);/* 根据data sheet, 配置复用模式2。 */
定时器时基配置TIM_32B_Init_Type tim_init;
tim_init.clockFreqHz = BOARD_TIM_32B_FREQ;/* 因为 TIM_32B 在APB2总线上,所以BOARD_TIM_32B_FREQ的值实际为APB2总线时钟频率。*/
tim_init.StepFreqHz = APP_TIM_UPDATE_PERIOD; /* 定时器周期时长为定时器周期长度Period加1后除定时器频率StepFreqHz。*/
tim_init.Period = APP_TIM_UPDATE_PERIOD - 1u; /* 所以可得值为1,也即定时器周期时长为1s。 */
tim_init.EnablePreloadPeriod = false; /* 不采用预装载,修改ARR寄存器将立即生效。 */
tim_init.PeriodMode = TIM_32B_PeriodMode_Continuous;/* 循环计时。 */
tim_init.CountMode = TIM_32B_CountMode_Increase; /* 递增计数。 */
TIM_32B_Init(BOARD_TIM_32B_PORT, &tim_init);
配置输出通道TIM_32B_OutputCompareConf_Type tim_outcomp_conf;
tim_outcomp_conf.ChannelValue = 0u;/* Compare value initialize with 0. */
tim_outcomp_conf.EnableFastOutput = false; /* Disable fast output. */
tim_outcomp_conf.EnablePreLoadChannelValue = false; /* Disable preload, put data immediately. */
tim_outcomp_conf.RefOutMode = TIM_32B_OutputCompareRefOut_FallingEdgeOnMatch;/*Generate a falling edge when matched.*/
tim_outcomp_conf.ClearRefOutOnExttrigger = false; /* Ext signal won't clear output. */
tim_outcomp_conf.PinPolarity = TIM_32B_PinPolarity_Rising;/* High polarity is valid. */
TIM_32B_EnableOutputCompare(BOARD_TIM_32B_PORT, BOARD_TIM_32B_CHANNEL, &tim_outcomp_conf);
使能计数器TIM_32B_Start(BOARD_TIM_32B_PORT);
main 函数main 函数将轮询键入,并按设定的占空比数组循环输出不同的 PWM 波。
int main(void)
{
BOARD_Init();
printf("
tim_32b_output_compare_pwm.
");
/* Setup the timer. */
app_tim_32b_init();
printf("press any key to change the pwm ...
");
while (1)
{
for (uint32_t i = 0; i < APP_TIM_32B_PWM_NUM; i++)
{
getchar();
TIM_32B_PutChannelValue(BOARD_TIM_32B_PORT, BOARD_TIM_32B_CHANNEL, app_tim_32_pwm_val);/* Change duty cycle. */
printf("PWM value: %u
", (unsigned)app_tim_32_pwm_val);
}
}
}
实验结果将 TIM2 通道1 所在引脚用杜邦线与小灯泡引脚相连,可以实现呼吸灯的效果。因为每次键入,都会改变 pwm 波的占空比,所以小灯泡的亮度在不断改变:
|