学习STM32中遇到的问题,一点一滴的记录下来!

2019-07-20 23:25发布

虽然现在工作中主要使用的是51系列单片,看到STM32发展如此快,就买了一个板子开始学习,没有自己想的那么简单,只能下班回来学习,有时一个问题自己得琢磨好几晚上才解决,今晚猛然想,何不在一个论坛把自己遇到的问题写出来,看了一下几个论坛,最终绝地写在这个论坛上,学习STM32已经快半个月了,期间遇到好多问题,今晚就先写一下今晚碰到的问题,想到什么就写什么。
  1  对NVIC的理解
      CM3支持硬件中断嵌套,分为抢占式优先级和亚优先级,使用规则主要有,抢占优先级高级别的可以打断低级别的,同一级别的抢占优先级同时发生时,亚当优先级高的先发生中断,若是相同,则按硬件排列顺序发生。若是有一个亚优先级正在执行中断,同一级别的其它亚优先级发生时,则先挂起,等此中断执行完再执行!
     从库函数中找到优先级分组模式:
#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /* 0 bits for pre-emption priority
                                                          4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /* 1 bits for pre-emption priority
                                                          3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /* 2 bits for pre-emption priority
                                                          2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /* 3 bits for pre-emption priority
                                                          1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /* 4 bits for pre-emption priority
                                                          0 bits for subpriority */
从中可以看出第一组只有一个级别,16个亚优先级,我可以这样理解,若是分配成这个组里,不能发生嵌套中断,同时发生中断时,亚优先级高的先发生,若有中断执行时,必须等中断执行完才能执行下一个中断。最后一组正好相反,有15个级别,若是执行一个中断,可以最多嵌套15个中断执行一个中断。看下面的例子:
  NVIC_InitTypeDef    NVIC_InitStructure;  //定义中断初始化类型结构体变量
  
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);   //配置优先级分组1 2个两个抢占优先级 8个亚优先级
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //开口外部中断0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置0号抢占式优先级 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//亚优先级配置为0号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //开口外部中断5到9
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置

  NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //ADC1中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置

从上面的配置来看,外部中断0的优先级最高,可以打断ADC和外部5到9的中断,也就说可以嵌套发生,当ADC中断和外部5到9中断同时发生时,它们的抢占优先级别相同,亚优先级别也相同,因为ADC1硬件排在更靠前,则先发生ADC中断,若是两者任何一个中断正在执行,则等此中断执行完,再去执行另一个中断。

     今天晚上就先理解到这里,明天晚上继续。





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
成可风
1楼-- · 2019-07-23 05:57
 精彩回答 2  元偷偷看……
相识在天涯
2楼-- · 2019-07-23 10:45
回复【18楼】jcl9696:

---------------------------------
谢谢夸奖!我只是发表我对这个芯片功能的看法,有错误的地方指出来就行。
回复【20楼】成可风:
断言机制若是仔细研究的话,还有很多地方需要说明,我只是发表一下在STM32在库函数中的应用方式,在实际中我们却应用的很少,要么我写的程序还很小,或者你写程序很仔细那就另外了。
 
    好久没有写了,工作一直挺忙,太累。现在在研究定时器,等把定时器搞完,再写一下学习心得共勉吧!~学习这些我不管操作定时器还是库函数,主要的是明白它的工作原理,说白了,要明白这个内核的单片机。以后再出什么系列的都不怕!

1051477875
3楼-- · 2019-07-23 15:28
加油
gongkansb
4楼-- · 2019-07-23 15:32
 精彩回答 2  元偷偷看……
numberzzj
5楼-- · 2019-07-23 18:37
楼主太神了!
565956807@qq.co
6楼-- · 2019-07-23 22:27
学习

一周热门 更多>