首页 > 解决方案 > 如何使用 SYSTICK on keil 为 ST32 处理器切换不同频率的两个 LED

问题描述

我想切换每个 LED 一个 4Hz 和一个 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 TO WRITE LED 橙色

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

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

}

我只需要帮助将它们组合起来,主要是每个 LED 的 systick->load。

标签: togglestm32keil

解决方案


不要以这种方式使用 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
}

推荐阅读