提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
PC5
首先:
1.外部中断是输入,按照按键输入来配置就可以了
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //KEY 因为按键按下是0,所以松开应该是1 以此使用上拉
GPIO_Init(GPIOC, &GPIO_InitStruct); //&x PC5
然后
2.如何将引脚跟外部中断线连起来,要跟外部中断5,EXTI5
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5); //pc5-EXTI5
3.外部中断配置,边沿检测,中断使能,事件、
//2.中断配置
EXTI_InitStruct.EXTI_Line= EXTI_Line5; // EXTI_Linex
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode= EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init( &EXTI_InitStruct);
4.中断管理
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 0; //0-3
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 0-3
NVIC_Init(&NVIC_InitStruct);
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);再加中断不用加分组整个32就用一个分组
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 1; //0-3
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 0-3
1.抢占优先级和响应优先级一样时,看中断向量表,谁在前面就先执行谁
2.中断1:抢占优先级0,响应是1。中断2:抢占优先级1,响应是1。
响应优先级有什么用?
3. 中断1:抢占优先级0,响应是1。中断2:抢占优先级0,响应是0。
5.中断函数
void EXTI9_5_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line5)==SET) //判断是否是外部中断5
{
EXTI_ClearITPendingBit(EXTI_Line5) ; //清楚外部中断5的标准,
}
}
代码如下(示例):
#include "stm32f10x.h"
//全局
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
int x;
int main()
{
// 3.中断管理
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 0; //0-3
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 0-3
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 1; //0-3
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 0-3
NVIC_Init(&NVIC_InitStruct);
/*
key PC5
LED PA8
*/
//局部
// 库函数开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_8;
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //LED
GPIO_Init(GPIOA, &GPIO_InitStruct); //&x PA8
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStruct); //&x
// 1.配置GPIO
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_5|GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //KEY 因为按键按下是0,所以松开应该是1 以此使用上拉
GPIO_Init(GPIOC, &GPIO_InitStruct); //&x PC5
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0); //pc5-EXTI5
//2.中断配置
EXTI_InitStruct.EXTI_Line= EXTI_Line5|EXTI_Line0; // EXTI_Linex
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode= EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init( &EXTI_InitStruct);
while(1)
{
//if(GPIOC.5==0)
if(GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_5)) // 上拉 按键按下 0 反之1
{
GPIO_SetBits(GPIOA, GPIO_Pin_0); //灭
}
else{
GPIO_ResetBits(GPIOA, GPIO_Pin_0); //按下亮
}
}
}
//4.中断函数 高优先级
void EXTI9_5_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line5)==SET) //判断是否是外部中断5
{
EXTI_ClearITPendingBit(EXTI_Line5) ; //清楚外部中断5的标准,
}
}
//4.中断函数 低优先级
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0)==SET) //判断是否是外部中断5
{
EXTI_ClearITPendingBit(EXTI_Line0) ; //清楚外部中断5的标准,
}
}
中断嵌套
000 主函数 灭
001 最低
010 中
100 高
显示效果
举例子:
//4.中断函数 低优先级
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0)==SET) //判断是否是外部中断5
{
EXTI_ClearITPendingBit(EXTI_Line0) ; //清楚外部中断5的标准,
for(i=0;i<1000;i++) // i=100
{
001;//一直给001
delay();//用自己写的软件延时,不要硬件延时,否则中断嵌套回不去
}
}
}
以上已经完成了,一个外部中断触发,思考如何完成三个按键的中断嵌套及验证。
要求:
三个按键,三个优先级,实现中断嵌套,用三个led灯显示效果
注意:中断里面要用自己写的软件延时,不要用硬件延时,就是各种开发板给的资料中的硬件延时函数