1、前言
cm4内核的处理和cm3一样,内部都包含了一个systick定时器,systick 是一个24 位的倒计数定时器,当计到0 时,将从reload 寄存器中自动重装载定时初值。只要不把它在systick 控制及状态寄存器中的使能位清除,就永不停息。这样可以用systick来实现延时定时功能,不用再占用系统定时器。systick也多用做系统的时钟节拍,如freertos等os,再启动调度器的时候,就会将systick配置成其系统时钟,给系统提供心跳。systick中有4个寄存器ctrl、load、val、calib
2、systick配置注意事项
使用cubemx配置生成的代码中,会自动生成一个 systemclock_config() 的函数,用于配置单片机时钟,其中就会配置systick
void systemclock_config(){ ........... ll_systick_setclksource(ll_systick_clksource_hclk); ll_setsystemcoreclock(32000000);#ifndef systick_irq ll_init1mstick(32000000); //使能systick但是不开启systick中断#else systick_config(systemcoreclock / 1000);//使能systick同时开启systick中断#endif} 但是这里 需要注意的是,是不是需要开启 systick 中断!!!!
1、如果只是想用systick来作为延时用,程序不想被中断打断,就只需要使能systick而不用开启systick中断,调用 ll_init1mstick 即可
void ll_init1mstick(uint32_t hclkfrequency) ---> ll_inittick(hclkfrequency, 1000u); ---> __static_inline void ll_inittick(uint32_t hclkfrequency, uint32_t ticks) { /* configure the systick to have interrupt in 1ms time base */ systick->load = (uint32_t)((hclkfrequency / ticks) - 1ul); /* set reload register */ systick->val = 0ul; /* load the systick counter value */ systick->ctrl = systick_ctrl_clksource_msk | systick_ctrl_enable_msk; /* enable the systick timer */ } 但是需要自己编写延时函数,不能使用hal库提供的hal_delay()。原因如下:hal_delay的实现是依靠一个uwtickfreq变量,uwtickfreq是在hal_inctick中累加的,需要在 systick_handler中断函数中周期调用,这样hal_delay才会有一个基准
__weak void hal_inctick(void){ uwtick += uwtickfreq;}__weak uint32_t hal_gettick(void){ return uwtick;}__weak void hal_delay(uint32_t delay){ uint32_t tickstart = hal_gettick(); uint32_t wait = delay; /* add a period to guaranty minimum wait */ if (wait < hal_max_delay) { wait += (uint32_t)(uwtickfreq); } while((hal_gettick() - tickstart) load = nus*fac_us; //时间加载 systick->val = 0x00; //清空计数器 systick->ctrl |= systick_ctrl_enable_msk ; //开始倒数 do { temp = systick->ctrl; } while((temp & 0x01) &&! (temp&(1 val = 0x00; //清空计数器 } 2、如果想用systick座系统的时钟节拍,需要开启systick中断,可以直接调用 systick_config 来配置,也可以使用 hal_init 来配置,hal_init 配置最终也会调用 systick_config 函数
hal_init(void) ---> hal_inittick(uint32_t tickpriority) ---> systick_config(uint32_t ticks) { if ((ticks - 1ul) > systick_load_reload_msk) { return (1ul); /* reload value impossible */ } systick->load = (uint32_t)(ticks - 1ul); /* set reload register */ nvic_setpriority (systick_irqn, (1ul ctrl = systick_ctrl_clksource_msk | systick_ctrl_tickint_msk | systick_ctrl_enable_msk; /* enable systick irq and systick timer */ return (0ul); /* function successful */ } 这样配置完成之后,还需要再systick的中断中调用 ossystickhandler 和 hal_inctick
智能门锁在安装时的常见问题都有哪些
用苹果玩法玩语音,看清亚马逊的战略
如何解决高速PCB的SI/EMI问题
MOS场效应晶体管使用注意事项_MOS场效应管安装及拆卸流程
工业相机和普通相机的区别
如何使用STM32单片机systick来实现延时定时功能
用心推动创新,卓然五条产品线重磅出击
金立S8评测 没有辜负消费者期待
电动汽车为什么频繁失火 大部分原因指向动力电池
智慧教育加速落地 “刷脸”考试时代已至
捷易获得广州市防疫数字哨兵查验终端资质证书
LG Wing更适配于标准Android主屏幕
苹果美国造,iPhone价格将上涨1.5倍,又变土豪机了!
在欧洲市场,特斯拉将很难一枝独秀
安卓玩家建立统一的生态体系,终结碎片化看到曙光
搜狗怎么/如何打繁体字
消磁型PTC热敏电阻
量子计算机不再难,室温下也能实现稳定运行
投影仪和电视对比分析 你的选择参考指南
中国反垄断机构正式启动了对于三星、SK 海力士、美光三家内存芯片厂商的调查