关于STM32定时器1的使用
来源:互联网 发布:淘宝确认自动收货时间 编辑:程序博客网 时间:2024/05/16 06:08
作为高级定时器,它的使用与通用定时器相比,使用起来比较复杂,它的功能也比较强大。它也可以当通用定时器使用,但是方法略有不同:
void TIM1_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
//TIM_OCInitTypeDef TIM_OCInitStructure; //比较PWM的时候用。
//TIM1 使用内部时钟
//TIM_InternalClockConfig(TIM1);
//TIM1基本设置
//设置预分频器分频系数71,即APB2=72M, TIM1_CLK=72/72=1MHz
//TIM_Period(TIM1_ARR)=1000,计数器向上计数到1000后产生更新事件,计数值归零
//向上计数模式
//TIM_RepetitionCounter(TIM1_RCR)=0,每次向上溢出都产生更新事件
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(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
//清中断,以免一启用中断后立即产生中断
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
//使能TIM1中断源
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
//Step3.中断NVIC设置:允许中断,设置优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //更新事件
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断
NVIC_Init(&NVIC_InitStructure); //写入设置
//TIM1总开关:开启
// TIM_Cmd(TIM1, ENABLE);
}
//定时器1中断
void TIM1_UP_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查TIM2更新中断发生与否
{
TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断
ResetTime++;
}
}
这是我刚开始使用的时候,发现的问题是定时器1能使用,但是我把TIM3和它初始化一样的时候发现,时间跑起来居然慢了接近三倍,后来在网上查资料查了好久,也不知道原因最后找到需要加一条语句: TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; 在高级定时器中需要清零,在通用中可以不使用...
然后时间就了。
整体如下:
void TIM1_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
//TIM_OCInitTypeDef TIM_OCInitStructure; //比较PWM的时候用。
//TIM1 使用内部时钟
//TIM_InternalClockConfig(TIM1);
//TIM1基本设置
//设置预分频器分频系数71,即APB2=72M, TIM1_CLK=72/72=1MHz
//TIM_Period(TIM1_ARR)=1000,计数器向上计数到1000后产生更新事件,计数值归零
//向上计数模式
//TIM_RepetitionCounter(TIM1_RCR)=0,每次向上溢出都产生更新事件
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_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数器计数器清零
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
//清中断,以免一启用中断后立即产生中断
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
//使能TIM1中断源
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
//Step3.中断NVIC设置:允许中断,设置优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //更新事件
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断
NVIC_Init(&NVIC_InitStructure); //写入设置
//TIM1总开关:开启
// TIM_Cmd(TIM1, ENABLE);
}
//定时器1中断
void TIM1_UP_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查TIM2更新中断发生与否
{
TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断
ResetTime++;
}
}
- 关于STM32定时器1的使用
- 关于stm32定时器的理解
- 关于STM32定时器
- stm32 基本定时器TIM6、TIM7的使用
- 关于STM32定时器使用的一个注意事项(以此为前车之鉴,重要!)
- 关于STM32的systick定时器的详细说明
- 关于STM32的systick定时器的详细说明
- 关于STM32的systick定时器的详细说明
- 关于STM32的SysTick定时器的时钟选择问题
- 关于STM32的systick定时器的详细说明
- stm32的定时器使用方法
- STM32的定时器
- STM32的定时器学习
- stm32的Systick定时器
- STM32的通用定时器
- STM32的定时器中断
- stm32的定时器
- STM32的Systick定时器
- Ubuntu Server 12.04“初始化月份字符串出错”的解决方法
- 蚂蚁杆子问题
- 修改计算机名后导致oracle的oem(企业管理器)无法使用
- andriod 生成xml文件 方法
- NSLookup用法
- 关于STM32定时器1的使用
- Codeforces —— 359A Table
- SPI协议概括
- 大数相乘解决办法,用字符串表示的大数
- 解決 Android 平板無法直接寫入外部 SDCard 問題
- Android 视频截图
- JS利用CSS3 transform rotate 实现旋转转盘或背景(大转盘抽奖)
- WIP基础知识
- UVa 10375 Choose and divide (组合数相除)