STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。
STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18:
线0~15:对应外部 IO口的输入中断。
线16:连接到 PVD 输出。
线17:连接到 RTC 闹钟事件。
线18:连接到 USB 唤醒事件。
触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。
外部中断分组:STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。
STM32的每个IO口都可以作为中断输入,这点很好用。要把IO口作为外部中断输入,有以下几个步骤:
1)初始化IO口为输入。
这一步设置你要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。
2)开启IO口复用时钟,设置IO口与中断线的映射关系。
STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。
3)开启与该IO口相对的线上中断/事件,设置触发条件。
这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。
4)配置中断分组(NVIC),并使能中断。
这一步,我们就是配置中断的分组,以及使能,对STM32的中断来说,只有配置了NVIC的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。关于NVIC的详细介绍,请参考前面章节。
5)编写中断服务函数。
这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。
EXTI库函数:
EXTI配置例程:
EXTI初始化设置:
void EXTI_PB9_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
//使能GPIO和AFIO时钟,值得注意的是,当使用外部中断的时候必须使能AFIO时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);//将EXIT线9连接到PB9
EXTI_InitStructure.EXTI_Line = EXTI_Line9;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //上升下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能中断线
EXTI_Init(&EXTI_InitStructure);//初始化中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
配置中断服务函数:
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line9) != RESET) //EXTI9产生了中断
{
……………………………………………………//中断处理程序
}
EXTI_ClearITPendingBit(EXTI_Line9);//清除中断
}
主要完成任务:
1、整理回顾STM32的系列配置,进行系统性地整理;
2、整理FOC电机程序,进行查缺补漏;
3、回顾方波驱动程序;
上一篇:【STM32电机矢量控制】记录14——霍尔传感器
下一篇:【STM32电机矢量控制】记录12——IWDG看门狗
推荐阅读
史海拾趣
随着技术的成熟和市场的扩大,Centellax开始积极拓展国内外市场。公司通过与全球知名的通信设备制造商、电信运营商等建立合作关系,成功将产品打入国际市场。此外,Centellax还积极参与行业展会、研讨会等活动,提升品牌知名度和影响力。
在战略合作方面,Centellax注重与产业链上下游企业的协同发展。通过与供应商、客户等建立紧密的合作关系,实现资源共享和优势互补。这些合作不仅有助于提升公司的运营效率和市场竞争力,还为公司的长期发展提供了有力保障。
成谷科技是一家专注于ETC技术在区域市场应用的企业。公司根据不同地区的交通特点和需求,量身定制ETC解决方案,并在当地市场进行深耕细作。通过深入了解当地市场和客户需求,成谷科技成功打造了一系列具有地方特色的ETC应用案例,赢得了当地政府和客户的广泛赞誉。
随着技术的不断进步,AIRPAX在传感器和电气保护领域取得了重大突破。其研发的全新传感器技术大大提高了测量精度和响应速度,为汽车、家电等行业提供了更高效、更安全的解决方案。这一技术突破使得AIRPAX的产品开始在更广泛的行业中得到应用,公司也逐渐发展成为电气保护领域的领军企业。
随着公司技术的不断成熟和产品的不断优化,EMS GmbH公司开始积极拓展市场。公司不仅在欧洲市场取得了显著的成绩,还逐渐将业务拓展至全球范围。通过参加国际展会、与合作伙伴建立战略合作关系等方式,EMS GmbH公司不断提升品牌知名度和影响力。同时,公司还注重产品质量和服务质量的提升,以确保在激烈的市场竞争中保持竞争优势。
Fibrefab始终坚持以客户为中心的服务理念。为了提升客户满意度和忠诚度,Fibrefab不断加强售前咨询、售中服务和售后支持等方面的投入。公司建立了一套完善的服务体系,为客户提供从方案设计、产品选型、安装调试到后期维护等全方位的服务支持。此外,Fibrefab还积极收集客户反馈和建议,不断优化产品和服务以满足客户需求。
随着技术的不断进步和产品的不断创新,西铁城公司开始积极拓展全球市场。公司的产品以其高品质、精确度和创新技术而闻名,逐渐赢得了全球消费者的青睐。同时,公司也积极参与国际性的钟表展会和活动,通过展示最新产品和技术成果,进一步提升品牌知名度和影响力。这一系列的举措使得西铁城在全球市场上的地位日益稳固。
在竞争激烈的GSM电话终端市场上,终端制造商开始期待可以加快开发速度和缩短开发周期的解决方案。由于越来越多功能丰富的新型手机开始集成百万像素数字相机、蓝牙技术和多媒体功能,设计者开始寻找尺寸更小和集成度更高的发射和接收RF模块,它们能 ...… 查看全部问答∨ |
|
第1种方法限幅滤波法(又称程序判断滤波法) A方法 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代 ...… 查看全部问答∨ |
|
原文: 学习方法真的至关重要么 前面已经提到我作为老师经常遇到学生问“老师,这个方法真的有用么?”其 实,我知道学生的问题不止这一个,他们还有更进一步的问题。当然,只有聪明 的人才去关心方法,这没什么不对。然而,学生总是过分关心自 ...… 查看全部问答∨ |
各位eeworld的朋友,最近小弟在弄WINCE,想在WINCE下写服务程序,使的开机启动服务,为PC机与WINCE通讯(通过网络)提供相应的服务,我想找个Demo程序,听说和流式驱动写法相似,请大家为我提供相应思想或者实例程序,谢谢了!… 查看全部问答∨ |
我用的是WinCE5.0的系统,使用的BVDMAIN的bsp。 在driver里面有一个DMA文件夹,里面有一些使用DMA时相关的函数。还有一个例程代码。 但是我用例程代码调试,总是不成功。 请教一下是什么原因,谢谢 代码如下: #define FPGA_DMA_BUFFER_SI ...… 查看全部问答∨ |
|
我在书上抄的一段程序 #include \"io430.h\" #include<msp430x44x.h>#define Const 100vodi SoftDelay(int Factor){int i,j;for(i=0;i<Factor;i++) for(j=0;j<Const;j++); }void main(void){ _NOP(); SoftDelay ...… 查看全部问答∨ |