MSPM0系列外设 SYSTICK——DL_delay函数的使用
MSPM0系列外设 SYSTICK——DL_delay函数的使用
前言
SYSTICK 作为 Cortex-M 內核系列的私有外设 是一个通用广泛一致性好,易于移植的外设定时器使用,通常用来作为系统堵塞延时,操作系统OS的时间轮片心跳,基于此,不同的芯片在移植操作系统时有这非常好的兼容性,所以学习SYSTICK定时器是一个至关重要的定时器。
本文主要讲一下代码思路和使用代码。
所谓的自减定时器就在此不过多赘述。
有兴趣可以去了解自减定时器。
0.SYSCONFIG 配置
重点就是设置好 Calculated Period 为 1ms
记得使能中断
1.时钟宏定义
下面这行代码在sysconfig.h 揭示了当前的cpu主频。
(不需要复制)(已经被sysconfig配置好了在.h文件中)
我的主频很高 感兴趣的同学可以了解 SYSCTL 中的 clock tree
这里提供一个有价值经验
就是 SYSOSC 32MHz 过 VCO 至160MHz 是一个较为准确的时钟 但不是一个精准的时钟
其他的倍频方案 有输出错误的情况 但160MHz大大 抑制几乎没有发现输出错误的情况
最后还是建议使用 外部晶振 但是有一点点小细节需要注意 否则无法使用 外部晶振
#define CPUCLK_FREQ 80000000
2.延迟函数
(复制)
这个是延迟函数。真正使用的函数主体,前台。
有兴趣可以去了解前后台的代码写法逻辑。
void DL_delay(uint32_t ms)
{
while(ms--)
{
delay_cycles(CPUCLK_FREQ/1000);
}
}
delay_cycles 是TI自己的 Driverlib 函数。(一种库函数 ti封装的)
为什么是 除 1000 这是一个重要的理解关键 简单讲一下
就是无论一秒主频有多少个pulse 只要 除 1000 就是 1ms 所需要的pulse数量
其次为什么说先分享 SYSTICK 外设的学习
首先 是为了声明这个外设的重要性让更多的朋友在学习的过程中真正地理解外设
因为可能初学者在使用基础32的delay函数的时候并没有 意识到 自己同时在使用一个外设
这是因为ST意法半导体 有帮大家提前 写好了delay库函数,封装掉了这个外设,大大的减轻了初学者的上手难度
但是让学习者对外设內核的理解进一步削弱
可以帮助大家进一步理解 芯片资源的概念
3.代码原型
(不需要复制)
这个代码写法的重要性不可谓不重要,常见的写法在stm32 HAL库中我们也能发现,也是一个宏定义 SystemCoreClock 详细的可能略有差异 但是中心思想 是一致的。
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
/* Configure the SysTick to have interrupt in 1ms time basis*/
if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
{
return HAL_ERROR;
}
/* Configure the SysTick IRQ priority */
if (TickPriority < (1UL << __NVIC_PRIO_BITS))
{
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
uwTickPrio = TickPriority;
}
else
{
return HAL_ERROR;
}
/* Return function status */
return HAL_OK;
}
4.代码实现中断服务函数
(复制)(建议初学者移植不要更改)
其次可移植性的优点意味着 这个代码 可以直接 复制移植
为什么 可以实现上述的操作 这取决 CMSIS 标准的规定
这就是 为什么初学者在keil上安装芯片包的目的,也就是一颗芯片非常重要的 启动文件 .s。
有兴趣可以搜索复入性,重入性。
如果有认真读过启动文件 就会发现里面介绍了什么,你会发现下面这个函数会出现在其中,所以下面这个函数的名称是不可以修改的。
有兴趣可以搜索__STATIC_INLINE 相关内容
void SysTick_Handler(void)
{
if( delay_times != 0 )
{
delay_times--;
}
}
5.全局变量声明
(复制)
(建议初学者移植不要更改,关于volatile 如果拿不准就不要删除。)
volatile uint32_t delay_times=0;
总结
以上就是今天要讲的内容,至此这个外设使用分享结束。
我是辛尘大海。