**在学习STM32的Systick定时器时,写了个 简单的延时函数,程序功能是是led闪烁,
但是只用一次delay程序似乎在while(1)并没有循环,led长亮
调用两次才能正常闪烁
**
问题相关代码
void delay_ms(uint32_t ms){
uint32_t i;
SysTick_Config(72000);
for(i=0;i<ms;i++){
while( !(SysTick_CTRL_COUNTFLAG_Msk&SysTick->CTRL));/* 判断中断标志位 */
}
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;/* 中断失能 */
}
int main (void){
LED_GPIO_Init();
while(1){
GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
delay_ms(1000);
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN );
}
}
运行结果及报错内容
调用一次delay_ms(1000)时led一直亮,似乎程序在 delay_ms(1000);处停止了
我的解答思路和尝试过的方法
再加一个延时就能正常LED闪烁,请问这是为什么?
int main (void){
LED_GPIO_Init();
while(1){
GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
delay_ms(1000);
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN );
delay_ms(1000);
}
}
库函数
static __INLINE uint32_t SysTick_Config(uint32_t ticks) /* 默认72MHZ */
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}