stm32中的外设时钟 STM32,时钟systick
接之前的后,今天继续搞搞STM32的时钟。
STM32和时钟相关的硬件模块包括了sys_tick, TIM, 还有RTC模块,而sys_tick 这个是arm公司设计的硬件的模块,这个sys_tick 是CPU的外设,所以这个模块无论是ST公司,还是NXP,ST也好,只要你是cortex-4 的cpu 都会有这一个模块。而且在CPU的物理的地址都是一样的。
下面这张是ARM cortext-4 的CPU的 memory map,所有的cortex-4 核心的单片机都会遵循这个地址空间范围,ST ,TI NXP 都是这个地址空间,这也是arm公司规定的 ,这个不细说了,注意一下sys_tick 是arm cortex4 CPU的peripheral
sys_tick的硬件框图
三个红色寄存器 1 红色框框。
工作原理就是先给预设寄存器设置一个值,比如4000; Ctrl 寄存器enable设置1的时候,就这个4000 转载到 current 寄存器,两个都是4000了,然后红色数字1的 clk 每来一个脉冲,current寄存寄存就减一, 直到数值到0,一旦到0,又重新把预设寄存器中的值4000复制到current寄存器中,如果发现ctrl寄存中中断控制是使能的。就通知NVIC systick 减到0了,要产生中断告诉CPU。
然后就会跳到SysTick_Handler中去做你要做的事情,通常带OS(如FreeRTOS,RT-thread)的话
收到这个中断就会调用一下任务调度器。去找优先级高的任务执行,这是systick的一个应用。另外一个用的比较多就是延时函数。
所以代码也简单:
红色框框的就是 中断的一个应用方式,蓝山框框的就是延时的一种方式,延时的实现原理就是去查询当前的count 值,然后到1ns的count 就结束。
硬件逻辑也简单,之前看过riscv的sys_tick和这个cortext-m4 的逻辑是一样的。
看完了arm 的定时器,再来看看 stm32的定时器,STM32的定时有好几种,做延时一样的功能就是basic_timer.
长长的红色的曲线就是给TIM模块的时钟,具体的来源就是APB1的时钟,如前篇的时钟文章介绍,这个AHP1是sys_clock半分频而来,也就是40Mhz
绿色的,和红色的框框同arm的一样,一个是预制寄存器,另一个是当前count寄存器,一个就是放要记到多少的一个值,另一个是当前的计数器的值,另外比cortex4多了一个PSC的寄存器,这个是给时钟分频用的。比如系统时钟太高了,可以给到timer的时钟在原来的基础上除2,除4等
stm32timer的定时器寄存器多了绿色框框的几个,当是红色的和cortex4是一样的,代码也简单,但软件是和systick的实现逻辑不一样了,来看看代码
26行。APB1的clock是40Mhz,当按40分频是就是1ns,也就说从APB1到TIM6的时间就是40Mhz/40 ==1Mhz了,所以每来一个clock 就是1ns. 所以void tim6_delay_ns(count) count 就是想要计数的ns数,当然不能超过寄存器最大16位数据。
最后打无论是systick,TIM 都是每隔1m的打印一串字符。
后来看了一下RTC,是用来计数时间日期之类的,和这定时器关系不大,RTC以后专门看。
NO CMISS,NO HAL, NO Libray. 全自己撸代码, 又重复造了三个轮子。 systick , tim6, NVIC 中断,下次继续造。
代码路径 https://gitee.com/android_life/stm32_freertos_opensource/tree/master/bareos/systick_tim_test