DAY04-中断和定时器

130 阅读4分钟

www.bilibili.com/video/BV1DS… 教程

4.外部中断源

(1)特性 image.png

(2)EXTI处理框图

image.png

(3)外部中断源的映射

image.png

注:GPIO口设置为外部中断时需要配置成输入模式

5.编程实现(库函数)

工程中添加中断的库函数文件 image.png

初始化:

(1)配置中断优先级分组

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
参数:
  *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
  *                                4 bits for subpriority
  *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
  *                                3 bits for subpriority
  *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
  *                                2 bits for subpriority
  *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
  *                                1 bits for subpriority
  *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
  *                                0 bits for subpriority

外部中断源:

(2)开启GPIO和SYSCFG的时钟

    RCC_AHB1... RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);              

(3)初始化GPIO为输入模式

                GPIO_Init(...);              

(4)选择GPIO口和外部中断线的映射关系(SYSCFG)

void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex);
参数:
    EXTI_PortSourceGPIOx - 哪一组
    EXTI_PinSourcex - 哪个脚

(5)初始化外部中断

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
参数:
    
typedef struct
{
  uint32_t EXTI_Line;               /*!< 哪条中断线 @ref EXTI_Lines */
   
  EXTIMode_TypeDef EXTI_Mode;       /*!< 模式选择 事件/中断 @ref EXTIMode_TypeDef */
​
  EXTITrigger_TypeDef EXTI_Trigger; /*!< 触发边沿选择 @ref EXTITrigger_TypeDef */
​
  FunctionalState EXTI_LineCmd;     /*!< 使能/禁止 ENABLE or DISABLE */ 
}EXTI_InitTypeDef;    

NVIC中断控制器:

(6)初始化NVIC

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
参数:
​
typedef struct
{
  uint8_t NVIC_IRQChannel;                    /*!< 中断通道 @ref IRQn_Type  */uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< 抢占优先级 */uint8_t NVIC_IRQChannelSubPriority;         /*!< 响应优先级 */
​
  FunctionalState NVIC_IRQChannelCmd;         /*!< 使能/禁止 ENABLE or DISABLE */   
} NVIC_InitTypeDef;

(7)编写中断处理函数

函数名在启动文件的异常向量表中去查找,比如:EXTI0_IRQHandler

中断处理函数无参无返回值

中断处理函数中必须清楚中断标志

                    void EXTI_ClearITPendingBit(uint32_t EXTI_Line); //传入外部中断线编号       

练习:

实现其他3个按键的中断,分别控制其他三盏灯。(4,5,6,7)

将4个按键中断设置为以下优先级

S1       抢占2 响应2
S2       抢占0 响应2
S3       抢占1 响应2
S4       抢占1 响应1
​
S1+S2+S3+S4  ===> 12244331

1.模块介绍

MQ-2可以检测所处环境的可燃气体浓度,有两路输出 -------------- 电平输出(DO)和模拟电压输出(AO)。5V供电,上电后要预热几分钟才开始工作。

电平输出 --------------- 正常情况下输出高电平,可燃气体浓度达到报警值变低电平

模拟电压输出 --------------- 输出的的电压随着可燃气体的浓度变化而变化 image.png 2.和开发板的连接 image.png

红灯是电源指示灯,绿灯是报警灯。

电平输出引脚连接到了PA2

3.编写代码获取可燃气体传感器的状态

配置PA2为输入功能
在主函数中去读取PA2的电平

练习:

编写获取可燃气体传感器状态代码,实现可燃气体浓度超标时D1亮,不超标灭。

4.stm32的硬件仿真

(1)编译工程成功,点击仿真按钮进入仿真界面

image.png

(2)仿真界面的介绍

image.png

十四.定时器

1.概念

定时器本质上是一个计数器,从某个值开始计数,当计数值达到某个值时定时时间到。可以通过控制计数的范围和计数的快慢来达到控制定时时间的目的。

2.systick ------------- 系统定时器

(1)介绍

systick是一个简单定时器,属于ARM核,常用于精准延时,也可以用作系统心跳时钟。

image.png

(2)cortex-M4内核的系统定时器(权威指南9.5节)

systick是一个24位(0xffffff)的向下计数,具有自动重装载功能。systick通过寄存器控制,一旦开启,永不停歇,即使在芯片低功耗模式下仍然可以工作。时钟源由外部提供,可以选择8分频的HCLK(21MHz)或者HCLK(168MHz)

image.png

image.png

控制寄存器:

image.png

(3)使用systick实现精准延时(毫秒 微秒)

选择参考时钟,计数初始值来决定定时器的周期

使能定时器,查询超时标志等待定时器超时

练习:

实现微秒延时函数,在主函数中调用,实现D1 1S闪烁一次

十五.通用定时器

1.介绍

定时器的基本功能是定时,通用定时器属于外设,通常和其他硬件配合使用,比如串口周期性收发数据,传感器周期性地采集数据,ADC周期性转换AD数据,将GPIO和定时器配合会产生更多的功能(PWM方波,脉冲检测......)。

stm32f407有14个定时器外设,TIM2TIM5,TIM9TIM14属于通用定时器,TIM1和TIM8属于高级定时器,TIM6和TIM7属于基本定时器。以TIM2~TIM5为例,介绍通用定时器的使用。

image.png

1.TIM2~TIM5的特性

image.png

三种计数模式:

1.向上(递增)计数 0 ~ 计数初始值 2.向下(递减)计数 计数初始值 ~ 0 3.双向(递增/递减)计数 计数初始值 ~ 0 ~ 计数初始值

通用定时器的原始时钟频率取决于所在总线和APB域的分频系数

2.寄存器

image.png

作业:

编写一个stm32程序,实现以下功能

按下S1,监控MQ2的状态,超标蜂鸣器响
按下S2,让D1 1s闪烁