- UID
- 872339
|
关键字:STM32 滴答时钟 库函数
STM32的库函数操作给设计开发人员带来了诸多的便利,开发人员不必十分了解STM32的内部寄存器及硬件机制,只要有C语言基础,即可完成单片机的开发,缩短了开发周期,降低了开发难度,因而备受工程师喜爱。
基于库函数的开发模式,与基于API(Application Programming Interface)的软件开发有着异曲同工之处,程序员通过调用 API 函数对应用程序进行开发,而又无需访问源码,或理解内部工作机制的细节,可以减轻编程任务。STM32的基于函数库的开发模式也是一样的道理,因此对于有单片机开发经验的工程师来说,学习STM32,很容易就可以上手。
虽然可以不考虑库函数内部的细节,不考虑如何实现硬件寄存器的配置,但是深入了解库函数对于提高编程能力是很有好处的,下面以系统滴答时钟为例,详解其工作流程。
滴答时钟是STM32内部的一个24位定时器,其操作相对简单,配置寄存器较少。大体的工作流程是这样的,定时器首先要有时钟源,时钟源配置好之后,设置定时时间,然后定时器启动,当定时时间到时,置位标志位,重载定时器初值,系统可采用查询标志位和中断两种工作方式做出相应的响应,下面来看看程序如何实现延时功能。
//初始化配置函数
Void Delay_Init()
{
RCC_ClocksTypeDef RCC_ClocksStatus;
RCC_GetClocksFreq(&RCC_ClocksStatus);//获取时钟频率
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//时钟源配置为系统主时钟频率/8
SysTick_ITConfig(DISABLE);//不使能中断,采用查询方式
delay_fac_us = RCC_ClocksStatus.HCLK_Frequency / 8000000;// 1us的定时初值
}
//实现延时Nus的延时功能
void Delay_us(u32 Nus)
{
SysTick_SetReload(delay_fac_us * Nus);//载入初值
SysTick_CounterCmd(SysTick_Counter_Clear);//计数器清零
SysTick_CounterCmd(SysTick_Counter_Enable);//计数器开始计数
do
{
Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
}while (Status != SET);//不断查询标志位,当载入初值与计数器相等时,标志位置位。
SysTick_CounterCmd(SysTick_Counter_Disable);//关闭计数器
SysTick_CounterCmd(SysTick_Counter_Clear);//清零计数器
}
//实现闪灯
Delay_Init();
While(1)
{
LED1(ON);
Delay_us(500000);//延时500ms
LED1(OFF);
}
|
|