新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2019-9-5
- 在线时间
- 6 小时
|
1金钱
用的MCU为STM32F103RBT6,在使用正点原子提供的SYSTEM函数库delay API出现了问题。
问题描述如下:
先贴主函数
- int main(void) {
- u32 RxLen = 0;
- u32 tickVAL;
- HAL_Init(); //初始化HAL库
- Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟72MHz
- delay_init(72); //初始化delay函数
- uart_init(115200); //初始化串口
-
- while (1) {
- printf("Wait for input...\r\n");
- ///delay_us(2000);
- HAL_Delay(2000);
- RxLen = HAL_GetTick();
- printf("%d\r\n", RxLen);
- tickVAL = SysTick->VAL;
- printf("tickVal:%d\r\n", tickVAL);
- }
- //return 0;
- }
复制代码 问题源于在while死循环中调用delay_ms()导致程序卡死,于是定位问题到了delay_us()函数。
delay_us()是利用Systick定时,于是我在主函数中打印出了SysTick->VAL,发现该值一直为0
于是delay卡死的原因找到了:
- void delay_us(u32 nus)
- {
- u32 ticks;
- u32 told,tnow,tcnt=0;
- u32 reload=SysTick->LOAD; //LOAD的值
- ticks=nus*fac_us; //需要的节拍数
- delay_osschedlock(); //阻止OS调度,防止打断us延时
- told=SysTick->VAL; //刚进入时的计数器值
- while(1)
- {
- tnow=SysTick->VAL;
- if(tnow!=told)
- {
- if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
- else tcnt+=reload-tnow+told;
- told=tnow;
- if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
- }
- };
- delay_osschedunlock(); //恢复OS调度
- }
复制代码 tnow一直等于told,一直为0,不会执行if逻辑所以卡死在这里。
我感到疑惑的是利用HAL函数HAL_GetTick()可以获取到SysTick当前值,而SysTick->VAL的值一直为0,这是为什么?
|
|