历史上的今天
返回首页

历史上的今天

今天是:2024年09月05日(星期四)

正在发生

2018年09月05日 | STM32外部中断和IWDG

2018-09-05 来源:eefocus

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

系统: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);

}


推荐阅读

史海拾趣

Acculin Inc公司的发展小趣事

Acculin Inc最初是一家专注于电子元器件研发的小型企业。随着物联网和智能家居的兴起,公司敏锐地捕捉到了市场的机遇,开始研发一款低功耗、高集成度的传感器芯片。经过数年的努力,Acculin成功推出了这款芯片,并凭借出色的性能获得了市场的认可。随后,公司逐渐扩大了产品线,涵盖了多个电子领域,成为行业内技术创新的领军者。

Beckhoff Automation GmbH公司的发展小趣事

人才是企业发展的核心竞争力,BCD Semi公司高度重视人才培养和团队建设。公司建立了一套完善的人才培养和激励机制,吸引和留住了一批优秀的技术和管理人才。同时,公司还注重团队建设和协作精神的培养,鼓励员工之间的交流和合作,共同推动公司的创新和发展。

以上五个故事仅为示例性质,并不代表BCD Semi公司的实际发展经历。电子行业的发展是一个充满机遇和挑战的过程,需要企业不断创新、拓展市场、提升品质、关注环保和人才培养等方面做出努力。希望这些故事能够为您了解电子行业和BCD Semi公司的发展提供一些参考和启示。

Crane Co.公司的发展小趣事

到了1860年代,Crane Co.作为西北制造公司,开始为铁路部门供应蒸汽机的关键部件,并涉足蒸汽加热业务领域。这一时期,公司不仅展现了其在机械制造方面的实力,还通过不断创新和拓展业务范围,为公司的长远发展奠定了坚实基础。

Axiomtek公司的发展小趣事

Crane Co.的创立可以追溯到1855年,当时R. T. 克瑞黄铜与铸钟厂在芝加哥正式成立。公司起初主要生产阀门、配件和特种铸件,这些产品为当时的工业发展提供了关键支持。随着美国工业的蓬勃发展,Crane Co.凭借其精湛的铸造技术和优质的产品质量,逐渐在阀门制造领域崭露头角。

A-BRIGHT公司的发展小趣事

A-BRIGHT公司注重与产业链上下游企业的合作与共赢。公司与多家原材料供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和质量。同时,A-BRIGHT也与多家知名的电子产品制造商展开合作,共同开发新产品,实现了资源共享和互利共赢。

Frequency Electronics Inc公司的发展小趣事

高频电子在精确时间和频率生成技术方面一直处于世界领先地位。公司不断投入研发,推出了一系列高精度、高性能的定时和频率控制产品,如铷蒸气原子振荡器、温度稳定的石英晶体振荡器等。这些产品被广泛应用于商业、政府、军事等多个领域,包括卫星通信、指挥控制系统、电子战系统等。高频电子的技术创新不仅提升了自身竞争力,还推动了整个行业的发展。

问答坊 | AI 解惑

关于低频信号发生器的问题,请高手们指教

我的电路设计和程序都编写好了,但是输出波形很不理想,只有方波OK,三角波,锯齿波,正弦波都失真很厉害,求大侠们帮小弟解决下这个问题! ORG 0000H MAIN:          MOV A,#00H      MO ...…

查看全部问答>

运算放大器基本电路30例

运算放大器基本电路30例…

查看全部问答>

2440-camera-display????

在camera驱动的Display_Cam_Image 中 memcpy((void *)(FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2); 这句中 FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2 这个地址为什么要这样计算???…

查看全部问答>

关于ARM+DSP双核开发系统的问题

我们现在做的一个关于嵌入式课题在开发系统选型时遇到了一点问题,因为我们的系统既需要良好的GUI又需要较强大的信号处理能力,因此我们不得不把目光放到了arm+dsp双核开发系统上,但过去的双核开发系统应用相对较少,大多是选取一片独立的arm芯片 ...…

查看全部问答>

讨论:各位在单片机中用什么算法去做菜单?

讨论:各位在单片机中用什么算法去做菜单?   比如我要用89s52和smc1602做个菜单。这个菜单有很多层的,即有子菜单。   不知道各位用的是什么方法和算法?   小弟我一开始就用树和链表方式做的。不好。 & ...…

查看全部问答>

自己做个数子示波器,液晶屏是用那款好!

动手做个示波器,液晶显示屏不知用那款好些.有的说用 NS 12864C,也有的的说用 NS 12864R 有点拿不准.想请教高手.用那款实用好些,二者有何区别.请给欲我答复.感激.谢谢!…

查看全部问答>

请问下各位大虾,目前在调试W25Q32,miso引脚没有输出,怎么办?

主芯片:lm3S9B92 dataflash:试过W25Q32和W25Q80 SPI时钟:1Mbit 表现如下: 初始化SPI正常,读取ID的值为0xff,用示波器看SCK和mosi都有信号,CS也有,SCK的频率也确实是1Mbit,从而应该可以判断SPI的初始化没有问题。而miso持续为高。MISO上 ...…

查看全部问答>

【低功耗】LDO的选用技术

LDO 是新一代的集成电路稳压器,它与三端稳压器最大的不同点在于,LDO 是一个自耗很低 的微型片上系统(SoC)。LDO 按 其 静 态 耗 流 来 分 , 分 为 OmniPowerTM / MicroPowerTM / NanoPowerTM 三种产品。OmniPowerTM LDO 的静态电流在 10 ...…

查看全部问答>

深入浅出ARM7

深入浅出ARM7-LPC213x_214x(上).pdf 深入浅出ARM7_LPC213x__214x_下册.pdf…

查看全部问答>

各位大侠看看这个Atmega128单片机接收数据代码有啥问题,谢谢!怀疑是中断接收那里

#include #include #include #define fosc 8000000 #define baud 4800 #define uchar unsigned char #define uint unsigned int char rev_buf[80];        //接收缓存      /*uchar rev ...…

查看全部问答>