历史上的今天
返回首页

历史上的今天

今天是:2024年10月11日(星期五)

正在发生

2021年10月11日 | STM32–中断程序总结(库函数)

2021-10-11 来源:eefocus

一.配置中断优先级函数


void EXTI_NVIC_Config(void)

{

NVIC_InitTypeDef NVIC_InitStruct;

/*初始化NVIC结构体  */


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

/*设置优先级分组为组一,组的区别具体在教材P133 */

NVIC_InitStruct.NVIC_IRQChannel =  EXTI0_IRQn;

/*选择中断源为EXTI0(EXTI Line0的中断源)  */


/*注意:*/

/*EXTI0  EXTI1  EXTI2  EXTI3  EXTI4 对应中断源分别为 EXTI0_IRQn EXTI1_IRQn EXTI2_IRQn EXTI3_IRQn EXTI4_IRQn */

/*EXTI5  EXTI6  EXTI7  EXTI8  EXTI9 对应中断源分别为 EXTI9_5_IRQn */

/*EXTI10 EXTI11 EXTI12 EXTI13 EXTI14 EXTI15 对应中断源分别为 EXTI15_10_IRQn */


 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;

 /* 主优先级(抢占优先级)设置为1  (优先级数字越小,优先级越高) */


NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;

/* 子优先级(响应优先级)设置成1 */

NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

/*使能NVIC总中断 */

NVIC_Init(&NVIC_InitStruct);

}


二.GPIO初始化函数(需要包含stm32f10x_gpio.h头文件)

1.GPIO初始化函数程序


void GPIO_Configuration(void)

{


GPIO_InitTypeDef GPIO_InitStructure;

/*初始化GPIO结构体 */


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);

 /*打开APB2外设GPIOx端口的时钟  */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_标号|GPIO_Pin_标号;

/*管脚位置定义,标号可以是NONE、ALL、  0至15   */


GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

/*最高输出速度为50MHz */


GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;    

 /*推挽输出*/


GPIO_Init(GPIOx,&GPIO_InitStructure); /*GPIOx初始化 */


/*注:以上四行代码为一组,每组GPIO属性必须相同,默认的GPIO参数为:ALL,2MHz,FLATING。如果其中任意一行与前一组相应设置相同,那么那一行可以省略,由此推论如果前面已经将此行参数设定为默认参数(包括使用GPIO_InitTypeDefGPIO_InitStructure代码),本组应用也是默认参数的话,那么也可以省略。以下重复这个过程直到所有应用的管脚全部被定义完毕。*/

}


2.GPIO_Mode的四种输入、四种输出模式:


(1)输入(GPIO调成输入后不用设置速度)


GPIO_Mode_IPU          /*上拉输入      */

GPIO_Mode_IPD         /*下拉输入  */      

GPIO_Mode_AIN         /*模拟输入     */  

GPIO_Mode_IN_FLOATING /*浮空输入(GPIO的 默认电平由外部决定) */


(2)输出


GPIO_Mode_Out_PP       /*普通推挽输出  */            

GPIO_Mode_Out_OD       /*普通开漏输出  */  

GPIO_Mode_AF_PP        /*复用推挽输出  */

GPIO_Mode_AF_OD        /*复用开漏输出  */


三.EXTI初始化函数(需要包含stm32f10x_exti.h头文件)


void EXTI_Configuration(void)

{

EXTI_InitTypeDef EXTI_InitStruct;

/*初始化EXTI结构体*/

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

/*打开APB2外设AFIO的时钟*/


GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);   

/*配置中断事件(输入线选择PA0作为中断标志位)*/


EXTI_InitStruct.EXTI_Line = EXTI_Line0;

/*输入线选择EXTI_Line0(EXTI_Linex,当x属于0-15时,代表GPIOx_(0~15))*/


EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; 

/*配置模式为中断模式*/

/*模式有两种:*/

/*中断模式      EXTI_Mode_Interrupt */

/*事件模式      EXTI_Mode_Event */


EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;   

/*选择是上升沿还是下降沿触发中断*/

/*触发方式有三种:*/

/*上升沿           EXTI_Trigger_Rising */

/*下降沿           EXTI_Trigger_Falling */

/*上升沿和下降沿     EXTI_Trigger_Rising_Falling*/


EXTI_InitStruct.EXTI_LineCmd = ENABLE;     

/*使能中断屏蔽事件寄存器*/


EXTI_Init(&EXTI_InitStruct);

}


四.编写中断服务函数


void EXTI0_IRQHandler(void)      

/*起名规律:因为使用的是EXTI0的中断,所以起名为EXTI0的中断服务函数*/

{

       if(EXTI_GetITStatus(EXTI_Line0) == 1)

       {

       GPIOB->ODR ^= GPIO_Pin_0;

       }

       /*判断中断标志位有没有置位,如果产生中断(即条件为真),令PB0翻转*/

      EXTI_ClearITPendingBit(EXTI_Line0);   

      /*清除中断标志位,防止一直在中断里面*/  

}


五.主函数


int main(void)

      {

      EXTI_NVIC_Config();    /*配置中断优先级*/           

      GPIO_Configuration();  /*初始化GPIO*/

      EXTI_Configuration();  /初始化EXTI*/

      EXTI0_IRQHandler();   /*编写中断服务函数*/

      }


注意!!

中断服务函数

void EXTI0_IRQHandler(void)

的函数名不能更改

推荐阅读

史海拾趣

ELESTA GmbH公司的发展小趣事

1997年,ELESTA继电器有限公司正式成立,专注于制造符合IEC 61810-3标准的强制导向触点继电器。这一战略举措进一步巩固了ELESTA在电子继电器领域的领先地位,并为公司的长期发展奠定了坚实的基础。

Amphenol Nexus公司的发展小趣事

Amphenol Nexus Technologies的故事始于1961年,由William H. Flanagan和Randolph K. Byers两位创业者共同创立。当时,公司的核心业务是设计和制造高品质的音频插头、插孔和MIL-S-8805/3按钮开关。在创始人的领导下,公司凭借精湛的工艺和可靠的产品质量,逐渐在军事和商业通信耳机市场赢得了声誉。随着业务的扩展,Amphenol Nexus Technologies的产品线不断丰富,满足了市场日益增长的需求。

C.K Magma公司的发展小趣事

C.K Magma公司最初由一群热衷于电子技术的工程师创立。他们通过深入研究,成功开发出一种新型半导体材料,这种材料在性能和稳定性上均优于当时市场上的同类产品。这一技术突破为公司赢得了业界的关注,并吸引了第一批投资。随着资金的注入,C.K Magma公司得以扩大研发团队,进一步巩固了其在半导体领域的技术领先地位。

Elite公司的发展小趣事

进入21世纪后,电子行业迎来了新的发展机遇和挑战。面对行业内的激烈竞争和技术的快速迭代,Elite意识到必须加快转型升级步伐。公司开始涉足智能家居、物联网等新兴市场领域,并成功推出了一系列具有竞争力的产品。这些新产品不仅为公司带来了新的增长点,也进一步巩固了Elite在电子行业的领先地位。

FCI connector [富加宜连接器]公司的发展小趣事

自FCI成立以来,公司凭借其专业的设计、精密的制造工艺和创新精神,迅速在全球连接器市场上崭露头角。通过不断的技术创新和产品升级,FCI逐渐成为了全球领先的连接器制造商之一。其产品线涵盖了通讯、电源、医疗等多个领域,为全球众多知名品牌提供了优质的连接器解决方案。

D3 Semiconductor公司的发展小趣事

D3 Semiconductor自创立之初,就致力于半导体技术的研发与创新。公司凭借其独特的超结金属氧化物半导体场效应晶体管(MOSFET)技术,在功率电子市场上迅速崭露头角。这项技术在硬开关应用中展现出了同类最佳性能,为通讯、企业计算、不间断电源(UPS)和太阳能等领域提供了高效可靠的解决方案。D3 Semiconductor的这一技术突破不仅赢得了市场的认可,也为公司后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

modelsim下编译xilinx库的方法

建立ModelSim SE 的Xilinx仿真库方法,从网上搜到的有很多,实践过其中几种,其中一种较简单的方法如下:1)当然是要安装ModelSim 和ISE 。 2)将ModelSim根目录下的modelsim.ini文件的只读属性去掉。3)在ModelSim命令窗口输入:compxlib -s mti_s ...…

查看全部问答>

诚心求教, DeviceIoControl假死现象

小可刚接触USB(ez usb 68013)开发,遇到一个问题百思不得其解,想向大家讨教一下: 我用的是公板的驱动和固件,在应用程序里开双线程读数据(inBulkControl.pipeNum=1,),如果在读取的过程中再发送数据(outBulkControl.pipeNum=0),有时程序会停在读取数 ...…

查看全部问答>

Launch函数问题,高手请进

这一段是源代码 LEAF_ENTRY Launch                ldr            r2, = PhysicalStart                ldr&nbs ...…

查看全部问答>

USB Function总线驱动是在那里加载其DefaultClientDriver?

MSDN上说在[HKEY_LOCAL_MACHINE\\Drivers\\USB\\FunctionDrivers] 注册表项加个DefaultClientDriver注册表项,在机器启动的时候即可加载该Client Driver.但是我找遍了所有的代码,就是没找到是在那里启动DefaultClientDriver的?…

查看全部问答>

想学习linux嵌入式开发,请教学习方法和教材

想学习linux嵌入式开发,请教学习方法和教材…

查看全部问答>

BENQ M23G调试出现奇怪的问题,大虾救救

出现的问题:能接电话,不能打电话,发短信正常,收短信的内容不对。 我的操作如下: AT+CFUN=1 AT+CFUN=1          AT+COPS=0          AT+IPR=115200     &nbs ...…

查看全部问答>

Driver studio 在VS2005下build出现问题

刚开始接触驱动程序的编写,想在winXP下用VS2005来写编写一些驱动,但是出现了一些问题。 我安装那三个文件的顺序是这样子的:     1。VS2005   在D盘       2。DDK (Windows XP SP1 DDK),装在F盘 ...…

查看全部问答>

复杂电路分析

拿到一张复杂的电路图,各位都会怎么分析呢??如何确定电路中电流的流向和信号的输入输出的呢??请前辈们介绍下自己的经验(最好能举出特定的例子进行说明),在这里万分感谢了。。。…

查看全部问答>

不一样的51教程 之二 51的“芯”里

       上一篇我讲了几个基本概念,很可惜,它对于你马上点亮LED没有任何帮助,而这一篇,我要讲的是51芯片内部的东西,比如 存储器,然后我还会讲一下51,或者说任何CPU是如何工作的——当然只是一个很简单的过程,我的目的只 ...…

查看全部问答>

线性卷积在DSP芯片上的实现

《数字信号处理》要做课程设计,题目是:线性卷积在DSP芯片上的实现。要求:给出算法原理,写出主程序。…

查看全部问答>