1. 实验目的
使用 TIM14 的通道 1 来产生 PWM 控制 LED0(DS0) 的亮度。
2. 实验准备和流程
由上图可以看出,GPIOF9引脚对应的是定时器TIM14的通道1。
由上图可以看出,GPIOF9引脚对应的是LED0。
具体的流程如下:
初始化定时器;
编写main函数。
2.1 初始化定时器
static void ADANCE_TIM_GPIO_Config(void){
GPIO_InitTypeDef GPIO_InitStructure; //GPIO的结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定时器时基结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能GPIOF时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); // TIM14时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHZ高速
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化GPIO的引脚
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); // GPIOA9复用为定时器14
//时基初始化
TIM_TimeBaseStructure.TIM_Prescaler = 84-1; // 定时器分频84M/84=1MHZ
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period = 500 - 1; // 自动重装载值500
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割,时钟分频因子,配置死区时间的时候用到 ,这里是1分频,就是84M, TIM_CKD_DIV1 ((uint16_t)0x0000)
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数器的值,没有用到
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure); //初始化定时器 14
}
//定时器模式配置
static void ADVANCE_TIM_MODE_Config(void){
TIM_OCInitTypeDef TIM_OCInitStructure; //时钟输出比较结构体
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能,输出正通道
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出通道电平极性配置
TIM_OC1Init(TIM14, &TIM_OCInitStructure); //这里是用的通道1 ,互补通道不需要初始化,因为是两个通道是通道1分出去的
TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable); //自动重装载,arr计数到以后清零
TIM_ARRPreloadConfig(TIM14,ENABLE); //ARPE 使能
TIM_Cmd(TIM14, ENABLE);//使能计数器
}
void ADVANCE_TIM_Init(void){
ADANCE_TIM_GPIO_Config();
ADVANCE_TIM_MODE_Config();
}
2.2 编写main函数
int main(void)
{
u16 value=0;
u8 dir=1;
USART_Config();
delay_init(168); //初始化延时函数
LED_GPIO_Config();
ADVANCE_TIM_Init();
while(1){
delay_ms(10);
if(dir){
value++; //dir==1 value递增
}else{
value--; //dir==0 value递减
}
if(value>300){ //value到达300后,方向为递减
dir=0;
}
if(value==0){
dir=1; //value减到0后,方向改为递增
}
TIM_SetCompare1(TIM14,value); //修改比较值(CCR),修改占空比
}
}
3. 实验结果
pwm