我们先看一张图:
我们由两张原理图可知, 按键如果按下去就触发中断要使用下降沿触发,如果松开按钮后在进行中断即可以上升沿触发;
我们由【STM32L05C8T6】的HAL库文件可知,
EXTI0_1_IRQ 的线为 【1:0】;
EXTI2_3_IRQn的线为【2: 3】;
EXTI4_15_IRQn的线为【4:15】;
我们按键上
K1: PB2 // 最后的 2 对应的线为 EXTI2_3_IRQn
K2:PB1 // 最后的 1 对应的线为 EXTI0_1_IRQ
K3: PB0 // 最后的 0 对应的线为 EXTI0_1_IRQ
K4: PA7 // 最后的 7 对应的线为 EXTI4_15_IRQn
上面的那个对应清楚了,那么我们的中断函数就可以这样写了:
void EXTI0_1_IRQHandler(void)
{
//确保是否产生了 EXTI Line 中断
if (__HAL_GPIO_EXTI_GET_IT(KEY2_PIN) != RESET) {
/*//
这里放你要中断执行的函数
// */
//清除中断标志位
__HAL_GPIO_EXTI_CLEAR_IT(KEY2_PIN);
}
//确保是否产生了 EXTI Line 中断
if (__HAL_GPIO_EXTI_GET_IT(KEY3_PIN) != RESET) {
/*//
这里放你要中断执行的函数
// */
//清除中断标志位
__HAL_GPIO_EXTI_CLEAR_IT(KEY3_PIN);
}
}
void EXTI2_3_IRQHandler(void)
{
//确保是否产生了 EXTI Line 中断
if (__HAL_GPIO_EXTI_GET_IT(KEY1_PIN) != RESET) {
/*//
这里放你要中断执行的函数
// */
//清除中断标志位
__HAL_GPIO_EXTI_CLEAR_IT(KEY1_PIN);
}
}
void EXTI4_15_IRQHandler(void)
{
//确保是否产生了 EXTI Line 中断
if (__HAL_GPIO_EXTI_GET_IT(KEY4_PIN) != RESET) {
/*//
这里放你要中断执行的函数
// */
//清除中断标志位
__HAL_GPIO_EXTI_CLEAR_IT(KEY4_PIN);
}
}
关键字:HAL库 中断
引用地址:
HAL库对于中断的理解【STM32L051C8T6】
推荐阅读最新更新时间:2024-11-07 11:21
stm32 freertos 之串口中断
一、中断处理函数 void USART1_IRQHandler(void) { BaseType_t xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; u8 cChar; if(USART_GetITStatus (USART1,USART_IT_RXNE)!=RESET) { cChar=USART_ReceiveData(USART1); xQueueSendToBackFromISR (xQueueRx,&cChar,&xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPri
[单片机]
stm32F429中断优先级相关知识
最近用到f429比较多,故对相关中断知识点作下梳理,随时更行。。。 1 .systick的优先级到底比外设高还是低呢? 1、只要内核的优先级可以配置,那么内核的优先级就不是一定比外设的高,而是要先比较软件优先级,如果软件优先级一样,那么就比较他们的硬件的中断编号,编号就是在中断向量表中的位置,越小,优先级越高。 2、以systick为例,在systick的固件库初始化函数:SysTick_Config(uint32_t ticks) 中,调用了NVIC_SetPriority (SysTick_IRQn, (1 __NVIC_PRIO_BITS) - 1); ,这里面把 systick的 优先级配置为 :1 4-1 = 15,这里
[单片机]
AVR128的程序——外部中断
#include iom128v.h #include macros.h #define uchar unsigned char #define uint unsigned int void main(void) { uchar i,temp; DDRA = 0XFF; PORTA = 0XFF; DDRC = 0XFF; PORTC = 0XFF; DDRF |= 0X0E; PORTF |= 0X0E; PORTF &= 0xF8; DDRB |= 0
[单片机]
s3c2440中断学习笔记
进入异常时cpu将做如下工作 1.将中断时pc的值copy到lr(此时pc的值为中断指令位置+8,所以返回的指令地址应该是当前pc值+4) 2.CPSR- SPSR_(irq) (相当于bl跳转) 3.强制进入irq,ARM工作模式 4.跳转到异常制定的指令位置 进入异常时应该保护寄存器:stmdb sp!, { r0-r12,lr } 退出时恢复寄存器: ldmia sp!, {r0-r12,pc}^ ^ :当 register list 中有pc寄存器时,表示执行指令后spsr中的值自动复制到cpsr中,如果没有pc寄存器是,^表示操作的是用户模式下的寄存器,而不是当前特权模式的寄存器,也就是说在特权模式下
[单片机]
PIC 中断 服务程序
中断服务程序有一个特殊的定义方法: void interrupt ISR(void)其中的函数名 ISR 可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是 void 型,亦即没有入口参数和返回参数,且中间必须有一个关键词 interrupt 中断函数可以被放置在原程序的任意位置。因为已有关键词 interrupt 声明,PICC 在最后进行代码连接时会自动将其定位到0x0004 中断入口处,实现中断服务响应。编译器也会实现中断函数的返回指令 retfie 。 一个简单的中断服务示范函数如下: void interrupt ISR(void) { //中断服务程序 if (T0IE &
[单片机]
STM32的串口中断配置
STM32的串口中断配置,也是很简单的. 首先是配置UART的GPIO口 /********************************************** * Name : UART1_GPIO_Configuration * Deion : Configures the uart1 GPIO ports. * Input : None * Output : None * Return : None **********************************************************/ void UART1_GPIO_Configuration(void) { GPIO_InitTyp
[单片机]
关于ARM2440中断源个数的一点想法
S3c2440支持多达36个内部中断源和24个外部中断源,分别使用内部终端屏蔽寄存器INTMSK和外部中断寄存器MSK进行屏蔽控制。其中,外部中断源通过GPIO以复用的方式成为内部中断源的一部分。 但是我们清楚,INTMSK是一个32位的寄存器,最多只能支持32中断,它是如何对应这么多中断的呢? 首先我们先看INTMSK对应的位。 INTERRUPT MASK (INTMSK) REGISTER (Continued) INT_ADC 0 = Service available, 1 = Masked 1 INT_RTC 0 = Service available, 1 = Masked 1 INT_SPI1 0 = Se
[单片机]
ARM-Linux s3c2440 之中断分析(三)
Linux通过以下函数来注册中断以及中断相关的入口函数handle,只有先注册IRQ,才能正常使用。 int set_irq_chip(unsigned int irq, structirq_chip *chip) static inline void set_irq_handler(unsigned intirq, irq_flow_handler_t handle) static inline void set_irq_chained_handler(unsignedint irq, irq_flow_handler_t handle) 实现的代码如下: for(irqno = IRQ_E
[单片机]