好了,今天来学学中断的优先的用法.
对于学过51的同学来说,以上的三季学到了,就可用ARM的中断了.下面只是好好学习,天天UP而已.说真的,我做电路还真没想过要做到抢先中断的,
就是原来的的中断正在执行,再来一个更高级别的中断请求,就会挂起正在执行的中断,来执行优先级更高的中断服务程序.STC有些型号的蕊片好象
有,但我从来没用过.但对于STC来说,ARM是超级单片机了.我来学这个主要将来用来做主控蕊片的.我来说说设计方面的题外话.我主要业务是设计
非标准生产设备的,当我设计一个系统的时候,很喜欢将各个功能分成一个个模块,每个模块都有两个单片机,一个用来做通信用的,为另一个主蕊片做
通信服务,主蕊片主力做实时处理,在空闲的时间将要发的数据和收到的数据和 通信 蕊片做个交换,我用的都是3.5元一个的44脚帖片封装的STC,很多
脚没有用就自己搞个并行通信的I8C(I2C的并行版,偶山寨的).各个模块之间由一个主蕊片汇总,将要显示的都显示出去,要做中转的中转出去.总之是一
个邮局的效果.总觉得人机介面没那么拉风,所以现在搞个ARM来做个拉风的人机介面.这就是我最初学ARM的目的.
跑题了,我们言归正传.
众所周知的原因,厂家的偷工减料的那些事.256个优先中断,128个抢先中断.最后我们只能得到8个抢先中断(我们学习板上的ARM蕊片).
那如何来使用呢?
是这样的.
首先: (声明 一下,以下的X是二进制的0和1,不是骂人的哈)
第一种使用:
你看 这4位 XXXX , 第一种使用方法,我们将理解成我们常用的先到先得的原则,那个中断先执行,后到的在后边排队.如果超过一个中断在排队,
那么,数字小的先排前边,数字大的排后边,总之没执行之前,都在外边按数字的大小排队,数字越小,就越靠前. 如设成中断优先值为 0010 先排队,在排
队期间, 有一个中断优先值为 0001的中断到了, 那么系统会将中断优先值为 0001的排前边,等他执行完中断服务程序后才到中断优先值为 0010 的中
断.如后边不断的还有其它中断进来,就如些类推.
第二种使用:
我们将XXXX分开两档. X XXX 红色的X代表更高的优先级,蓝色的X的作用和第一种使用方法一样. 如果正在执行的中断优先值的最高位比后来到的
中断的中断优先值的最高位大,则后来的中断可以打断前边正在执行的中断,挂起原先的中断,先执行这个中断后再执行之前挂起的中断.
如: 中断优先值 为 1 010 正在执行,现在中断优先值 为 0 010 的中断到了,则系统会先挂起中断优先值 为 1 010的中断,先执行中断优先值 为 0 010 的中断.
又如: 中断优先值 为 1 010 正在执行,现在中断优先值 为 1 000 的中断到了,则系统不会中断优先值 为 1 010的中断,而中断优先值 为 1 000 的中断则在外边排队.看到没有,蓝色的数字的都是排队的时候才用来定位置的前后的.而红色的字就牛B了,他能打断优先级底的中断而先执行他自己 的中断.
第三种使用:
和一边一样样,只是两档的位数不同了, XX X X 红X有两位了,蓝X只有一位了.红蓝X的用法和上边一样,只是我们可以设更多级的抢断优先级了,如 00,01,10,11 对了,可以有4种优先级了.只有中断优先值红X的数比之前正在执行的中断优先值红X的数更小就能打断之前的中断优先执行这个中断优先值红X小的.大家没明白??我打个比方
如: 中断优先值为1100中断正在执行,中断优先值为1000的中断到了,系统挂起中断优先值为1100的中断,执行中断优先值为1000的中断,正在执行间又来了个中断优先值为0100的中断,则系统又会挂起中断优先值为1000的中断,而执行中断优先值为0100的中断.当然如还有中断优先值为0000的中断到了,系统一样会挂起之前中断优先值为0100的中断,而执行中断优先值为0000的中断.他们叫这个叫做中断嵌套.
第四种使用方法:
和第三种使用方法一样. 只是全是红X多一个而已.蓝X的使用也和上边一样,只是只有一位而已.
第五种使用方法:
同第四种使用方法一样,只是这次全是红X而已,这样就是红X小的打断红X大的,同样的红X在外边排队.排队也是红X小的排前边.比正在执行的小就打断正在执行的中断转而执行自己的.
那么,这三X是放那个寄存器呢,在存在 IPR[0]~IPR[15].用法请看原子老大出的书<<例说STM32>>第68页的上半段 ,没有的找他买就是了.要注意的是,原子老大没写上去的(师博就是要留一手呀留一手):对应的8位中,只有高4位有用.其它的位是没用的.就是上边所说的只能填最高位的4个X.
你分好上边的各个中断的优先级后,最后用SCB->AIRCR 定义几个位是红X,几个位是蓝X.
SCB->AIRCR 的第8位到第10位.
如填 111 就表示 没有红X,就是上边所说的第一种使用方法.如如填 110 就表示有1个红X,3个蓝X,就是第一种使用方法. 如填 101 就表示 有2个红X,2个蓝X 第二种方法. 如填 100 就表示 就表示 有3个红X,1个蓝X 第三种方法. 如填 011 就表示 就表示 有4个红X,没有蓝X 第4种方法.
好了,到些为止,中断就学完了.还有几个寄存器,到时写个程式读出来玩一下就明白了.到此,ARM32我们就能用了.不容易呀.一个字,学得好累.
明天,我来做个大总结,将中断要用的代码全部写出来.此刻有望原子大大斧正一下.有错就改,免得学歪了. |