之前使用systick滴答定时器都是通过查找内核编程手册配置寄存器让systick滴答定时器工作的。其实在内核相关的头文件core_cm4.h中已经有systick滴答定时器的相关配置了。
条件__vendor_systickconfig == 0成立,配置函数才能使用。
刚好在stm32f4xx.h中定义了__vendor_systickconfig = 0,所以可以使用该配置函数。
观察函数__static_inline uint32_t systick_config(uint32_t ticks),其中的寄存器和我们在systick查询定时中用到的寄存器其实是一样的。
__static_inline uint32_t systick_config(uint32_t ticks){ //systick_load_reload_msk为24,如果装载值超过24位,返回错误信息 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 < val = 0ul; /* 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 (0ul); /* function successful */}这种方式没有分频,时钟速度为168mhz,每秒可计数168000000次,每毫秒可计数168000次,每微秒计数168次。装载值为24位,最大为16777215,可以算得最大延时时间为100ms。
这次的程序不需要上次写的delay文件了,只要在主文件加入systick配置函数的头文件core_cm4.h,根据想要定时的时间,计算相应的数值,初始化systick配置函数。再调用中断接口封装中断函数,就可以实现systick中断了。
如果中断函数像之前那样可能会看不到现象,因为定时时间过短,人眼可能识别不出led灯在闪烁,这里可以添加个计数,相当于定时更长时间才执行想要的程序。
#include stm32f4xx.h#include led.h#include core_cm4.hint main(){ led_init(); //初始化led灯 systick_config(8400000);//延时50ms 168000000/8400000=20 1000/20=50 while(1) { }}void systick_handler(){ static u8 cnt = 0; systick- >ctrl &=~ (1< <16); //清计数标志位 cnt++; if(cnt == 10) { led_toggle(ds0); //led灯闪烁 cnt = 0; }}编译工程项目并烧入开发板,led灯闪烁,systick配置函数调用成功。
IBM朱辉:简化与加速AI之旅,企业需要怎样的数据治理?
采用骁龙778G Plus 5G移动平台的小米Civi 1S发布
仓储环境监控系统监控内容与功能
区块链需要哪些舍和得
TCP 协议深度解析
STM32 SysTick配置函数
IXXAT NT系列高稳定性网关网桥解决方案
用于二维波束扫描的集成铌酸锂光学相控阵
AC7840x三电机控制应用解决方案
雷蛇宣布将推出支持触觉反馈的耳机
燃料电池研发的强大助力——在MATLAB EXPO 与捷氢科技深度对话
iphone13评测_iphone13值不值得买
三相无刷直流电机的调制方式
5g网络切片的主要功能组成和意义
笔记本电池出现问题怎么办?教你两招
靠谱的区块链项目应该是怎样的
区块链技术和加密货币的意义是什么
高通预计今年中推下一代28nm芯片 各代工厂积极寻求合作
为什么监控硬盘容量与实际容量不一样?
7月24日 中国电信宣布三沙通信进入5G时代