NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);这段代码什么意思
时间: 2023-05-24 14:07:34 浏览: 333
这段代码使用了CMSIS中的NVIC_SetPriority函数,将SysTick中断的优先级设置为最低(即优先级值为255)。
"SysTick_IRQn"是用于表示SysTick中断的枚举类型。
"__NVIC_PRIO_BITS"是用于表示当前系统的中断优先级位数的宏定义。
在这个例子中,将SysTick中断的优先级设置为最低,可以确保它不会干扰其他中断的正常运行。
相关问题
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { /* Configure the SysTick to have interrupt in 1ms time basis*/ if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) { return HAL_ERROR; } /* Configure the SysTick IRQ priority / if (TickPriority < (1UL << __NVIC_PRIO_BITS)) { HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); uwTickPrio = TickPriority; } else { return HAL_ERROR; } / Return function status */ return HAL_OK; }中断时间计算过程
在这段代码中,中断时间的计算过程如下:
1. `SystemCoreClock`是系统时钟频率,单位为Hz。
2. `1000U`表示1毫秒的时间,单位为微秒。
3. `uwTickFreq`是tick的频率,单位为Hz,可以通过`HAL_InitTick()`函数的参数`TickPriority`来设置。
4. `SystemCoreClock / (1000U / uwTickFreq)`表示在tick频率为`uwTickFreq`的情况下,每个tick的时间,单位为微秒。
5. `HAL_SYSTICK_Config()`函数会将上述计算结果作为参数,用于配置SysTick定时器的计数器自动重载寄存器(reload register)的值,来实现1毫秒的中断时间。
6. 如果成功配置定时器中断,`HAL_SYSTICK_Config()`函数将返回0,否则返回非0值。
7. 如果成功配置定时器中断,则通过`HAL_NVIC_SetPriority()`函数设置中断优先级,并将`uwTickPrio`变量设置为`TickPriority`的值。
8. 如果`TickPriority`的值大于或等于`1UL << __NVIC_PRIO_BITS`,则返回错误状态`HAL_ERROR`;否则,返回成功状态`HAL_OK`。
总之,这段代码通过配置SysTick定时器的计数器自动重载寄存器的值,实现了1毫秒的中断时间。
C语言实现:使用systick,每过16us产生一个中断
在C语言中实现使用SysTick每过16微秒产生一个中断,可以按照以下步骤进行:
1. 配置SysTick定时器的重装载值。
2. 启用SysTick定时器和其中断。
3. 编写SysTick的中断服务程序(ISR)。
以下是一个具体的代码示例,假设系统时钟为72MHz:
```c
#include "stm32f10x.h" // 根据具体的MCU型号选择合适的头文件
volatile uint32_t tick_count = 0;
void SysTick_Handler(void) {
tick_count++;
}
void SysTick_Init(uint32_t ticks) {
// 计算SysTick重装载值
SysTick->LOAD = ticks - 1;
// 设置SysTick中断优先级
NVIC_SetPriority(SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
// 清除SysTick当前值寄存器
SysTick->VAL = 0;
// 使能SysTick中断和SysTick定时器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
}
int main(void) {
// 初始化系统时钟
SystemInit();
// 配置SysTick每16微秒产生一个中断
// 假设系统时钟为72MHz,72MHz / 1MHz = 72个时钟周期为1微秒
// 16微秒 = 16 * 72 = 1152个时钟周期
SysTick_Init(1152);
while (1) {
// 主循环代码
if (tick_count >= 1) {
tick_count = 0;
// 每16微秒执行一次的任务
}
}
}
```
在这个示例中,`SysTick_Init`函数配置SysTick定时器,使其每16微秒产生一个中断。中断服务程序`SysTick_Handler`每次中断时被调用,并递增`tick_count`变量。在主循环中,可以通过检查`tick_count`的值来执行每16微秒需要执行的任务。
阅读全文