a) 目的:基础PWM输出,以及中断配合应用。输出选用PB1,配置为TIM3_CH4,是目标板的LED6控制脚。 b) 对于简单的PWM输出应用,暂时无需考虑TIM1的高级功能之区别。 c) 初始化函数定义: void TIM_Configuration(void); //定义TIM初始化函数 d) 初始化函数调用: TIM_Configuration(); //TIM初始化函数调用 e) 初始化函数,不同于前面模块,TIM的初始化分为两部分——基本初始化和通道初始化: void TIM_Configuration(void)//TIM初始化函数 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构 TIM_OCInitTypeDef TIM_OCInitStructure;//通道输出初始化结构
//TIM3初始化 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //周期0~FFFF TIM_TimeBaseStructure.TIM_Prescaler = 5; //时钟分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //基本初始化 TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);//打开中断,中断需要这行代码 //TIM3通道初始化 TIM_OCStructInit(& TIM_OCInitStructure); //默认参数 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //工作状态 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //设定为输出,需要PWM输出才需要这行代码 TIM_OCInitStructure.TIM_Pulse = 0x2000; //占空长度 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //高电平 TIM_OC4Init(TIM3, &TIM_OCInitStructure); //通道初始化
TIM_Cmd(TIM3, ENABLE); //启动TIM3 }
f) RCC初始化函数中加入TIM时钟开启: RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM3, ENABLE); g) GPIO里面将输入和输出管脚模式进行设置。信号:AF_PP,50MHz。 h) 使用中断的话在NVIC里添加如下代码:
//打开TIM2中断 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//占先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启动 NVIC_Init(&NVIC_InitStructure); //初始化
中断代码: void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET) //判断中断来源 { TIM_ClearITPendingBit(TIM2, TIM_IT_CC4); //清除中断标志 GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_11)));//变换LED色彩 IC4value = TIM_GetCapture4(TIM2); //获取捕捉数值 } }
i) 简单应用: //改变占空比 TIM_SetCompare4(TIM3, 变量);
j) 注意事项: 管脚的IO输出模式是根据应用来定,比如如果用PWM输出驱动LED则应该将相应管脚设为AF_PP,否则单片机没有输出。 |