*STM32学习之外部中断实验粗略了解
刚开始粗略的学习STM32,写博客就当是学习笔记,简单的记录一下自己的学习过程。//文章是根据正点原子寄存器版中断实验进行撰写
对于外部中断STM32有一个优点就是它的每一个I/O口都可以当作外部中断的输入口,在使用过程中不用去考虑I/O端口的问题。
线1~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
现在暂时先考虑前十六个中断线(0~~15),16~18暂不考虑。
I/O端口有很多个但是中断线却是只有6个,这时候就要考虑端口与线的映射关系。如下图
(黄色标记需注意角标的变化,红色的线则是是说明在该中断线中只能有一个I/O端口进行中断输入)
每个PX有16个I/O端口正好和中断线对应。
中断线可以设置三种触发方式
(1)上升沿触发
(2)下降沿触发
(3)边沿触发
以及使能!!!!!
一、中断线与服务函数的关系
在这里要注意不是所有的中断线都有独立的函数来控制*//为什么不是一一对应?
void EXTI0_IRQHandler(void)是外部中断 0 的服务函数,
void EXTI1_IRQHandler(void)是外部中断 1 的服务函数,
void EXTI2_IRQHandler(void)是外部中断 2 的服务函数,
void EXTI3_IRQHandler(void)是外部中断 3 的服务函数,
void EXTI4_IRQHandler(void)是外部中断 4 的服务函数,
void EXTI9_5_IRQHandler(void)是外部中断 9~5 的服务函数,
void EXTI15_10_IRQHandler(void)是外部中断 15~10 的服务函数
在这其中前位线有独立的服务函数,而第6~10则是共用一个函数,第10—15则是另一个函数。
1、void EXTI0_IRQHandler(void)//示例基于正点原子STM32 F103mini版
{
delay_ms(10); //延时 10ms 以消抖
if(WK_UP==1) //再检测 WK_UP 是否还是为高电平
{
LED0=!LED0;
LED1=!LED1;
}
EXTI-》PR=1《《0; //清除已经发生的中断请求
}`
二、初始化I/O端口为中断输入与设置优先级
这里要用到两个函数:
1、void Ex_NVIC_Config(u8 GPIOx, u8 BITx, u8 TRIM)
只针对GPIOA~G;不包括PVD,RTC和USB唤醒,且一个函数对应一个I/O口,多个则需要多次调用!!!
— 比如我们要设置GPIO PA0为上升沿触发则: Ex_NVIC_Config(GPIO_A,0,RTIR);
—再比如我们要设置GPIO PB4为下降沿触发: Ex_NVIC_Config(GPIO_B,4,FTIR);
2、void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
/NVIC_PreemptionPriority:抢占优先级
NVIC_SubPriority :响应优先级
NVIC_Channel :中断编号
NVIC_Group :中断分组 0~4/
此函数为设置优先级的高低,要注意两点:
第一, 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
第二, 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
以下是函数内容
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
{
u32 temp;
MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
temp=NVIC_PreemptionPriority《《(4-NVIC_Group);
temp|=NVIC_SubPriority&(0x0f》》NVIC_Group);
temp&=0xf; //取低四位
NVIC-》ISER[NVIC_Channel/32]|=(1《《NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK)
NVIC-》IP[NVIC_Channel]|=temp《《4; //设置响应优先级和抢断优先级
}
代码中涉及到了几个中断寄存器;
ISER[8]:这是一个中断使能寄存器组,要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能。
ICER[8]:是一个中断除能寄存器组。
IP[240]:是一个中断优先级控制的寄存器组,对于STM32来说这是一个十分重要的寄存器!IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,而 STM32 只用到了其中的 68 个。可屏蔽中断占用的 8bit 并没有全部使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级,抢占优先级在前,子优先级在后。
*STM32学习之外部中断实验粗略了解
刚开始粗略的学习STM32,写博客就当是学习笔记,简单的记录一下自己的学习过程。//文章是根据正点原子寄存器版中断实验进行撰写
对于外部中断STM32有一个优点就是它的每一个I/O口都可以当作外部中断的输入口,在使用过程中不用去考虑I/O端口的问题。
线1~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
现在暂时先考虑前十六个中断线(0~~15),16~18暂不考虑。
I/O端口有很多个但是中断线却是只有6个,这时候就要考虑端口与线的映射关系。如下图
(黄色标记需注意角标的变化,红色的线则是是说明在该中断线中只能有一个I/O端口进行中断输入)
每个PX有16个I/O端口正好和中断线对应。
中断线可以设置三种触发方式
(1)上升沿触发
(2)下降沿触发
(3)边沿触发
以及使能!!!!!
一、中断线与服务函数的关系
在这里要注意不是所有的中断线都有独立的函数来控制*//为什么不是一一对应?
void EXTI0_IRQHandler(void)是外部中断 0 的服务函数,
void EXTI1_IRQHandler(void)是外部中断 1 的服务函数,
void EXTI2_IRQHandler(void)是外部中断 2 的服务函数,
void EXTI3_IRQHandler(void)是外部中断 3 的服务函数,
void EXTI4_IRQHandler(void)是外部中断 4 的服务函数,
void EXTI9_5_IRQHandler(void)是外部中断 9~5 的服务函数,
void EXTI15_10_IRQHandler(void)是外部中断 15~10 的服务函数
在这其中前位线有独立的服务函数,而第6~10则是共用一个函数,第10—15则是另一个函数。
1、void EXTI0_IRQHandler(void)//示例基于正点原子STM32 F103mini版
{
delay_ms(10); //延时 10ms 以消抖
if(WK_UP==1) //再检测 WK_UP 是否还是为高电平
{
LED0=!LED0;
LED1=!LED1;
}
EXTI-》PR=1《《0; //清除已经发生的中断请求
}`
二、初始化I/O端口为中断输入与设置优先级
这里要用到两个函数:
1、void Ex_NVIC_Config(u8 GPIOx, u8 BITx, u8 TRIM)
只针对GPIOA~G;不包括PVD,RTC和USB唤醒,且一个函数对应一个I/O口,多个则需要多次调用!!!
— 比如我们要设置GPIO PA0为上升沿触发则: Ex_NVIC_Config(GPIO_A,0,RTIR);
—再比如我们要设置GPIO PB4为下降沿触发: Ex_NVIC_Config(GPIO_B,4,FTIR);
2、void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
/NVIC_PreemptionPriority:抢占优先级
NVIC_SubPriority :响应优先级
NVIC_Channel :中断编号
NVIC_Group :中断分组 0~4/
此函数为设置优先级的高低,要注意两点:
第一, 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
第二, 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
以下是函数内容
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
{
u32 temp;
MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
temp=NVIC_PreemptionPriority《《(4-NVIC_Group);
temp|=NVIC_SubPriority&(0x0f》》NVIC_Group);
temp&=0xf; //取低四位
NVIC-》ISER[NVIC_Channel/32]|=(1《《NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK)
NVIC-》IP[NVIC_Channel]|=temp《《4; //设置响应优先级和抢断优先级
}
代码中涉及到了几个中断寄存器;
ISER[8]:这是一个中断使能寄存器组,要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能。
ICER[8]:是一个中断除能寄存器组。
IP[240]:是一个中断优先级控制的寄存器组,对于STM32来说这是一个十分重要的寄存器!IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,而 STM32 只用到了其中的 68 个。可屏蔽中断占用的 8bit 并没有全部使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级,抢占优先级在前,子优先级在后。
举报