STM32F103C8T6 内核外设Systick与普通外设中断优先级比较
最近有网友经实验验证( 网友的验证.),Systick虽然作为与CPU紧耦合的内核外设,但其中断优先级并不比普通外设要高,并不因为它是内核外设而特殊,它还是遵循中断优先级高低的规则来响应。就网友的结论是没问题,但网友的实验现象感觉有点出入,和自己想的不太一样,出严谨,按网友的代码在stm32f103的芯片是实验了一下,由于网友的是stm32f429IGT6的芯片,程序上会有点不一样,但都是stm32系列的想来问题不大,同事我的项目是用M3的芯片,探究也是M3的内外中断的区别,终于还是用M3的来验证吧。
实验环境条件如下:MDK v5.30.0.0,STM32F103C8T6的MCU。
设置Systick的中断优先级为7(1,3),100ms产生一个中断,初始化Systick代码如下:
void delay_init()
{
// SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
// fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
if (SysTick_Config(SystemCoreClock / 10))
{
/* Capture error */
while (1);
}
}
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
// NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
NVIC_SetPriority (SysTick_IRQn, 7); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
Systick的中断服务函数如下:
void SysTick_Handler(void)
{
LED_SYS=!LED_SYS;
Delayms(5);//普通的软件延时
}
void Delayms(u16 ms)
{
u16 i,j;
u8 k;
for(i=0;i<ms;i++)
for(j=0;j<0x0500;j++) k++;
}
然后配置两个按键KEY0和KEY1,产生两个外部中断EXTI(下降沿触发)&#