您好、欢迎来到现金彩票网!
当前位置:彩之网 > 中断屏蔽 >

STM32的Cortex-M3中断异常处理

发布时间:2019-07-28 12:57 来源:未知 编辑:admin

  F103VBT6写了一个中断的函数,借此机会想了解下STM32的中断机制,用过之后发现STM32的中断配置相当灵活,稳定行很高,测试发现几乎没出过什么差错。我在程序里开了三个中断,一个计数器用于精确延时用,另外两个为外部事件处理中断,下面一一详细介绍,方便初学者入门。

  在STM32处理器中有43个可屏蔽中断通道(不包含 16个 Cortex?-M3的中断线个可编程的优先等级(使用了 4位中断优先级);它的嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和有效处理地处理晚到的中断。嵌套向量中断控制器管理着包括核异常等中断。

  Cortex—M3是一个32位的核,在传统的单片机领域中,有一些不同于通用32位CPU应用的要求。比如在工控领域,用户要求具有更快的中断速度,Cortex-M3采用了Tail-Chaining中断技术,完全基于硬件进行中断处理,最多可减少12个时钟周期数,在实际应用中可减少70%中断。

  异常或者中断是处理器响应系统中突发事件的一种机制。当异常发生时,Cortex—M3通过硬件自动将编程计数器(PC)、编程状态寄存器(XPSR)、链接寄存器(LR)和R0~R3、R12等寄存器压进堆栈。在Dbus(数据总线)保存处理器状态的同时,处理器通过Ibus(指令总线)从一个可以重新定位的向量表中识别出异常向量,并获取ISR函数的地址,也就是保护现场与取异常向量是并行处理的。一旦压栈和取指令完成,中断服务程序或故障处理程序就开始执行。执行完ISR,硬件进行出栈操作,中断前的程序恢复正常执行。图1为Cortex—M3处理器的异常处理流程。

  Cortex-M3的内核中包含一个SysTIck时钟。SysTIck为一个24位递减计数器,SysTIck设定初值并使能后,每经过1个系统时钟周期,计数值就减1 。计数到0时SysTIck计数器自动重装初值并继续计数,同时内部的COUNTFLAG 标志会置位,触发中断( 如果中断使能情况下 ) 。

  对于STM32系列微处理器来说,执行一条指令只有几十个 ns ,进行 for 循环时,要实现N毫秒的x值非大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值。针对STM32微处理器,需要重新设计一个新的方法去实现该功能,因此,在STM32的应用中,使用Cortex-M3内核的SysTick 作为定时时钟,设定每一毫秒产生一次中断,在中断处理函数里对N减一,在Delay(N)函数中循环检测N是否为0,不为0则进行循环等待;若为 0 则关闭 SysTick 时钟,退出函数,这种延时函数的做法能很高效地实现精确定时。

  思路:利用systick定时器为递减计数器,设定初值并使能它后,它会每个系统时钟周期计数器减 1 ,计数到 0 时 ,SysTick 计数器自动重装初值并继续计数,同时触发中断 。那么每次计数器减到 0 ,

  有了以上思路做铺垫后,为了实现首先我们需要一个72MHz的SysTick时钟。

  由于系统时钟(SysTick)可选择为PLL输出、HSI或者HSE,在这里选择9倍频的PLL作为SysTick的时钟源,同时HCLK(AHB Clock)时钟也相应的配置成72MHz了,因为最终SysTick是需要通过AHB后输出的,所以在配置的同时也需要选择AHB 时钟,这里选择为RCC_SYSCLK_Div1(咖啡色部分)表示AHB 时钟 = 系统时钟,相关配置见下面函数(RCC_Configuration)红色字体部分。这里需要特别强调一点,有关书籍里常提到“SysTick的最高频率为 9MHz (最大为HCLK/ 8),在这个条件下,把SysTick重装载值设置为9000,将SysTick时钟设置为9MHz,就能够产生1ms 的时间基值”刚开始对这句话感到很迷惑,因为,有的地方介绍SysTick没有说最大频率智能9MHz,这里却指出会被8分频,两者出现了矛盾!相信有过我这种疑惑的人不在少数!究其原因我猜想是原文作者没有说明这点,转载的人见到有相关的知识便直接转载了,自己也没去想,估计也没弄明白过,这样便一个个都转开了,所以我建议在吸取别人精华时要多多思考,只有注入了自己的新元素知识才是被真正吸收了,否则即使涉猎的再多,也只是收藏!现在再来分析下上面的那个矛盾点,其实应该这么理解的,在STM32中,SysTick的架构其实是这么回事的:首先选择时钟源--》AHB--》这里便分走两路,其一被8分频,也便出现了最高频率9MHz的结果;其二作为FCLK(CM3上的自由运行时钟)直接从AHB输出,这里却是没有再分频的,其频率就是AHB时钟频率,最大可以达到72MHz,下面程序对其设置也是在72MHz的的情况下的,具体可以参考STM32时钟架构这幅图,如下:

  配置完了RCC后,接下来便是需要配置SysTick了,使用 ST 的函数库使用 systick 的方法一般步骤如下所示:

  编写响应的中断服务子函数,这个先对比较简单,直接在stm32f10x_it.h的void SysTickHandler(void)函数里填充计数值便可:

  记住,在调用它的.C文件里记得申明TimingDelay这个变量为全局变量,否则无法使用这个计数值:

  上面函数只是完成了前5步,接下来需要开启SysTick计数器以便让其工作,前面已经说过在SysTick一般多用于做精确延时用,故而对于这个延时函数它的生命周期便在调用开始到调用结束,所以第6部一般放在被调用的这个函数中(Delay(N)):

  至此,一个小的时钟便算配置好了,接下来配置其他两个中断,道理是一样的,这两个为按键输入,作为外部中断事件,分为两个部分,其一为端口配置在GPIO_Configration函数中,选择工作模式为上拉输入,用作外部中断线路,下降沿触发

  显然,很容易想到——利用DMA。所以,笔者使用输入捕获事件触发DMA来搬运寄存器而非触发中断即可,然...

  1. 在汇编中保存现场,然后调用C语言编写的中断处理程序,任务处理完成之后,再返回到汇编中恢复现场,...

  学习STM32开发,肯定少不了DEBUG调试这一步骤。那么,本文带你了解一下这个调试相关的知识。本文...

  arm 官方也开始推这种通用库了。而此时st发现一剑走天涯的方法的确有很多弊端,开始了stmcube...

  从数据搬运的角度看,如果要把存储地址A的数值赋给另外一个地址上B的变量,CPU实现过程为首先读出A地...

  简单的一种应用,ARM芯片作为master,flash为slaver,实现单对单通信。

  根据微软学术的定义,所谓超频(OVERCLOCKING)就是强制将计算机或硬件运行于厂商指定的时钟频...

  大家可能是从51单片机过来的,回想一下,我们之前学单片机时如何入门呢?实际上都是先看书(理论),再玩...

  24V无刷直流 (BLDC) 电机正弦波驱动,应用于空气净化器风扇。此参考设计是用于无刷直流 (BL...

  这里不用中断(interrupt)而用异常(exception),毕竟中断只是异常的一种情况,呵呵 ...

  STM32是32位的单片机却只要八位单片机的价格,速度也是八位的好几倍。

  将Jlink与学习板,USB延长线与学习板,串口延长线与学习板(或者USB转串口线与学习板)连接起来...

  通过观察后台提问的内容来看,关注我的人中STM32初学者占大部分,而且大多处于小白阶段。所以,今天暂...

  仔细的同学可能会发现为什么调用了两次cJSON_CreateObject,但只看到释放了其中的dev...

  上拉输入就是在输入电路上使用了上拉电阻。这种模式的好处在于我们什么都不输入时,由于内部上拉电阻的原因...

  烧录成功后,按下学习板上的RST按键(学习板最右边的那个按键),这时候4个LED(LED1-LED4...

  NandFlash是地址数据线复用的方式,接口标准统一(x8bit和x16bit),所以不同容量再兼...

  当我们在入门之前(ARM是这样,DSP也一样),总会有很多疑问,会有很多顾虑。我们渴望知道学习STM...

  问题描述: 某STM32客户反馈, 当STM32F407V芯片频繁的正常通断电的时候,FLASH 会...

  1.为什么我们要先开启STM32外设模块时钟; 2.关于STM32的 I/O 复用功能及什么时候开...

  刚从硬件跳槽为嵌软时,没有任何一丝的准备。一入职,领导就交代了一项特难的任务——在stm32上移植l...

  基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-...

  非常简单的一个工程,没有用到任何IO操作,与STM32有关的仅仅只有芯片的选择,即其SRAM大小有区...

  基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-...

  如果CPU写入的是逻辑1,则编号3的N-MOS管将处于关闭状态,此时IO端口的电平将由外部的上拉电阻...

  最后一步是从STOP模式怎么恢复了,恢复其实也很简单,外部中断来了会进入中断函数,然后STM32就被...

  不论是人脸、文本或其他图像数据,使用嵌入式系统执行现场图像识别的需求与日俱增。许多实现需要昂贵的高端...

  STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于...

  门禁系统主要由意法半导体公司的主控芯片STM3H、Microchip公司的以太网控制器ENC28J6...

  原来STM32的开发以标准外设库为主,所以以前的FOC4.3是基于标准外设库的,而现在STM32以S...

  RTC时钟配置必须要用到BKP寄存器,BKP寄存器在单片机复位、电源复位、待机唤醒模式下是不会更改值...

  有人问:MDK-ARM和IAR都是属于商业版的软件,为什么还有那么多开发STM32的人都在使用?有什...

  说到复位,我们都不会陌生,系统基本都有一个复位按键。复位的种类有很多:上电复位、掉电复位、复位引脚复...

  嵌入式的编程,往下说就是操作MCU的寄存器。而固件库就是函数的集合,固件库函数的作用是向下负责与寄存...

  某些系统允许复位,但对外设又有特殊要求:某一个IO状态不能因为复位而改变,某一个定时器计数器不能改变...

  几乎所有的嵌入式系统都需要能够在现场更新其固件,从而添加新特性或修复漏洞。然而,固件现场更新可能会颇...

  STM32从SD卡中读取语音文件进行播放,因此需要对语音进行解码,刚开始就一直使用Speex的音频压...

  Cortex-M3的设计允许单片机高频运行(现代半导体制造技术能保证 100MHz以上的速度)即使在...

  对于很多刚刚开始接触STM32系列单片机的人来说,可能会对这一系列的单片机感到茫然,不知道这突然之间...

http://ando2.com/zhongduanpingbi/316.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有