单片机 > 单片机程序设计 > 详情

STM32外部中断和IWDG

发布时间:2024-07-19 发布时间:
|

实验平台:正点原子战舰开发板

系统:windows 7 64位

编译器:MDK 4.72a

参考例程:ATK串口例程,野火ISO串口例程


外部中断


中断主要分为两种:

1、系统异常中断也可以说的内核异常,这类异常中断有些是不可以控制的,如RESET,NMI,FAULT.

2、外部中断,这些中断都是可以设置的,每个GPIO都可以被设置为中断。

一、NVIC控制器

当要使用中断时候都要对NVIC进行设置

void  NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

 

 

NVIC_IRQChannel  需要配置的中断线

NVIC_IRQChannelCmd  使能或关闭相应中断向量的中断响应 

NVIC_IRQChannelPreemptionPriority     配置相应中断向量抢占优先级 

NVIC_IRQChannelSubPriority  配置相应中断向量的响应优先级 

 

抢占 > 响应 ,先判断抢占 然后再判断响应。

 

要配置这些优先级组,可以采用库函数 NVIC_PriorityGroupConfig(),可输

入的参数为 NVIC_PriorityGroup_0   ~  NVIC_PriorityGroup_4,有5 种分配组。

关系式是: 

 

第0组:16种抢断

第1组:2种抢断,8种响应

第2组:4种抢断,4种响应

第3组:8种抢断,2种响应

第4组:16种响应,无抢断

 

数越小,优先级越高。当要用到N多中断时候才要设置这个优先级组。否则不用设置。

二、EXIT

STM32一共有16个中断线,编号为0~15。GPIOA~GPIOG的第0个引脚都属于0号中断线,所有的1引脚,都属于1号中断线,以此类推。但是每一个中断线同时只能响应一个引脚的中断,但是可以分时复用,设置不同的触发方式。

 

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//初始化的结构体函数

 

typedef struct

{

  uint32_t EXTI_Line;              //中断线号 EXTI_LineX;   

  EXTIMode_TypeDef EXTI_Mode;         //模式选择 中断或者事件

  EXTITrigger_TypeDef EXTI_Trigger; //触发方式

  FunctionalState EXTI_LineCmd;     //使能命令

                                 

}EXTI_InitTypeDef;

 

 

填写完这两个结构体,然后初始化就可以使用外部中断了。但是我们还需要中断函数

记得使能引脚的复用功能AFIO

中断函数有固定的函数名字,不能更改,我们可以从启动文件里看到中断函数

外部按键中断函数的一般格式为:

 

void EXTI2_IRQHandler(void) 

if( EXTI_GetITStatus(EXTI_Line2 ) != RESET)//判断某个线上的中断是否发生        

        { 

          中断逻辑… 

          EXTI_ClearITPendingBit( EXTI_Line2 );    //清除 LINE 上的中断标志位     

        }                 

三、IWDG

看门狗作用就是防止程序跑飞或者死机,当IWDG_KR没有定时写入0XAAAA时就会产生一个强制的复位信号使芯片重启。但是IWDG用的是内部RC时钟,频率不稳定,所以在喂狗时候要提前喂狗,防止勿复位。

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);

打开和关闭IWDG的写入保护

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);

分频比 2^n( n= 2 ~ 16) 最大256

void IWDG_SetReload(uint16_t Reload);

设置重载值最大4095

void IWDG_ReloadCounter(void);

重载IWDG_RLR寄存器的数

void IWDG_Enable(void);

使能IWDG

FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);

查询预分频或者重载是否进行中

计算时间用:Tout=((4×2^prer)  ×rlr) /40 。

 

 

部分代码:

void IWDG_Init()

{

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

IWDG_SetPrescaler(4);

IWDG_SetReload(625);

IWDG_ReloadCounter();

IWDG_Enable();

}

 

 

void EXITX_Init()

{

EXTI_InitTypeDef EXIT_InitStruct;

NVIC_InitTypeDef NVIC_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

EXIT_InitStruct.EXTI_Line = EXTI_Line2;

EXIT_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;

EXIT_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;

EXIT_InitStruct.EXTI_LineCmd = ENABLE;

NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

EXTI_Init(&EXIT_InitStruct);

NVIC_Init(&NVIC_InitStruct);

}

 

void EXTI2_IRQHandler()

{

delay_ms(10);

if(KEY2 == 0)

{

IWDG_ReloadCounter();

}

EXTI_ClearITPendingBit(EXTI_Line2);

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430低功耗模式-while循环失效