如何在 ST32 处理器的 keil 上使用 SYSTICK 以不同频率切换两个 LED

问题描述

我想在 4Hz 频率下切换每个 LED,在 3Hz 频率下切换一个,到目前为止我只能以相同的频率切换 2 个。到目前为止,我只能分别进行它们,但我不知道如何编写代码以将它们组合起来我可以同时运行它。

// 此代码适用于两者

int main (void){
//Enable clock for GPIO A and Gpio B
RCC->AHB2ENR |= 0x3UL;                             

//Configure PA_0 and PA_1

GPIOA->MODER &= ~0xFUL ;  
GPIOA->MODER |= 0x5UL;   

GPIOA-> PUPDR &= ~0XFUL;    
GPIOA-> PUPDR |= 0xAUL;   

//用于 LED 绿色

SysTick ->LOAD = 1000000-1 ;   
SysTick-> VAL = 0;
SysTick->CTRL |= 0x5UL;

    while (1)
{
 if (SysTick -> CTRL & SysTick_CTRL_COUNTFLAG_Msk)
  { 
      GPIOA->ODR ^= 0x2UL;
    }   
}

}

//THEN 删除 LED GREEN 写入 LED 橙色

SysTick ->LOAD = 666667-1 ;   
SysTick-> VAL = 0;
SysTick->CTRL |= 0x5UL;

    while (1)
{
 if (SysTick -> CTRL & SysTick_CTRL_COUNTFLAG_Msk)
  { 
      GPIOA->ODR ^= 0x1UL;
    }   
}

}

我只需要帮助将它们结合起来,主要是每个 LED 的 sysstick->负载

解决方法

不要以这种方式使用 systick。设置要触发的 systick 中断可以说每秒 1000 次(标准 STM 启动文件就是这样做的)

然后在中断处理程序中切换 LED

volatile uint32_t count = 0;

void SysTick_Handler(void)
{
    count++;

    if(!(count % (1000 / 8))) GPIOA -> ODR ^= 1;   // 4 blinks per secons
    if(!(count % (1000 / 6))) GPIOA -> ODR ^= 2;   // 3 blinks per second
}