青风带你学stm32f051系列教程 第6课 通用定时器中断 | 爱板网 stm32 定时器中断
2012年12月21日 ? 教程 ? 评论数 4 ? 被围观 941+
第6课 通用定时器中断
Time定时器可以进行精确定时,并且通过TIME进行中断触发,在精确控制方面具有很好的优势。本实验采用了TIM3作为定时器,控制2路LED灯翻转。下面将从软硬件入手,分析如何通过STM32F0的定时器进行定时触发中断,从而控制LED灯的亮灭。首先是软件方面:
软件准备:
打开keil编译环境,设置系统工程树如图所示:
如上图所示,在lib库函数调用了stm32f0xx.tim.c函数库,我们在驱动函数time.c中编写定时器输出的相关参量设置。而中断执行函数则在stm32f0xx_it.c函数中进行编写;
配置TIM3的定时中断我们可以分成两个部分完成:
第一步:首先是配置TIM的中断嵌套,代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
void TIM_INT_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* TIM3 时钟使能 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* TIM3 中断嵌套设计*/
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
上面函数中,设置中断通道为TIM3中断,频道优先级设为0,并且使能频道。这样就配置好了TIM3中断嵌套。当然中断要执行的操作要在stm32f0xx_it.c进行编写,这个等下我们再讲,我们先把TIM3的参数配置进行讨论:
首先来看看TIM定时器的基础配置参数,这个参数的配置要求在文件stm32f0xx_tim.c中进行了描述,通过如下的结构体单元进行了归纳:
1
2
3
4
5
6
7
8
typedef struct
{
uint16_t TIM_Prescaler; /*!指定用来划分TIM时钟预分频值*/
uint16_t TIM_CounterMode; /*!指定的计数器模式*/
uint32_t TIM_Period; /*设置时钟周期 */
uint16_t TIM_ClockDivision; /*设定时钟分频 */
uint8_t TIM_RepetitionCounter; /*指定重复计数器值 */
} TIM_TimeBaseInitTypeDef;
上面的结构体参数就是设置TIME的基础参数,下面我们就来确定这几个参数的设置:
1
2
3
4
5
6
/* Time 定时器基础设置 */
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_Prescaler设置预分频为0,也就是不预分频。那么系统时钟我们设置为48MHZ,那么TIM定时器也跑在了48MHZ。而TIM_ClockDivision我们设为0,也就是不进行时钟分频。TIM _CounterMode设置为向上计数。TIM计数时钟为6MHZ,那么翻转率按照下面公式继续计算
CC3 翻转率 = TIM3 counter clock / CCR3_Val
CC4 翻转率= TIM3 counter clock / CCR4_Val
配置完基础配置后,CC3和CC4的翻转要通过输入捕获实现定时器的翻转,而定时器输入比较模式通过下面的结构体进行配置:
1
2
3
4
5
6
7
8
9
10
11
typedef struct
{
uint16_t TIM_OCMode; /*!指定的TIM模式 */
uint16_t TIM_OutputState; /*指定的TIM输出比较状态 */
uint16_t TIM_OutputNState; /*指定TIM互补的输出比较状态. */
uint32_t TIM_Pulse; /*指定的脉冲值被装入到捕获比较寄存器*/
uint16_t TIM_OCPolarity; /*指定的脉冲值被装入到捕捉比较寄存器 */
uint16_t TIM_OCNPolarity; /*指定的互补输出极性 */
uint16_t TIM_OCIdleState; /*指定在空闲状态下的TIM输出比较引脚的状态 */
uint16_t TIM_OCNIdleState; /*指定在空闲状态下的互补TIM输出比较引脚的状态. */
} TIM_OCInitTypeDef;
对上面的产生配置如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 输出比较时序模式配置设置 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
/* 输出比较时序模式配置: 频道3*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);
/* 输出比较时序模式配置: 频道4 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);
/* TIM 中断使能 */
TIM_ITConfig(TIM3, TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
/* TIM3 使能 */
TIM_Cmd(TIM3, ENABLE);
那么中断我们则执行LED是翻转工作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
/* LED3 toggling with frequency = 219.7 Hz */
LED1_Toggle();
capture = TIM_GetCapture3(TIM3);
TIM_SetCompare3(TIM3, capture + CCR3_Val);
}
else
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
/* LED4 toggling with frequency = 439.4 Hz */
LED2_Toggle();
capture = TIM_GetCapture4(TIM3);
TIM_SetCompare4(TIM3, capture + CCR4_Val);
}
}
主函数的编写就较为简单了,直接调用子函数输出:
1
2
3
4
5
6
7
8
9
10
11
12
int main(void)
{
LED_Init();
LED1_Open();
LED2_Open();
TIM_INT_Config();
TIM_OUT_Config();
/* Infinite loop */
while (1)
{
}
}
硬件准备:
只需要连接2个LED灯,就可以实现TIM捕获定时了:
更多阅读
韩语 第21课-韩国明星组合-独特打招呼方法 韩语打招呼
#BC教你学韩语#【第21课-韩国明星组合-独特打招呼方法】一起看看、听听#少女时代#、#神话#、#2NE1#、#SHINee#、#SuperJunior#、#2PM#、#BEAST#韩星组合的打招呼方法吧小编辛苦编辑的噢!
《新概念》与《赖世雄美语从头学》系列教程之比较 赖世雄美语从头学2014
说一下我的情况:工作几年了,英语几乎已经荒废到初中一年级的水平。准备从头抓起,上周刚刚学完《赖世雄精准美国英语音标发音指南》,收获非常大。本来我还在因为喜欢“美音”但是不得不去学习人人推荐的“英音”版《新概念》而苦恼。突然
洪恩教你学电脑视频教程详情 洪恩学电脑
洪恩老兔教你学电脑视频教程详情在线播放地址: [ 无需安装任何插件 ]洪恩老兔教你学电脑01洪恩老兔教你学电脑02洪恩老兔教你学电脑03洪恩老兔教你学电脑04
洪恩老兔教你学电脑视频教程 洪恩老兔36集视频观看
名称:洪恩老兔教你学电脑视频教程洪恩老兔教你学电脑01洪恩老兔教你学电脑02洪恩老兔教你学电脑03洪恩老兔教你学电脑04洪恩老兔教你
新手学电脑视频教程《洪恩教你学电脑》全36集 | 西东网视频教 洪恩学电脑
新手学电脑视频教程《洪恩教你学电脑》(全36集)新手学电脑《洪恩教你学电脑》教程是一个电脑入门教程,适合零基础的刚刚开始学习电脑的电脑新手,主讲人洪恩很细致地从最简单的菜单使用讲起,一共从五大方面把电脑初级知识全部扫盲。这五个