我想写一个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;
}
尝试更新这个代码,这样就应该能正常的闪烁了。