kinetisstm8l 中断优先级 优先级 默认 哪里

【ZLG微信文档精选】能媲美维多利亚的秘密---NMI的秘密_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
【ZLG微信文档精选】能媲美维多利亚的秘密---NMI的秘密
|0|0|暂无简介
ZLG公司专业致力于单片机与嵌入式系统的推广...|
总评分0.0|
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢114网址导航后使用快捷导航没有帐号?
查看: 3745|回复: 5
从零入手Kinetis系统开发(九)之中断使用方法
在线时间146 小时
威望1063分
芯币1069枚
TA的帖子TA的资源
纯净的硅(中级), 积分 1063, 距离下一级还需 137 积分
纯净的硅(中级), 积分 1063, 距离下一级还需 137 积分
N久没更新从零系列了,呵呵,今天终于抽出空来写写了。其实写这个系列真是个头疼的事,作为主要面对入门级大众的博客既要少些非常专业性的语言(咳咳,当然太专业的俺也说不出,嘿嘿),通俗化而又不失专业,同时作为工程技术类博客,又马虎不得,笔风要严谨。所以好久能憋出一篇算是得意的系列来就不错了,嘿嘿,这不,终于憋出第九篇了,哈哈...(想起本山大叔小品,写月子2的段子了,挺像来)
& & 对于掌握一款单片机(Coretex-M系列定位就是高端单片机,呵呵,和Cortex-A系列的应用处理器定位是两个档次)来说,其中断机制是必须要掌握的,所以作为一个单片机开发者,编写相应的中断服务程序是最基本的要求之一了。前面提到过,本来在第八篇系列就该写写中断的使用方法了(其实这都算晚了,呵呵),不过那会儿玩TSI玩的正在热头上就趁热打铁的写了TSI模块,以致于拖到现在才开始写中断,哈哈,所以不多说废话了,直接进入正题。
& & Kinetis的中断机制其实也即是Cortex-M4核的机制,ARM从Cortex-M3核系列(ARMv7-M架构)开始就引入了嵌套向量中断控制器(NVIC)来管理其中断功能,其主要的特点包括:
(1)可嵌套中断支持,这点不用细说了,几乎大多数内核都支持中断嵌套,不过可能嵌套的级数有些不同;
(2)向量中断支持,Cortex-M系列通过查询中断向量表找到相应的ISR(中断服务程序)入口,并跳转执行;
(3)动态优先级调整,即支持软件运行时改变中断优先级,其实飞思卡尔的HCS12也支持这个,嘿嘿;
(4)中断延迟大大缩短,引入了一些新特性,例如咬尾中断,晚到中断;
(5)中断可屏蔽,支持条件性屏蔽即只屏蔽优先级低于某个阈值的中断,当然也可以屏蔽全部中断了;
& & Cortex-M核的NVIC最多支持200多个中断(包括系统异常16个和外部中断240个),只不过各大半导体厂商根据自家芯片的资源做了定制。其中前16个中断为系统中断(即核自己的,咱管不着,不过一些场合用的到),咱们主要关心的是IRQ中断(即外部中断,含外设资源),本系列既然主打Kinetis,就以其为例,重点介绍其特点和使用流程,刚刚是补补常识,下面才进入到本篇主角,哈哈:
1.首先介绍飞思卡尔Kinetis系列中断特点:
(1)低中断延迟,从中断发生到进入中断服务程序最多12时钟周期;
(2)最多120个中断,包含16个核中断和剩余的外部IRQ中断;
(3)最多16个可编程优先级;
(4)动态改变优先级;
(5)可重定位向量表,通过写SCB_VTOR寄存器。
2.按部就班,老套路了,介绍完特点之后,下面细说说要写完整的中断服务程序的流程步骤,擦亮眼睛啦,呵呵,先上个图:
(1)使能外设的中断功能,也就是说打开外设的中断使能位(如果外设支持中断的话),使之与NVIC的中断输入连接;
(2)清除已经挂号发生的中断(避免刚打开即进入,可能造成一些不必要的影响),写NVICICPRx寄存器;
(3)使能相应IRQ中断号在NVIC的中断功能,写NVICISERx寄存器;
(4)配置中断优先级(可选,不设置的话默认,即按照在中断向量表的排序来决定),写NVICIPx;
(5)写相应的中断服务程序(ISR);
(6)使能全局中断EnableInterrupts,其实在启动代码部分已经开启,不过为了稳妥还是再使能一次。
哦了,按照上面6步即可完成相应资源中断功能的实现,so easy吧,呵呵,下面就根据实例来看下具体在程序里是如何实现的吧:
3.该步通过拿出来我以前分享的IAR框架代码来分析下,具体如何实现中断服务机制的,以上篇系列的TSI中断为例,贴代码:
(1)使能相应外设的中断:
& & ENABLE_EOR_INT; /* 使能TSI越界中断 */
(2)根据TSI的IRQ中断号,清除已经发生的TSI中断事件,并且使能TSI中断功能,首先在K60的datasheet或者直接到其头文件开始处即可找到中断向量表,查到TSI的IRQ中断号(但是要注意IRQ号=中断向量表号-16(即前16个核中断,它们不是IRQ中断)):
注意图中所示为中断向量表号,IRQ中断号为99-16=83。
然后利用ARM核自带的API函数使能TSI的IRQ中断,如下
& & enable_irq(83);&&/* 使能TSI的IRQ中断 */
该函数的具体内容如下,注意每个NVICCPRx和NVICISERx都是32字节对齐的,即管理32个IRQ中断,所以要根据TSI实际的中断号算出其具体在哪一个寄存器里设置。
void enable_irq (int irq)
& & div = irq/32;
& & switch (div)
& &&&case 0x0:
& && && && &&&NVICICPR0 |= 1 && (irq%32);
& && && && &&&NVICISER0 |= 1 && (irq%32);
& && && && &&&
& &&&case 0x1:
& && && && &&&NVICICPR1 |= 1 && (irq%32);
& && && && &&&NVICISER1 |= 1 && (irq%32);
& && && && &&&
& &&&case 0x2:
& && && && &&&NVICICPR2 |= 1 && (irq%32);
& && && && &&&NVICISER2 |= 1 && (irq%32);
& && && && &&&
& & }& && && && &&&
(3)配置优先级,这一步如果没特殊需要的话可以默认,不设置即可,如果设置的话也可以通过API函数执行,如下
& & set_irq_priority (83,5); /* 设置TSI中断优先级为5,注意越小优先级越大 */
(4)编写相应的中断服务函数
/********************************************************************************
**Routine: TSI_isr
**Description: TSI模块,out of Range 中断服务程序,中断服务号为99,IRQ为83
********************************************************************************/
void TSI_isr(void);
然后在写完该中断服务函数之后,我们需要把该中断函数地址映射到中断向量表里面,所以找到isr.h文件打开,设置如下;
& & #undef&&VECTOR_099&&/* 取消原来默认的宏定义 */
& & #define VECTOR_099& && &TSI_isr&&/* 重定义中断服务函数名为VECTOR_99*/
(5)使能全局中断
EnableI /* 其宏定义为CPSIE i,即设置特殊功能寄存器 */
& & 完整的中断编写流程如上,喝口水。其中可能有些寄存器和有关NVIC概念和结构之类的建议看看官方文档或者直接到ARM官网下载Cortex-M核的介绍瞅一瞅,相信会让你受益匪浅。
& & 我所介绍的只是肤浅表面的入门流程,换句话说有点授之以鱼了,这点检讨一下,不过要完整的介绍NVIC原理的确有点心有余力不足,呵呵,建议大家有时间找找相关资料查查,知其所以然。上面的流程应付一些简单应用已经绰绰有余了,着急应用的网友可以直接用在应用上,还是那句话,修行在个人,大家的起跑线都是一样的,至于最后谁跑在最前面就看谁付出的努力,哈哈。
Nicrosystem专业提供freescale、TI和STM32高性价比开发板、解决方案
在线时间9014 小时
威望185354分
芯币16375枚
TA的帖子TA的资源
回复 楼主 bluehacker 的帖子
哈哈 不出则已 一出就重磅啊
2017,加油!
继续为中国电子行业做出小小的贡献吧!
在线时间1 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
回复 沙发 soso 的帖子
好贴!!!
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
太感谢楼主了~~
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
不错的东西。
在线时间5 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
好东西!!!支持了啊!!!!!!!!!!!!!!
Powered by
逛了这许久,何不进去瞧瞧?转:关于Kinetis L系列中断优先级设置问题的解决方案 - 飞思卡尔技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
转:关于Kinetis L系列中断优先级设置问题的解决方案
11:28:14  
最近在调试Kinties L系列的时候,使用官方例程中arm_cm0.c,使用其中的void set_irq_priority (int irq, int prio)函数设置了中断优先级,然后仿真的时候,在寄存器窗口发现NVIC_IPRx寄存器的值并没有改变,然后查看寄存器具体的地址的内存发现也没有改变, 后来将NVIC_IPRx寄存器地址的值赋给一个变量,然后使用printf将该变量打印出来,发现第一次能够打印正确的值,但是连续第二次打印,值又变为了0.当时感觉很奇怪,然后仔细阅读了下ARM Cortex-M0的内核文档:The Definitive Guide to the ARM cortex M0.pdf.
发现对于中断优先级的操作,和ARM Cortex-M4还是有区别的:主要在于对于M0+内核的NVIC_IPRx寄存器,每次操作都是一组32位操作,若要改变寄存器的值,首先先要读出相应的值,然后改变一个字节,再将值写回到原来的地址上。
M0内核文档是这么讲的:
[size=0.83em]1.jpg (62.66 KB, 下载次数: 0)
[color=rgb(153, 153, 153) !important] 10:49 上传
11:28:39  
而M4内核就不一样,是可以字节操作的,这点在M4的内核文档上也可以找到。所以,我认为,原来arm_cm0.c中set_irq_priority (int irq, int prio)函数不能实现优先级正确设置的原因之一,是由于采用了8位操作的方式如下:uint8 *prio_prio_reg = (uint8 *)((uint32)&NVIC_IP(div));*prio_reg = ( (prio&0x3) && (8 - ARM_INTERRUPT_LEVEL_BITS) );&&定义需要修改为:uint32 *prio_prio_reg = (unsigned long *)((uint32)&NVIC_IP(div));//div第二,从原来的代码可以看出,并不能准确的实现具体irq的定位与值的修改。假设我们需要设置:&&set_irq_priority(17, 3);可以看出,上面错误的代码只能实现irq=16值的修改,原因其只是定位到了NVIC_IPR4中的低字节,而没有在IPR4中4个字节做偏移,所以只能修改irq=16的优先级。根据我们的reference manual可以知道,在每组IPR中,具体定位IRQ,可以通过8*(IRQ mod 4)+6的方法,注意mod是取余数,程序中是“%”,不要理解为“/”.综合上面两点,我将set_irq_priority函数修改如下:void set_irq_priority (int irq, int prio){& && & /*irq priority pointer*/& & uint8 *prio_& & uint8 err = 0;& & uint8 div = 0;& & uint32 temp=0;& & uint32 *prio_reg1;& & /* Make sure that the IRQ is an allowable number. Right now up to 32 is& &&&* used.& &&&*& &&&* NOTE: If you are using the interrupt definitions from the header& &&&* file, you MUST SUBTRACT 16!!!& &&&*/& & if (irq & 32)& & {& && &&&printf(&\nERR! Invalid IRQ value passed to priority irq function!\n&);& && &&&err = 1;& & }& & if (prio & 3)& & {& && &&&printf(&\nERR! Invalid priority value passed to priority irq function!\n&);& && &&&err = 1;& & }
& & if (err != 1)& & {& && &&&/* Determine which of the NVICIPx corresponds to the irq */& && &&&div = irq / 4;& && &&&prio_reg1 = (unsigned long *)((uint32)&NVIC_IP(div));//div& && &&&*prio_reg1 = ( (prio&0x3) && ((8 - ARM_INTERRUPT_LEVEL_BITS) + 8*(irq%4)));& & }}
11:28:59  
同样以set_irq_priority(17, 3);为例,使用CW测试的结果如下:
(59.17 KB, 下载次数: 0)
(48.79 KB, 下载次数: 0)
11:29:53  
给出修改后的arm_cm0.c文件
11:29 上传
点击文件名下载附件
下载积分: 积分 -1 分
1.47 KB, 下载次数: 1, 下载积分: 积分 -1 分
13:20:45  
很好,也遇到这个问题了 学习
16:10:59  
很好,也遇到这个问题了 学习
那就好好学习吧,自己解决
16个问题&&&&&&&&59602个浏览
9个问题&&&&&&&&59145个浏览
14个问题&&&&&&&&3636个浏览
ADAS相比较无人驾驶有望在短期内率先商业化普及,是汽车领域非常重要的产品革新。专家将解答:
1、汽车智能化开发经验和思路
2、ADAS相关技术难点
3、汽车智能化的产业痛点是什么?
每天选一个需要解决的问题,大家一起来帮忙。
授人玫瑰,手有余香
本次讲解答的问题例举:
1、NB-IoT有哪些技术特点和难点?
2、NB-IoT技术对物联网市场将带来什么样的影响。
3、NB-IoT物理层有哪些组成部分?
4、NB-IoT技术如何实现低功耗?
Powered by君,已阅读到文档的结尾了呢~~
基于cw10的kinetis中断程序编写
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于cw10的kinetis中断程序编写
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 stm32f103中断优先级 的文章

 

随机推荐