您现在的位置是:首页 >技术交流 >STM32——05-按键、时钟控制、中断复位 点亮LED灯网站首页技术交流
STM32——05-按键、时钟控制、中断复位 点亮LED灯
简介STM32——05-按键、时钟控制、中断复位 点亮LED灯
如何点亮一颗LED灯
编程实现点灯
常用的 GPIO HAL 库函数:
void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init );
void HAL_GPIO_WritePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin , GPIO_PinState
PinState );
void HAL_GPIO_TogglePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin );
结构体 GPIO_InitTypeDef 定义:
typedef struct
{
uint32_t Pin ;
uint32_t Mode ;
uint32_t Pull ;
uint32_t Speed ;
} GPIO_InitTypeDef ;
按键点亮LED灯(轮询法)
输入(按键):
- KEY1:PA0
- KEY2:PA1
输出( LED 灯):
- LED1:PB8
- LED2:PB9
#define KEY_ON 0 #define KEY_OFF 1 //自己编写的检测按键返回值的函数 uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) { if( HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == GPIO_PIN_RESET) { /* 按键按下 */ return KEY_ON; } else { /* 按键松开 */ while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET); return KEY_OFF; } } while (1) { /* USER CODE END WHILE */ if(Key_Scan(GPIOA,GPIO_PIN_0) == KEY_ON) HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8); if(Key_Scan(GPIOA,GPIO_PIN_1) == KEY_ON) HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); /* USER CODE BEGIN 3 */ }
四、复位和时钟控制( RCC ) -
复位系统复位当发生以下任一事件时,产生一个系统复位:1. NRST 引脚上的低电平 ( 外部复位 )2. 窗口看门狗计数终止 (WWDG 复位 )3. 独立看门狗计数终止 (IWDG 复位 )4. 软件复位 (SW 复位)5. 低功耗管理复位电源复位当以下事件中之一发生时,产生电源复位:1. 上电 / 掉电复位 (POR/PDR 复位 )2. 从待机模式中返回备份区复位备份区域拥有两个专门的复位,它们只影响备份区域。当以下事件中之一发生时,产生备份区域复位。1. 软件复位,备份区域复位可由设置备份域控制寄存器 (RCC_BDCR)( 见 6.3.9 节 ) 中的BDRST 位产生。2. 在 VDD 和 VBAT 两者掉电的前提下, VDD 或 VBAT 上电将引发备份区域复位。时钟控制什么是时钟?时钟打开,对应的设备才会工作。时钟来源三种不同的时钟源可被用来驱动系统时钟 (SYSCLK)HSI 振荡器时钟(高速内部时钟)HSE 振荡器时钟(高速外部时钟)PLL 时钟(锁相环倍频时钟)二级时钟源 :40kHz 低速内部 RC ( LSIRC )振荡器32.768kHz 低速外部晶体( LSE 晶体)如何使用 CubeMX 配置时钟五、中断和事件中断概述什么是中断?中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。什么是 EXTI ?外部中断 / 事件控制器 (EXTI) 管理了控制器的 23 个中断 / 事件线。每个中断 / 事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。 EXTI 可以实现对每个中断 / 事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。EXTI 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不同。产生中断线路目的是把输入信号输入到 NVIC ,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。 EXTI 初始化结构体:typedef struct{// 中断 / 事件线uint32_t EXTI_Line ; /*!< Specifies the EXTI lines to be enabled ordisabled.This parameter can be any combination valueof @ref EXTI_Lines *///EXTI 模式EXTIMode_TypeDef EXTI_Mode ; /*!< Specifies the mode for the EXTI lines.This parameter can be a value of @refEXTIMode_TypeDef */// 触发类型EXTITrigger_TypeDef EXTI_Trigger ; /*!< Specifies the trigger signal active edge forthe EXTI lines.This parameter can be a value of @refEXTITrigger_TypeDef *///EXTI 控制FunctionalState EXTI_LineCmd ; /*!< Specifies the new state of the selected EXTIlines.This parameter can be set either to ENABLE orDISABLE */} EXTI_InitTypeDef ;中断 / 事件线:# define EXTI_Line0 (( uint32_t ) 0x00001 ) /*!< External interrupt line 0 */# define EXTI_Line1 (( uint32_t ) 0x00002 ) /*!< External interrupt line 1 */# define EXTI_Line2 (( uint32_t ) 0x00004 ) /*!< External interrupt line 2 */# define EXTI_Line3 (( uint32_t ) 0x00008 ) /*!< External interrupt line 3 */# define EXTI_Line4 (( uint32_t ) 0x00010 ) /*!< External interrupt line 4 */# define EXTI_Line5 (( uint32_t ) 0x00020 ) /*!< External interrupt line 5 */# define EXTI_Line6 (( uint32_t ) 0x00040 ) /*!< External interrupt line 6 */# define EXTI_Line7 (( uint32_t ) 0x00080 ) /*!< External interrupt line 7 */# define EXTI_Line8 (( uint32_t ) 0x00100 ) /*!< External interrupt line 8 */# define EXTI_Line9 (( uint32_t ) 0x00200 ) /*!< External interrupt line 9 */# define EXTI_Line10 (( uint32_t ) 0x00400 ) /*!< External interrupt line 10 */# define EXTI_Line11 (( uint32_t ) 0x00800 ) /*!< External interrupt line 11 */# define EXTI_Line12 (( uint32_t ) 0x01000 ) /*!< External interrupt line 12 */# define EXTI_Line13 (( uint32_t ) 0x02000 ) /*!< External interrupt line 13 */# define EXTI_Line14 (( uint32_t ) 0x04000 ) /*!< External interrupt line 14 */# define EXTI_Line15 (( uint32_t ) 0x08000 ) /*!< External interrupt line 15 */# define EXTI_Line16 (( uint32_t ) 0x10000 ) /*!< External interrupt line 16Connected to the PVD Output */# define EXTI_Line17 (( uint32_t ) 0x20000 ) /*!< External interrupt line 17Connected to the RTC Alarm event */# define EXTI_Line18 (( uint32_t ) 0x40000 ) /*!< External interrupt line 18Connected to the USB OTG FS Wakeup from suspend event */# define EXTI_Line19 (( uint32_t ) 0x80000 ) /*!< External interrupt line 19Connected to the Ethernet Wakeup event */# define EXTI_Line20 (( uint32_t ) 0x00100000 ) /*!< External interrupt line 20Connected to the USB OTG HS (configured in FS) Wakeup event */# define EXTI_Line21 (( uint32_t ) 0x00200000 ) /*!< External interrupt line 21Connected to the RTC Tamper and Time Stamp events */# define EXTI_Line22 (( uint32_t ) 0x00400000 ) /*!< External interrupt line 22Connected to the RTC Wakeup event */
EXTI模式:
typedef enum{EXTI_Mode_Interrupt = 0x00 , // 产生中断EXTI_Mode_Event = 0x04 // 产生事件} EXTIMode_TypeDef ;
触发类型:
typedef enum{EXTI_Trigger_Rising = 0x08 , // 上升沿EXTI_Trigger_Falling = 0x0C , // 下降沿EXTI_Trigger_Rising_Falling = 0x10 // 上升沿和下降沿都触发} EXTITrigger_TypeDef ;
EXTI
控制:
使能
EXTI
,一般都是使能, ENABLE
什么是优先级?
抢占优先级和响应优先级的区别:
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行
什么是优先级分组?
Cortex-M3
允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此
STM32
把
指定中断优先级的寄存器位减少到
4
位,这
4
个寄存器位的分组方式如下:
第
0
组:所有
4
位用于指定响应优先级
第
1
组:最高
1
位用于指定抢占式优先级,最低
3
位用于指定响应优先级
第
2
组:最高
2
位用于指定抢占式优先级,最低
2
位用于指定响应优先级
第
3
组:最高
3
位用于指定抢占式优先级,最低
1
位用于指定响应优先级
第
4
组:所有
4
位用于指定抢占式优先级
什么是
NVIC
?
STM32
通过中断控制器
NVIC
(
Nested Vectored Interrupt Controller
)进行中断的管理 。
NVIC
是属于
Cortex
内核的器件,不可屏蔽中断(
NMI
)和外部中断都由它来处理,但是
SYSTICK
不是由
NVIC
控制的。
typedef struct{uint8_t NVIC_IRQChannel ;uint8_t NVIC_IRQChannelPreemptionPriority ; // 抢断优先级uint8_t NVIC_IRQChannelSubPriority ; // 响应优先级FunctionalState NVIC_IRQChannelCmd ;} NVIC_InitTypeDef ;
什么是中断向量表?
每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向
量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程
序入口的跳转指令构成一张表,称为中断向量跳转表。
按键点亮
LED
灯(中断法)
1.
配置时钟
1.1打开串口
1.2打开外部时钟晶振
1.3 设置总线
2.
配置
GPIO
口
2.1LED灯 并拉高电平初始为灯灭
2.2按键(配置按键为外部中断模式)
3.
使能中断
4.
配置工程
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。