SysTick_IRQn 重复定义
时间: 2023-07-31 20:08:34 浏览: 73
如果在你的代码中出现了 "SysTick_IRQn 重复定义" 的错误,这通常是因为该中断号已经被其他库或文件使用了。出现这种情况时,我们可以通过以下方法解决:
1. 禁用其他库或文件中的 SysTick 中断
如果你的代码中同时使用了多个库或文件,可能会出现多个文件都定义了 SysTick 中断的情况。在这种情况下,我们可以在其中一个文件中禁用 SysTick 中断。例如,在使用 HAL 库时,可以在 stm32f4xx_hal_conf.h 文件中将 SysTick 中断的优先级设置为 0,以禁用该中断:
```
#define USE_RTOS_SYSTICK 0
```
2. 修改 SysTick 中断的优先级
如果不想禁用其他库或文件中的 SysTick 中断,我们也可以通过修改 SysTick 中断的优先级来解决冲突。在使用 HAL 库时,可以通过以下代码修改 SysTick 中断的优先级:
```
HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
```
其中,第一个参数是 SysTick 中断的中断号,第二个参数是中断的抢占优先级,第三个参数是中断的子优先级。将中断的抢占优先级设置为较低的值可以避免冲突。
希望以上方法对你有所帮助!
相关问题
SysTick_IRQn
SysTick_IRQn是一个用于处理系统滴答定时器(SysTick)中断的中断号。在提供的引用中,它被用于启用SysTick中断。在main()函数中调用NVIC_EnableIRQ(SysTick_IRQn)会导致硬件错误(HardFault)发生。然而,如果移除对NVIC_EnableIRQ(...)的调用,即只调用SysTick_Config(SystemCoreClock * SYSTICK_INT_FREQ),则不会出现硬件错误。SysTick_IRQn也在裸机代码中被使用,在HAL_InitTick函数中,用于配置SysTick中断的优先级。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [NVIC_EnableIRQ(SysTick_IRQn)](https://blog.csdn.net/u011878611/article/details/107748984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *3* [【FreeRTOS】STM32CubeMX配置STM32FreeRTOS(一)](https://blog.csdn.net/weixin_41865104/article/details/107399420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
解释每行void timer_init(uint32_t timestamp) { uint32_t tick_us = (SystemCoreClock)/1e6; tick_us = tick_us*timestamp; SysTick_Config(tick_us); //NVIC_SetPriority(SysTick_IRQn, 3); }
这段代码是初始化一个定时器的函数。具体解释如下:
1. `void timer_init(uint32_t timestamp)`:定义一个返回值为空,参数为 uint32_t 类型的函数 timer_init,该函数需要传入一个 uint32_t 类型的参数 timestamp。
2. `uint32_t tick_us = (SystemCoreClock)/1e6;`:将当前系统的主频除以 1 百万,得到每个时钟计数的微秒数。
3. `tick_us = tick_us*timestamp;`:将每个时钟计数的微秒数乘上输入参数 timestamp,得到总共的计时周期。
4. `SysTick_Config(tick_us);`:使用总共的计时周期来配置 SysTick 计时器的时钟源和计数周期。
5. `//NVIC_SetPriority(SysTick_IRQn, 3);`:这行代码是将 SysTick 中断的优先级设置为 3(注释掉了)。通常情况下,这行代码可以用来设置中断的优先级,以确保在多个中断同时发生的情况下有序地处理中断请求。