历史上的今天
返回首页

历史上的今天

今天是:2024年10月16日(星期三)

正在发生

2018年10月16日 | stm32之滴答定时器(4):滴答定时器的优先级设置

2018-10-16 来源:eefocus

上次讲的只剩滴答定时器的优先级设置函数NVIC_SetPriority没有讲,这个函数具体如下

static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)

{

  if(IRQn < 0) {

    SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } * set Priority for Cortex-M3 System Interrupts */

  else {

    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        * set Priority for device specific Interrupts  */

}  

    它是设置中断标号以及优先级的函数,由于滴答定时器是系统内部中断因此优先级是通过SCB中的SHP寄存器设置的。

    这里的SCB无论是STM32技术手册还是CORTEX技术手册都没有具体的说明,在英文的cortex编程手册中介绍,这个是系统控制块system control block。

    库函数中,SCB的基地址为0xE000ED00,其结构体如下(注释符还是跟原来同理。。怕被注释)

typedef struct

{

  __I  uint32_t CPUID;                         *!< Offset: 0x00  CPU ID Base Register                                  */

  __IO uint32_t ICSR;                         *!< Offset: 0x04  Interrupt Control State Register                      */

  __IO uint32_t VTOR;                         *!< Offset: 0x08  Vector Table Offset Register                          */

  __IO uint32_t AIRCR;                  *!< Offset: 0x0C  Application Interrupt / Reset Control Register        */

  __IO uint32_t SCR;                          *!< Offset: 0x10  System Control Register                               */

  __IO uint32_t CCR;                          *!< Offset: 0x14  Configuration Control Register                        */

  __IO uint8_t  SHP[12];             *!< Offset: 0x18  System Handlers Priority Registers (4-7, 8-11, 12-15) */

  __IO uint32_t SHCSR;                       *!< Offset: 0x24  System Handler Control and State Register       */

  __IO uint32_t CFSR;                         *!< Offset: 0x28  Configurable Fault Status Register                    */

  __IO uint32_t HFSR;                         *!< Offset: 0x2C  Hard Fault Status Register                            */

  __IO uint32_t DFSR;                         *!< Offset: 0x30  Debug Fault Status Register                           */

  __IO uint32_t MMFAR;                        *!< Offset: 0x34  Mem Manage Address Register                      */

  __IO uint32_t BFAR;                         *!< Offset: 0x38  Bus Fault Address Register                            */

  __IO uint32_t AFSR;                         *!< Offset: 0x3C  Auxiliary Fault Status Register                       */

  __I  uint32_t PFR[2];                       *!< Offset: 0x40  Processor Feature Register                            */

  __I  uint32_t DFR;                          *!< Offset: 0x48  Debug Feature Register                                */

  __I  uint32_t ADR;                          *!< Offset: 0x4C  Auxiliary Feature Register                            */

  __I  uint32_t MMFR[4];                      *!< Offset: 0x50  Memory Model Feature Register                  */

  __I  uint32_t ISAR[5];                      *!< Offset: 0x60  ISA Feature Register                                  */

} SCB_Type;

    其结构体与技术手册中的寄存器完全对应,可以看到 __IO uint8_t  SHP[12] ,其是系统异常优先级寄存器,关于这个为什么8位寄存器,12个8位,同样需要参考cm3编程手册。

stm32之滴答定时器(4):滴答定时器的优先级设置

  其地址虽然是连续的,但是实际寄存器内部分布比较特殊

stm32之滴答定时器(4):滴答定时器的优先级设置

stm32之滴答定时器(4):滴答定时器的优先级设置
stm32之滴答定时器(4):滴答定时器的优先级设置
下面回到程序

SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff)

查滴答定时器的中断标号为-1,这里涉及了uint32_t(32位无符号整形)强制转换一个负数,由于stm32必须通过硬件才能进入调试状态,因此使用visual C/C++编个程序验证一下.

 #include

typedef unsigned __int32 uint32_t;

void main()

{

//typedef unsigned __int32 uint32_t;

int aa=-1;

uint32_t bb = 888;  

    bb=(uint32_t)aa;

    printf("bb is %x",  bb);  

}

    最后得出的结果是0xFFFFFFFF,这里的原因在于机器存储负数的机制,最高位为符号位,负数为其补码,补码为反码加一,因此-1表示就是10000001,反码11111110,补码1111111,32位表示就是0xFFFFFFFF。

    回到程序中其实就是0xF-4,也就是SHP[11],也就是寄存器组的最后一个。

#define __NVIC_PRIO_BITS          4  *!< STM32 uses 4 Bits for the Priority Levels    */

代入得出优先级是15,也就是系统中断的最低优先级。  

    滴答定时器就全部介绍完毕啦,实际滴答定时器用起来只要会算计数值就可以了,为什么这么详细呢,因为我自己认为这是学stm32的一个方法,学会了这种思路,以后学习stm32不论是内核还是外设,都能触类旁通,明白学习库函数到寄存器到数据手册的流程


推荐阅读

史海拾趣

General Diode Corp公司的发展小趣事
检查电源模块是否损坏,更换故障部件;检查电源输入电压是否稳定,确保在正常范围内。
DURATOOL公司的发展小趣事

随着全球经济的不断发展,DURATOOL公司意识到单一市场已无法满足其长远发展需求。因此,公司制定了一系列国际化战略,积极开拓海外市场。通过与国外知名企业的合作,DURATOOL公司成功将其产品线扩展到全球多个国家和地区。同时,公司还积极参加国际展会和技术交流活动,提升品牌知名度和影响力。这些举措不仅为DURATOOL公司带来了丰厚的经济回报,也为其在国际市场上树立了良好的企业形象。

Digilent公司的发展小趣事

在全球节能意识日益增强的背景下,DIALIGHT致力于推动绿色照明的发展。公司的LED产品具有高效节能、长寿命和环保等优点,有助于减少能源消耗和环境污染。此外,DIALIGHT还积极参与各种绿色照明项目,为推动可持续发展贡献自己的力量。

C.K TOOLS公司的发展小趣事

在20世纪90年代初,C.K TOOLS凭借其在手工工具制造领域的技术积累,开始关注电子行业的发展趋势。随着电子产品的精密化程度不断提高,对生产工具的要求也日益严苛。C.K TOOLS针对电子组装线上的精细操作需求,研发出了一系列高精度螺丝刀和夹具,这些工具迅速在电子制造业中获得了广泛应用。通过与几家大型电子制造企业的紧密合作,C.K TOOLS逐渐在电子行业站稳了脚跟。

蜂鸟无线公司的发展小趣事
如电钻、电锯等电动工具,通过PWM调速电路可以实现转速的精确控制,提高工作效率和安全性。
Dean Technology公司的发展小趣事

随着产品技术的不断成熟,Dean Technology公司开始注重品牌建设和市场推广。他们积极参加各类电子展会,展示公司的最新产品和技术,与行业内外的客户建立联系。同时,公司还通过广告宣传、合作伙伴关系等方式,提高品牌知名度和美誉度。这些努力使得Dean Technology的高压二极管产品逐渐在市场上获得了认可。

问答坊 | AI 解惑

ILI9320的驱动TFT

在淘宝上买了一块这样的TFT,用ARM2148去驱动,不知道为什么屏幕显示背景色的时候只能显示一半,就卡死了,什么都出不来了。 程序代码见下: #include \"config.h\" #define uint unsigned int #define uchar unsigned char #define  ...…

查看全部问答>

有这样的单片机吗?

20引脚单片机 内部晶振。一开始以为是AVR的,但是他的晶振引脚在A口位置,型号被涂了。…

查看全部问答>

51单片机让灯低电平亮有啥好处?

发现有的电路特意设计成低电平时让灯亮。这样就多用了一个74ABT04D.. 是不是设计成低电平时让灯亮电路的抗干扰性能提高了?还是有什么别的原因?…

查看全部问答>

大联大开展的M3半天培训资料

培训会上用的板子是811的片子,培训也是M3怎么用,keil怎么用,有些实例和ppt,共享下,大家择优录取!…

查看全部问答>

LDO的输出电容的问题

我看到很多说明书的输出电容的要求都是若干uF或更大,这里指的更大是说可以无限制大吗(至少100倍吧)? 如果是,那么说明更大的电容是不影响稳定性的,可是我算了下,比如TI的tps720xx,如果使用他规定的最小的1uF电容,那么在最重载情况下,负载 ...…

查看全部问答>

函数变量不能被初始化和赋值

c语言函数不能被初始化和赋值,不知道是什么原因,单步调试显示没有赋值,函数变量用静态static修饰可以初始化赋值,但是不能再赋值。 我在ARM2103芯片上编程的,ram大小只有8k字节,是不是函数嵌套层数多了,ram不够了?编译的时候ram显示用了7k.…

查看全部问答>

Windows Mobile程序移植到WinCE手机上的工作量?

Windows Mobile程序移植到WinCE手机上的工作量? 我有一个Windows Mobile程序,包括跟pc端进行tcp、ip通讯,调用一些系统接口,比如发送键盘消息,获取窗口句柄等,现在想要把这个程序移植到WinCE 6.0手机上,我想请教一些,会有多大的工作量? ...…

查看全部问答>

[求助]关于cc2430AES和DMA之间的问题

cc2430有个写好的样例程序,里面AES的主函数里面包含如下两个函数: aes_main() { aes();   仅仅是AES加密,把明文分成16bit,设置加密模式等等,没有设涉及到任何DMA的设置问题 aesdma();  AES加载密钥、加密时的DM ...…

查看全部问答>

stm32串口的问题

中断法收数据,波特率38400就正常,再往高去,就收不全了。测试程序,PC发送17个字节,STM32只能收到14个字节,以前在别的芯片上都是这么处理的,到stm32上行不通了、…

查看全部问答>

高速晶振

请教一个问题,如果不用XT2的时候,我是不是要把晶振的引脚接地?输出端还是输入端接地?直接接地还是通过一个电容接地??请大侠指点一二.....…

查看全部问答>