142 lines
4.7 KiB
C
142 lines
4.7 KiB
C
#include "Tim.h"
|
||
#include "Led.h"
|
||
#include "Key.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));
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
/**-------------------------------------------------------
|
||
* @函数名 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);
|
||
|
||
|
||
}
|