| #申请原创# 从原理图上挑了两个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.
 
 
 |