#申请原创# 从原理图上挑了两个SLCD没用到的脚,PA0,PA1,用来做PWM的波形输出。因为想继续用SLCD来显示时间和温度。
可以看到,PA0,PA1的 AF2的功能是TIM4的CH1,CH2。
控制TIM4计时器定时1ms一个周期,每个周期和ARR的值比较并输出波形。
TIM4的代码如下:
//PA0-TIM4_CH1
//PA1-TIM4_CH2
void TIM4_PWM_Init(u16 arr, u16 psc)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
RCC_GPIO_ClockCmd(GPIOA, ENABLE);
//PA0
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_2);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//PA1
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_2);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM4, ENABLE);
TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);
TIM_TimeBaseStruct.TIM_Period = arr;
TIM_TimeBaseStruct.TIM_Prescaler = psc;
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStruct);
//CH1,CH2
TIM4->CCMR1 |= 0x6060; //PWM1
TIM4->CCER |= 0x0011;
TIM4->CCR1 = arr*1/10;
TIM4->CCR2 = arr*1/5;
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM4, ENABLE);
TIM_CtrlPWMOutputs(TIM4, ENABLE);
TIM_Cmd(TIM4, ENABLE);
}
void timer_init(void)
{
//1ms
TIM4_PWM_Init(800, 60-1);
//10ms
TIM16_Init(8000, 60-1);
//1ms
TIM17_Init(800, 60-1);
}
CH1输出占空比1/10的PWM,CH2输出占空比1/5的PWM。
输出波形如下:
测量波形与代码逻辑一致。
OK.
|