systick中断相关

1、systick中断优先级问题:这个中断优先级是可以设置的,当优先级相同时,内核级中断要优先于外部可屏蔽中断执行,但设置外部可屏蔽中断优先级大于内核级中断时,它是可抢占内核中断的。另外做延时时,若要获得非常精确的延时,可以把Systick的优先级设到最高。

systick的优先级到底比外设的优先级高还是低???
systick是内核的外设,其他外设比如串口,adc等是内核之外的外设

1、只要内核的优先级可以配置,那么内核的优先级就不是一定比外设的高,而是要先比较软件优先级,如果软件优先级一样,那么就比较他们的硬件的中断编号,编号就是在中断向量表中的位置,越小,优先级越高。

2、以systick为例,在systick的固件库初始化函数:SysTick_Config(uint32_t ticks) 中,调用了NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); ,这里面把 systick的 优先级配置为 :1<<4-1 = 15,这里面的4是因为STM32 使用4个位来配置中断优先级。

3、那么问题来了,这里systick的中断优先级配置成15,应该是最低的,那跟外设来比,那是systick的优先级比外设是高还是低?  这个得看 外设 配置 中断优先级时的优先级分组。

4、如果分组为 2,那抢占优先级和子优先级各有2个位表示优先级,抢占的取值范围为0~3,子优先级的取值范围为:0~3。那这时systick的优先级15,该怎么对比,只需要把15转换成二进制:1111,这四位同样受优先级分组的控制,即前两位表示抢占优先级,那就是3,后两位表示子优先级,也是3。在分组2里面都是最低的。如果你的外设也配置成组2,主和子优先级配置的不是3,那就肯定比systick的优先级高。

5、内核的优先级并非一定比外设的优先级高,只要你的优先级可以配置

### 原理 Systick定时器就是系统滴答定时器,是一个24位的倒计数定时器,计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15),Systick中断的优先级也可以设置。在FreeRTOS中,SysTick由STM32内核提供,时钟源可选,用于产生FreeRTOS所需要的系统时钟,系统每隔固定时间进入SysTick中断处理时间[^1][^3]。 ### 使用方法 Systick定时器常用来做延时,或者实时系统的心跳时钟,这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32 + UCOS系统中,都采用Systick做UCOS心跳时钟。此外,Systick定时器除了能服务于操作系统之外,还能用于其它目的,如作为一个闹铃,用于测量时间等。在程序中可以通过设置相关寄存器和函数来实现特定的功能,例如在某些代码中可以实现每隔1ms调用一次滴答定时器回调函数[^1]。 ### 配置 - **寄存器配置**:对于STM32,外部时钟源是HCLK(AHB总线时钟)的1/8;内核时钟是HCLK时钟,配置函数为`SysTick_CLKSourceConfig()`。校准值寄存器可使系统即使在不同的CM3产品上运行,也能产生恒定的SysTick中断频率,可直接把TENMS的值写入重装载寄存器,做到每10ms来一次SysTick异常,若需要其它的SysTick异常周期,可根据TENMS的值加以比例计算。但在少数情况下,CM3芯片可能无法准确地提供TENMS的值,使用前最好检查器件的参考手册[^1]。 - **代码配置示例**:以下是`SysTick_Config`函数的代码,该函数可用于配置Systick定时器。 ```c static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* 值超过0xFFFFFF直接退出 */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* 设置重载寄存器 与运算防止越界 */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 设置Cortex - M0系统中断的优先级 */ SysTick->VAL = 0; /* 加载SysTick计数器值 */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* 使能 SysTick IRQ 和 SysTick Timer */ return (0); /* 函数成功 */ } ``` 在FreeRTOS中,用户在`FreeRTOSConfig.h`文件中配置`configCPU_CLOCK_HZ`以及`configTICK_RATE_HZ`两个宏来设置系统时钟,产生时间片时间[^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值