说是触摸STM32都快3年了,说来也羞愧,许多东西都还没搞了解;应该也是由于英文水平有待说到的原因,不能正确的了解英文的意义,究竟咱们的言语思想是不一样的(找个托言吧哈哈)。
最近在用STM32的守时器,曾经都是仓促走过,由于自己想标准化自己的编程代码,所以这次很用心的用通用守时器写通用的延时函数,网上许多都是用的体系滴答时钟(SysTlck)来做的,可是想着自己要向操作体系方向开展,就不能用这个守时器了。
平常由于用的是滴答时钟来做的延时函数,就没怎么去深究;这次用通用守时来做的时分,发现问题一大把。首要便是守时器的时钟分频,第二个便是怎么不必中止来完成守时。由于自己觉得对STM32很了解,所以就范范的写了代码,觉得自己必定没问题;编译下载。What f**k?!竟然守时不对,和我曾经了解的守时器不一样?仍是我的代码有问题?花了大半天去看每个存放器;(其实我最开端用的便是直接操作存放器,后来才用的库函数)觉得没问题呀;后来想要不在把每个存放的意思在细心了解一遍;不看不知道,一看下一跳呀。哎,多的废话就不说了,直接看图吧。
第一个便是咱们认为是操控时钟分频的存放器,曾经我们都是设置为00,可是当把它设置为其他值时,发现守时没有改动;其实是被称号误导了,细心看后边的阐明,这个时钟仅仅用于数字滤波器!!!更本没有改动守时器的时钟。它只影响ETR和TIX。
第二个便是关于守时器时钟和APB1时钟是共同的误解。
其实守时器的时钟和体系时钟是共同的。所以更本不是APB1的时钟。
其完成在才发现自己曾经有多么的不细心,通过此事今后发现在技能方面临自己要求太低了,什么都是了解一个大约;要用的时分才发现自己千疮百孔。
这也算是提示自己,也提示正在嵌入式体系开发道路上的仁兄们,万事要细心呀!!!
贴一段我自己写通用守时器代码吧。
void delay_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;// 预分频 72000000/72=1000000
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV2;//采样时钟分频.不是守时器时钟分频。
TIM_TimeBaseStructure.TIM_Period = 1;//重装值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
TIM_Cmd(TIM3, DISABLE);
}
void delay_ms(uint16_t nms)
{
uint16_t count;
count = nms*10;
TIM3->PSC = 7200-1;
TIM_GenerateEvent(TIM3,TIM_EventSource_Update);
TIM_SetCounter(TIM3,count);
TIM_Cmd(TIM3,ENABLE);
while(count>1)
{
count = TIM3->CNT;
}
TIM_Cmd(TIM3,DISABLE);
}
void delay_us(uint16_t nus)
{
uint16_t count;
count = nus;
TIM3->PSC = 72-1;
TIM_GenerateEvent(TIM3,TIM_EventSource_Update);
TIM_SetCounter(TIM3,count);
TIM_Cmd(TIM3,ENABLE);
while(count>1)
{
count = TIM3->CNT;
}
TIM_Cmd(TIM3,DISABLE);
}