stm32滴答时钟SYStick的优先级设定方法详解

发布者:Xiaohan521最新更新时间:2018-12-28 来源: eefocus关键字:stm32  滴答时钟  SYStick  优先级 手机看文章 扫描二维码
随时随地手机看文章

以ST的V3.50固件为对象,:

1.     滴答寄存器的定义和地址分配在内核.H文件中如下


typedef struct

{

  __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */

  __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register     */

  __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register     */

  __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register      */

} SysTick_Type;

#define SysTick             ((SysTick_Type *)       SysTick_BASE)


定义结构指针SYSTICK,并赋值为物理存储器首地址0xE000E010,由于结构是顺序的所以可以用结构指针来访问寄存器。


因为滴答事件是内核的异常所以还要牵扯到另一个寄存器SCB寄存器(系统控制块)

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;


这里面寄存器很多,在这里大部分我们不用去管,有一个数组SHP[12],一定要看清他是8位数组啊!这个数组是很重要的,他是用来设置内核异常的优先级别,并不是想的在NVIC里设置,那个是大于15号中断的优先组别,换句话就是外部中断什么看门狗,定时器,串口啥的,外设的中断优先级设置在NVIC地IP数组中,而小于这个的都是内部异常,他不归NVIC管制,他受谁管呢?就是这个SHP[12],滴答属于内核的异常所以他要用SHP[12]来设置,和内核手册中讲到的那三个(SHRP1-SHRP3)32位寄存器一一对应,算下来正好有12个字节,最后一个字节就是我要的SYStick的优先级设置,他只用了他的高四位,而第四位保留,所以他的范围是0-15之间的任意数!!


2.系统设置函数:


NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);

这就是固件库里对SYSTICK的优先级设置,,后面参数,这里的__NVIC_PRIO_BITS=4,变形=(1《《4-1)=0xf;第一个参数是表明这是对滴答进行设置,SysTick_IRQn=-1,看实体:

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);    }

这里有个IF,就是这个IF来判别是内核异常还是外部异常的优先级,如果是内核异常那么由SCB解决,如果不是那么有NVIC解决。显然这个是由SCB解决的。

SHP[((uint32_t)(IRQn) & 0xF)-4]变换=SHP[f-4]=SHP[11],那么这个SHP[11]就是设置滴答的优先级!他的优先级是多少?

((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);=(priority<<4)=(f<<4)=0xf0;

显然这就是他的优先级是15!!!!!!!!!!!!!!!

有了优先级就了解滴答了,即使没有固件库函数依然可以设置看看自己设置的函数:

void mysystickint()

{

SysTick->LOAD=71999;//加载值=1ms

SCB->SHP[11]=15;//设置SYSTICK的优先级为15,注意SYSTICK属于系统异常,所以他的优先级在SCB里设置。

SysTick->CTRL=7;//开启中断,开启定时器,时钟设置为HCLK=72mhz

}这是中断模式,另外也可以选择查询模式,只是占CPU时间,查询模式下根本不用设置什么优先级!他只要开开滴答,查询标志位即可!


关键字:stm32  滴答时钟  SYStick  优先级 引用地址:stm32滴答时钟SYStick的优先级设定方法详解

上一篇:STM32 获取寄存器的地址
下一篇:STM32双机SPI中断通信机制

推荐阅读最新更新时间:2024-03-16 16:21

基于STM32单片机低功耗模式机制详细解析
本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。 一、STM32芯片性能 使用芯片型号:stm32f030f4,CORTEX-M0.封装TSSOP20. 运行模式:内部时钟(HSI),系统时钟频率采用48MHZ。 工作电压:3.3V 芯片具体参数如下: 二、芯片功耗 功耗: 芯片工作模式: 工作模式:外设正常运行,内核CPU及SRAM供电,未使用外设的时钟默认关闭。 睡眠模式:只有CPU停止工作,各个外设正常工作,依靠任何中断/事件唤醒。 停机模式:1.8V供电区域时钟被停止,内部HSI,PLL,外部时钟HSE均关闭,同时
[单片机]
基于<font color='red'>STM32</font>单片机低功耗模式机制详细解析
STM32 SRAM启动的 KeiL 配置
简介:BOOT 引脚改成从SRAM 启动,即 BOOT0=1,BOOT1=1 如果使用ST提供的库函数 3.5 打开(system_stm32f10x.c) #define VECT_TAB_SRAM 2.x 可以通过调用函数切换中断向量表的指向。 2.x 可以通过调用以下两个函数切换中断向量表的指向。 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00); NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); KEIL 的配置 (SYM32F103C8T6 (64kFlash/20kSram);
[单片机]
<font color='red'>STM32</font> SRAM启动的 KeiL 配置
stm32 进入睡眠、停止、待机状态下强行下载程序
当stm32 进入睡眠、停止、待机状态下是不能正常进行程序下载的,因为此时内核会停止,具体信息可查看: STM32F429 18. 电源管理_实现低功耗 故在此,想要重新下载程序的话,将其唤醒是首选,但是可能由于程序上的纰漏等原因,不能将其成功唤醒,我们就只能强制下载了,即: 按住stm32 复位键不松手,然后点击 Download 下载程序,随后松开复位键。 经过实际测验,这三种情况下,强制下载程序都是可行的,但这种方法有时可能很难奏效,要多尝试。
[单片机]
STM32的GPIO详细介绍
STM32 引脚说明 GPIO 是通用输入 / 输出端口的简称,是 STM32 可控制的引脚。GPIO 的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F103ZET6 芯片为 144 脚芯片,包括 7 个通用目的的输入 / 输出口(GPIO)组,分别为 GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组 GPIO 口组有 16 个 GPIO 口。通常简略称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中 x 为 0-15。 STM32 的大部分引脚除了当 GPIO 使用之外,还可以复用位外设功能引脚(比如串口),这部分在【
[单片机]
驱动字库芯片GT23L24M0140
环境: 主机:WIN8 开发环境:MDK5.13 mcu: stm32f407VGIGH6 字库芯片:GT23L24M0140 说明: GT23L24M0140是一款支持GB18030标准的字库芯片,有多种大小的字体可供选择。 本文驱动了其中常用的字体。 源代码: drv_font.h /********************************************************************* * 字库芯片驱动层头文件 * (c)copyright 2013,jdh * All Right Reserved *新建日期:2015/2/2 by
[单片机]
STM32 | 通俗易懂地串口通讯解析
平时使用串口打印出现乱码的绝大部分原因是串口波特率没对。那么我们怎么测量实际的波特率呢?在这之前,顺便一起回顾一下波特率的概念。 什么是波特率、比特率? 比特率(Bitrate)表示每秒钟传输的二进制位数,单位为比特每秒(bit/s)。 波特率(Baudrate)表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标。 码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。 常见的通讯传输中,用 0V 表示数字 0, 5V 表示数字 1,那么一个码元可以表示两种状态 0 和 1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致。 如果在通讯传输中,有 0V、
[单片机]
<font color='red'>STM32</font> | 通俗易懂地串口通讯解析
stm32_timer基本定时器配置及实现灯闪烁
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。 TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器;TIM6和TIM7是基本定时器,其时钟由APB1输出产生; 本实验要实现的功能是:用普通定时器TIM2每一秒发生一次更新事件,进入中断服务程序翻转LED1的状态。 预备知识: ① STM32通用定时器TIM2是16位自动重装载计数器。 ② 向上计数模式:从0开始计数,计到自动装载寄存器(TIMx_ARR)中的数值时,清0,依次循环。 需要弄清楚的两
[单片机]
stm32_timer基本定时器配置及实现灯闪烁
STM32的基本系统是怎样的?
电源 无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA、VSSA、Vref(如果封装有该引脚)都必需要连接,不可悬空 对于每组对应的VDD和GND都应至少放置一个104的陶瓷电容用于滤波,并接该电容应放置尽量靠近MCU 用万用表测试供电电压是否正确,调试时最好用数字电源供电,以便过压或过流烧坏板子,电压最好一步一步从进线端测试到芯片供电端 复位、启动选择 Boot引脚与JTAG无关。其仅是用于MCU启动后,判断执行代码的起始地址 在电路设计上可能Boot引脚不会使用,但要求一定要外部连接电阻到地或电源,切不可悬空;STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 用户闪存 = 芯片内置的Fla
[单片机]
<font color='red'>STM32</font>的基本系统是怎样的?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved