#include "Tim.h" #include "Led.h" #include "Key.h" #include "bsp_usart.h" #include "bsp_adc.h" u8 leddat = 3; /**------------------------------------------------------- * @函数名 TIM2_INIT * @功能 通用定时器2中断初始化 * @参数 arr:自动重装值。psc:时钟预分频数 * @返回值 无 ***------------------------------------------------------*/ void TIM2_INIT(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能 //定时器TIM2初始化 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断 //中断优先级NVIC设置 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 TIM_Cmd(TIM2, ENABLE); //使能TIMx } /**------------------------------------------------------- * @函数名 TIM2_IRQHandler * @功能 定时器2中断服务程序 * @返回值 无 ***------------------------------------------------------*/ void TIM2_IRQHandler(void) //TIM2中断 { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM2更新中断发生与否 { TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中断标志 if(flag){ //LED_OFF(); LED_ON(leddat<3?++leddat:(leddat=0)); }else{ LED_ON(leddat>0?--leddat:(leddat=3)); } if(!flag){ int ADC_Value = ADC_ConvertedValue; int Voltage = ADC_Value*3.3/0x0fff*100; int Pos = Voltage/3.3; TIM_SetCompare2(TIM3,ADC_Value); printf("\r\n ADC_Value: %d",ADC_Value); printf("\r\n Voltage: %d.%d%dV",Voltage/100,(Voltage%100)/10,Voltage%10); printf("\r\n POS: %d%d%c",(Pos%100)/10,Pos%10,'%'); } } } /**------------------------------------------------------- * @函数名 TIM3_PWM_INIT * @功能 TIM3 PWM部分初始化 * @参数 arr:自动重装值。psc:时钟预分频数 * @返回值 无 ***------------------------------------------------------*/ void TIM3_PWM_INIT(u16 arr,u16 psc) { // 开启定时器时钟,即内部时钟CK_INT=72M RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; /* 使能时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能对应端口时钟 /*---------------------GPIO_A7初始化 START----------------------------------------*/ /* 初始化LED的GPIO管脚,配置为推挽输出 */ //设置端口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //LED灯对应的GPIO_Pin_0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最大输出速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //调用GPIO初始化函数 /*---------------------GPIO_A15初始化 END----------------------------------------*/ /*--------------------时基结构体初始化-------------------------*/ // 配置周期,这里配置为100K TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断 TIM_TimeBaseStructure.TIM_Period=arr; // 驱动CNT计数器的时钟 = Fck_int/(psc+1) TIM_TimeBaseStructure.TIM_Prescaler= psc; // 时钟分频因子 ,配置死区时间时需要用到 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 计数器计数模式,设置为向上计数 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 重复计数器的值,没用到不用管 TIM_TimeBaseStructure.TIM_RepetitionCounter=0; // 初始化定时器 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /*--------------------输出比较结构体初始化-------------------*/ // 占空比配置 uint16_t CCR2_Val = 4; TIM_OCInitTypeDef TIM_OCInitStructure; // 配置为PWM模式1 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 输出使能 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出通道电平极性配置 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出比较通道 2 TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // 使能计数器 TIM_Cmd(TIM3, ENABLE); }