www.bilibili.com/video/BV1DS… 教程
4.外部中断源
(1)特性
(2)EXTI处理框图
(3)外部中断源的映射
注:GPIO口设置为外部中断时需要配置成输入模式
5.编程实现(库函数)
工程中添加中断的库函数文件
初始化:
(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 ===> 1亮 2亮 2灭 4亮 4灭 3亮 3灭 1灭
1.模块介绍
MQ-2可以检测所处环境的可燃气体浓度,有两路输出 -------------- 电平输出(DO)和模拟电压输出(AO)。5V供电,上电后要预热几分钟才开始工作。
电平输出 --------------- 正常情况下输出高电平,可燃气体浓度达到报警值变低电平
模拟电压输出 --------------- 输出的的电压随着可燃气体的浓度变化而变化
2.和开发板的连接
红灯是电源指示灯,绿灯是报警灯。
电平输出引脚连接到了PA2
3.编写代码获取可燃气体传感器的状态
配置PA2为输入功能
在主函数中去读取PA2的电平
练习:
编写获取可燃气体传感器状态代码,实现可燃气体浓度超标时D1亮,不超标灭。
4.stm32的硬件仿真
(1)编译工程成功,点击仿真按钮进入仿真界面
(2)仿真界面的介绍
十四.定时器
1.概念
定时器本质上是一个计数器,从某个值开始计数,当计数值达到某个值时定时时间到。可以通过控制计数的范围和计数的快慢来达到控制定时时间的目的。
2.systick ------------- 系统定时器
(1)介绍
systick是一个简单定时器,属于ARM核,常用于精准延时,也可以用作系统心跳时钟。
(2)cortex-M4内核的系统定时器(权威指南9.5节)
systick是一个24位(0xffffff)的向下计数,具有自动重装载功能。systick通过寄存器控制,一旦开启,永不停歇,即使在芯片低功耗模式下仍然可以工作。时钟源由外部提供,可以选择8分频的HCLK(21MHz)或者HCLK(168MHz)
控制寄存器:
(3)使用systick实现精准延时(毫秒 微秒)
选择参考时钟,计数初始值来决定定时器的周期
使能定时器,查询超时标志等待定时器超时
练习:
实现微秒延时函数,在主函数中调用,实现D1 1S闪烁一次
十五.通用定时器
1.介绍
定时器的基本功能是定时,通用定时器属于外设,通常和其他硬件配合使用,比如串口周期性收发数据,传感器周期性地采集数据,ADC周期性转换AD数据,将GPIO和定时器配合会产生更多的功能(PWM方波,脉冲检测......)。
stm32f407有14个定时器外设,TIM2TIM5,TIM9TIM14属于通用定时器,TIM1和TIM8属于高级定时器,TIM6和TIM7属于基本定时器。以TIM2~TIM5为例,介绍通用定时器的使用。
1.TIM2~TIM5的特性
三种计数模式:
1.向上(递增)计数 0 ~ 计数初始值 2.向下(递减)计数 计数初始值 ~ 0 3.双向(递增/递减)计数 计数初始值 ~ 0 ~ 计数初始值
通用定时器的原始时钟频率取决于所在总线和APB域的分频系数
2.寄存器
作业:
编写一个stm32程序,实现以下功能
按下S1,监控MQ2的状态,超标蜂鸣器响
按下S2,让D1 1s闪烁