历史上的今天
今天是: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);
}
上一篇:STM32的IWDG使用
下一篇:stm32 独立看门狗 IWDG
史海拾趣
|
我的电路设计和程序都编写好了,但是输出波形很不理想,只有方波OK,三角波,锯齿波,正弦波都失真很厉害,求大侠们帮小弟解决下这个问题! ORG 0000H MAIN: MOV A,#00H MO ...… 查看全部问答> |
|
在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 这个地址为什么要这样计算???… 查看全部问答> |
|
我们现在做的一个关于嵌入式课题在开发系统选型时遇到了一点问题,因为我们的系统既需要良好的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 是一个自耗很低 的微型片上系统(SoC)。LDO 按 其 静 态 耗 流 来 分 , 分 为 OmniPowerTM / MicroPowerTM / NanoPowerTM 三种产品。OmniPowerTM LDO 的静态电流在 10 ...… 查看全部问答> |
|
各位大侠看看这个Atmega128单片机接收数据代码有啥问题,谢谢!怀疑是中断接收那里 #include #include #include #define fosc 8000000 #define baud 4800 #define uchar unsigned char #define uint unsigned int char rev_buf[80]; //接收缓存 /*uchar rev ...… 查看全部问答> |




