学习STM32库函数开发的第一天我遇到了延时函数(正点原子自带的延时函数)无法使用的问题,初步认为是时钟的配置出现了问题,然而跟着手册一步步操作还是陷入延时函数死循环的问题,主要是这句代码的判断出问题了
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=nus*fac_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; //时间超过/等于要延迟的时间,则退出.
}
};
}
这是主函数的代码#include "main.h"
#include "sys.h"
#include "delay.h"
#include "led.h"
void Delay(__IO uint32_t nCount)
{
while(nCount--){}
}
int main(void)
{
HAL_Init(); //初始化 HAL 库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
LED_Init(); //初始化 LED while(1)
while(1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
delay_ms(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
delay_ms(500);
}
}
最终使用STM32cube进行时钟配置并生成了代码最终解决了延时函数无法调用的问题。目前对32位单片机的学习非常疑惑,虽然之前学习过K60,因为没有数电模电和计算机结构方面的基础初步对32位单片机开发的认识就是不断地去调用别人写的库,感觉除了调用库以外什么都没学到,究竟怎样才能系统地学习单片机呢?
而且还有一个疑问就是我们是应该自己写初始化函数还是有stm32cube来生成初始化的代码,然后功能性的函数就自己写。我们应不应该用别人写的库?怎样科学地写代码?