7. Stm32f407 key外部中断

                                7. Stm32f407 key外部中断

 

硬件平台:  stm32f407ve

软件平台:  win10 (OS Name:                   Microsoft Windows 10 Enterprise

                                  OS Version:                10.0.18363 N/A Build 18363)

             Keil5  5.26.2

             HAL库版本: 2.14.0(目前下载的最新的)

时间:   2020-02-13

 

中断这个部分需要参考中文手册和权威指南。

这里我还是提一下NVIC这个东西,全称是Nested vectored interrupt controller,即嵌套向量中断控制器。这个器件是用来管理stm32所有中断的(在现实生活中,可以类比于电信运营商,运营商不给你电话的权限,那你的电话是打不出去的),NVIC不允许这个中断能触发中断,那么不管这个中断如何设置,或者怎样触发,都不会引起cpu的反应(中断响应)。

 

所以,我们的程序中必然要设置NVIC的部分,之后要设置的所有的中断,都应该注意这个NVIC的设置部分,NVIC设置比较简单,只有中断优先级和中断使能就可以。到底哪个中断先响应或者抢占其他中断这个也是NVIC的管理范畴。

 

 

Stm32f4中断的优先级比较特殊,它总共只能设置16级中断,数字越小,优先级越高。(arm芯片在设计的时候,是可以支持更多的优先级(128级或256级)的,但是更多的优先级意味着更复杂的中断优先级管理电路,更复杂的逻辑,更大的功耗,stm32在设计的时候做了取舍,而且基本上来讲,16个优先级中断还是能满足大部分的应用了)。

 

16级中断只需要4个位就可以满足,4个(二进制)位就能表示16个数,在设置优先级的部分就只需要设置中断优先级寄存器的高4位就可以了,低4位无效(为什么选高4位,可以参考权威指南手册,是st公司考虑程序兼容的问题)。

 

Stm32f4系列还可以把这个优先级分为抢占优先级和响应优先级,他们两个的总和还是16.

我的程序在HAL_init初始化了中断优先级的分配

 

这里有详细的说明,我们的程序设置的是16级抢占优先级。

NVIC_PRIORITYGROUP_0: 0 bits for preemption priority 没有抢占优先级

                      4 bits for subpriority       16级响应中断

NVIC_PRIORITYGROUP_1: 1 bits for preemption priority 2级抢占中断

                     3 bits for subpriority        8级响应中断

NVIC_PRIORITYGROUP_2: 2 bits for preemption priority 4级抢占中断

                      2 bits for subpriority       4级响应中断   

NVIC_PRIORITYGROUP_3: 3 bits for preemption priority 8级抢占中断

                     1 bits for subpriority        2级响应中断

NVIC_PRIORITYGROUP_4: 4 bits for preemption priority  16级抢占优先级

                     0 bits for subpriority        没有响应优先级

 

 

 

最后,就是中断处理函数

中断处理函数的原则:

  1. 在满足功能的情况下,应该越快越好,不得阻塞,不得调用获取信号量或者锁之类的引起阻塞的函数。
  2. 没有返回值,没有参数(这基本是所有中断函数的特点)。
  3. 尽量不使用printf函数,这个也是会引起阻塞的
  4. 要清除中断标志

 

我们的中断处理比较简单:

翻转led,因为按键是机械形变,所有会造成机械抖动,在电信号的部分产生抖动信号,所以实际按键的时候,并不是按一下,翻转一下led,有可能等保持不变,或者变化很多次。这都是电路抖动引起的,具体的话可以参考一下消抖部分(大部分都是延时处理,因为我觉得中断应尽量的快,就不使用别人的延时了,我也就不演示了哈,后期可以使用定时器去定时扫描按键的部分,讲到定时器的时候,我们说一下这个部分)。

github的工程源码:

https://github.com/zhaozhi0810/stm32f407_hal_keil5

 

 

 

发布了24 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhaozhi0810/article/details/104290912