我想写一个LED闪烁的功能,照着野火的延迟函数写的代码,功能无法实现

我想写一个LED闪烁的功能,然后我照着野火的延迟函数写的代码,但没有功能,代码如下
我照着野火的简洁版的延迟函数写的代码如下

void SysTick_Delay_Ms( __IO uint32_t ms)
{
    uint32_t i;    
    SysTick_Config(SystemCoreClock / 1000);
    
    for(i = 0; i < ms; i++)
    {
        // 当计数器的值减小到0的时候,CRTL寄存器的位16会置1
        // 当置1时,读取该位会清0
        while(!((SysTick->CTRL)&(1<<16)));
    }
    // 关闭SysTick定时器
    SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}

主函数是这样的


int main()
{
    InitPin(GPIOA, GPIO_Pin_2);

    while(1)
    {
        PAout(2) = 1;
        SysTick_Delay_Ms(500);
        
        PAout(2) = 0;
        SysTick_Delay_Ms(500);
    }

    return 0;
}

主函数中InitPin(GPIOA, GPIO_Pin_2)的函数是这样声明的

void InitPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin_x)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOx, &GPIO_InitStructure);
}

以上程序烧写到开发版上的时候小灯并不闪烁,请问一下为什么?

看起来你的代码已经配置好了硬件并正确设置了延迟函数来闪烁 LED, 但是有一些问题。

你没有在 SysTick_Delay_Ms() 函数中使用 SysTick_CTRL_ENABLE 来启用 SysTick 定时器,因此,延迟函数不会起作用。
在 while 循环中查询 SysTick->CTRL & (1<<16) 是否为非零,这是错误的,正确的做法是查询 SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk 是否为非零。
更新代码如下:

void SysTick_Delay_Ms(__IO uint32_t ms)
{
uint32_t i;
SysTick_Config(SystemCoreClock / 1000);
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // Enable SysTick Timer
for(i = 0; i < ms; i++)
{
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // Wait for COUNTFLAG to be set
}
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk; // Disable SysTick Timer
}

主函数如下

int main()
{
InitPin(GPIOA, GPIO_Pin_2);
while(1)
{
PAout(2) = 1;
SysTick_Delay_Ms(500);
PAout(2) = 0;
SysTick_Delay_Ms(500);
}
return 0;
}

尝试更新这个代码,这样就应该能正常的闪烁了。