您的位置 首页 方案

SysTick体系时钟滴答试验(stm32中止入门)

系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部…

 体系时钟滴答试验很不难,我就在面简略说下,但其间触及到了STM32最杂乱也是今后用处最广的外设-NVIC,假如说RCC是实时性一切必要考虑的部分,那么NVIC便是stm32功能性完成的根底,NVIC的难度并不高,可是了解起来仍是比较杂乱的,我会在本文中从实践使用出发去阐明,当然最好去仔细研读宋岩翻译的第八章,留意这不是一本教你怎样编写STM32代码的工具书,而是论述Cortex-M3内核原理的参阅书,非常值得阅览。

 SysTick体系时钟的中心有两个,外设初始化和Systick_Handle()中止处理函数。

 Systick装备:

static void SysTick_UserConfig(void){SysTick->CTRL &= 0xfffffffb;  //选用内核外部时钟,即SYSTICKSysTick->LOAD = 0x8;       //重装值寄存器,VAL内数值为0时重装 SysTick->VAL = 0x00;          //SysTick其时值寄存器 清零SysTick->CTRL = 0x03;         //SysTick守时器使能,中止使能}

NVIC装备:

void NVIC_UserConfig(void){NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);      //将指针指向flash中的中止向量表}

中止函数:

void SysTick_Handler(void){static  uint32_t LED_Flag = 0;if(LED_Flag < 50){LED_1_ON();}if(LED_Flag >= 50){LED_1_OFF();}LED_Flag++;if(LED_Flag == 100){LED_Flag = 0;}}

 如此,就完成了简略的SysTick滴答试验,代码请参阅:http://files.cnblogs.com/files/zc110747/6.SysTick.7z

看到这是不是就完毕了,不过记住其时我写完这个程序,疑问有以下几点:

1.向量表是怎样界说的,重定位的操作有什么效果

2.为什么中止函数名必定要是void SysTick_Handler(void),怎样确认的

3.中止打乱了正常的程序流程,cpu怎样知道回到之前运转的方位

4.中止优先级怎样装备和了解

怎样处理这些问题,这都需求从原理方面来处理了,了解过IAP和uC/os-ii的对这些问题应该有必定认知,下面我就体系的讲解下我的主意:

1~2问题.当 CM3 内核呼应了一个发生的反常后,对应的反常服务例程(ESR)就会碑文。为了决议 ESR 的进口地址,这便是所谓的“向量表查表机制”。向量表其实是一个 WORD( 32 位整数)数组,每个下标对应一种反常,该下标元素的值则是该 ESR 的进口地址。假如仔细检查startup_stm32f10x_cl.s,就会发现下面查办:

; Vector Table Mapped to Address 0 at ResetAREA    RESET, DATA, READONLYEXPORT  __VectorsEXPORT  __Vectors_EndEXPORT  __Vectors_Size__Vectors       DCD     __initial_sp               ; Top of StackDCD     Reset_Handler              ; Reset HandlerDCD     NMI_Handler                ; NMI HandlerDCD     HardFault_Handler          ; Hard Fault HandlerDCD     MemManage_Handler          ; MPU Fault HandlerDCD     BusFault_Handler           ; Bus Fault HandlerDCD     UsageFault_Handler         ; Usage Fault HandlerDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     SVC_Handler                ; SVCall HandlerDCD     DebugMon_Handler           ; Debug Monitor HandlerDCD     0                          ; ReservedDCD     PendSV_Handler             ; PendSV HandlerDCD     SysTick_Handler            ; SysTick Handler; External InterruptsDCD     WWDG_IRQHandler            ; Window Watchdog......DCD     OTG_FS_IRQHandler          ; USB OTG FS__Vectors_End__Vectors_Size  EQU  __Vectors_End - __VectorsAREA    .text, CODE, READONLY

  其间_Vectors既是所说到的WORD数组,这便是界说的向量表,假如了解过指向函数的指针,那么就能够知道,DCD的每一项便是界说的中止服务例程,这样咱们就知道为什么Systick中止的中止服务例程是SysTick_Handler,当然依据实践状况这个向量表只要和主函数代码保持一致就能够完成中止的查询,例如uC/os-ii移植中修正PendSV_Handler。

  看到这处理了第二个问题,那么第一个问题,从上面能够看出来,向量表一向坐落代码的最顶端,也便是偏移量0x0的方位,为什么有时还需求重定位呢?假如看过IAP那篇,了解了发动机制后,应该理解上电后体系会默许跳转0x00(flash地址0x08映射),然后读取向量表偏移寄存器,查询向量表,由于此刻向量表的偏移量便是0x0,向量表就不需求重界说。而在IAP形式下,使用代码的开端地址并不是flash首地址,而是由偏移量0x8(假定值),从上面也能够简略推出使用代码的向量表偏移量也是0x8,此刻向量表偏移寄存器就需求重界说了。

下图来自于list下生成的.map文件

再参阅生成的bin文件和发动文件:

能够很明晰证明上面的观念。

3.了解M3芯片根底的应该知道,M3具有通用寄存器组R0~R15,这些寄存器在程序运转中保存着代码流程的一切信息,包含其时地址,正在修正的变量参数。因此在中止触发时,只要将R0~R15顺次压栈,中止完毕后出栈,代码就会回到运转之前的方位(uC/OS-ii正是模仿该进程完成使命切换的),当然这仅仅最简略的一种状况,由于m3芯片自身支撑中止优先级和中止嵌套,实践杂乱度远高于此.其实能够简化为如下流程:

  主程序暂停 -〉相关方位和状态参数入栈-〉中止服务例程碑文-〉相关方位和状态参数出栈-〉主程序康复

4.Cortex-M3支撑最多240个可装备中止,中止优先级的数目3~8位,也便是支撑8~256个优先级,而事实上一般并没有支撑那么多,如8,16,32级,其间最多支撑128个抢占级。arm中止及复位操控寄存器中的3~8位设定优先级的部分,经过装备可将其分割为两部分,前面为抢占级,后边为亚优先级,而且亚优先级至少为1位,分组是能够从保存的优先级组开端的。一个中止的优先级可经过以下次序判别,优先级依此下降。

  优先级组:抢占级 > 亚优先级

  优先级: 数值小 > 数值大

  中止号: 中止号小 > 中止号大

抢占级和亚优先级的差异:

  抢占级是在发生在中止嵌套的根底,上面说到了中止打断了线程的流程,可是假如有抢占级的参加,中止自身也会被优先级更高的中止打断,详细流程如下:

  主程序暂停 -〉低优先级中止 -〉高优先级中止-〉低优先级中止-〉主程序康复

  亚优先级一共没有发生中止的嵌套,一个中止只要在它完毕后另一个亚优先级的中止才会呼应,即不会发生中止嵌套。

此外为了加速中止碑文的流程,Cortex-M3供给了根据优先级的四种动作:

  1.占先:首要发生在抢占级中,即高优先级中止低优先级碑文,发生中止嵌套

  2.结尾连锁:若占先发生上一个中止的结尾出栈之前,则打断出栈动作,直接碑文高优先级中止,完毕后假如没有发生抢占,才碑文出栈

  3.迟来 若占先发生在中止的开端入栈阶段,则持续入栈,低优先级中止挂起。

  4.回来 出栈进程,假如收到高优先级中止则中止并发生结尾连锁

  从上面能够看出,中止优先级和中止嵌套在加上ARM根据优先级机制的优化,能够让中止中高优先级使命更快碑文,正是优先级设定的含义。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/265802.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部