问题描述
我想在 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
}