ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

定时器中断实现灯的亮灭

2022-02-20 13:33:24  阅读:168  来源: 互联网

标签:定时器 优先级 TIM 中断 NVIC 实现 事件


定时器中断功能

什么是中断事件

结合生活实际 讲解中断概念

例子:你在上班 ,突然来了个电话  妈妈说有急事 老板也突然叫你去出差
 不管怎么样 最后你就继续回公司上班了。
事件:你在上班
触发中断事件:电话
中断事件 :去妈妈那里解决好急事
中断事件 :去出差
其实中断事件 就是 你在做一个事件 然后突然跑去做新的事件 
这时的事件 就可以叫做 中断事件  
触发中断事件 :原来事件到新事件产生过程的条件

定时器简介

通用定时器的简单了解

定时器是一个通过可编程的16位自动装载计数器构成的。
大多用于测量输入捕获或者输出比较和pwm的周期时间 。

定时器的功能包括
1向上计数模式 向下计数模式 中央对齐计数模式
在这里插入图片描述

向上计数模式 :计数器 从0 开始 增加 到ARR(自动加载值) 最后重新从0开始计数  并且会产生一个溢出时间  
 也就是说  增加到了ARR 的值 后 会马上清零 清零的同时 会产生一个新的事件发生。
 向下计数模式 :和向下计数模式相反
 中央对齐模式
 计数器从0开始计数到ARR==-1 产生一个新的周期事件,然后向下计数到1同时产生一个计数器溢出事件,最后再从0开始计数
 

结构体介绍

用到的定时器中断部分结构体

typedef struct
{
  uint16_t TIM_Prescaler;     //预分频系数                                 
  uint16_t TIM_CounterMode;     //计数模式                                     
  uint16_t TIM_Period;       //自动重装载值
  uint16_t TIM_ClockDivision;     // 定时器中断事件配置
 }
TIM_TimeBaseInitTypeDef;  

硬件展示

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

软件设计

1)接线
32的 PA10(RX) ----- —ttl转use 的tx
32的PA9 (tx) -----------ttl转 use的rx
32的GND----------------GND
VCC(3.3或者5)----VCC(3.3或者5)
2)下载配置
在这里插入图片描述

因为ttl转 use 是一个串口 下载器 要生成hex
3)对应软件
在这里插入图片描述

特别注意 如果没有选完红色框框的内容 就可能会出错

中断事件的补充讲解

上面讲了产生中断的条件 发生的中断事件的大概过程 但是这里有一个问题 
如果是 产生了两个中断事件 这时你必须只能选择 做完 一件 
再去做第二件中断事件 这时就延伸出了中断 优先级的概念

中断优先级

优先级图表
在这里插入图片描述

32 中 一共有 5个优先级组  
一个优先级 组 分为 父优先级 和子优先级
优先级大小 0-15  0最大 依次减少等级

优先级组结构体配置

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

优先级对应的定时器结构体配置

   NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;

父优先级结构体配置

 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;

子优先级结构体配置

 NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;

定时器的计算

/* 
Tout= (¨ARR(自动装载值)*psc(预分频系数))/频率
Tout= (¨TIM_Period*TIM_Prescaler£)/36 000 000 
Tout是算出定时器中断溢出的的周期持续时间
因为 TIM2 是在 APB1总线上的  所以对应的 频率是 36000000=36兆的
*/

代码

tim.c 定时器函数

#include "stm32f10x.h"
#include "tim.h"
/* 
Tout=£¨TIM_Period*TIM_Prescaler£©/36 000 000 
*/


void tim_init(void)
{
	
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;

RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE);

TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_IT_Update;//定时器中断
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;// 向上计数模式
TIM_TimeBaseInitStruct.TIM_Period=5000-1;// 自动装载值
TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;// 预分频系数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//初始化
TIM_Cmd(TIM2,ENABLE);//使能
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//  允许更新中断源
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 优先级组2
NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;// 对应的定时器2优先级
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;// 父优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;// 子优先级
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;// 使能
NVIC_Init(&NVIC_InitStruct);// 初始化
}

main.c+定时器中断函数

#include "stm32f10x.h"
#include "main.h"
#include "tim.h"
#include "rxt.h"
#include "LED.h"

void  main(void)
{

	tim_init();
	rxt_init();
	LED_init();
   GPIO_SetBits(GPIOC, GPIO_Pin_13);//初始化灯为灭的状态
   while(11); 
}


void TIM2_IRQHandler(void)
{
	 static unsigned  int temp; //静态变量 防止重复使用

	if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
	 
 {
	 
	 if(temp++%2==1)//产生一个周期 就亮
	 { 
		 GPIO_ResetBits(GPIOC, GPIO_Pin_13); 
	 }
	 
	 else//产生下一个周期事件就 灭 
	 {
	   GPIO_SetBits(GPIOC, GPIO_Pin_13 );
	 }
		 	 
 }

 TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //每执行完一次
                                          // 就清除中断标志位
 

}

最后你们

可以去试试 

标签:定时器,优先级,TIM,中断,NVIC,实现,事件
来源: https://blog.csdn.net/weixin_59349642/article/details/123028503

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有