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);
}
下面来看看库函数怎么完成相应的寄存器装备。
void SysTick_ITConfig(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
SysTick->CTRL |= CTRL_TICKINT_Set;
}
else
{
SysTick->CTRL &= CTRL_TICKINT_Reset;
}
}
这个函数的作用是装备寄存器敞开/封闭中止,FunctionalState是自界说的数据类型,是一个枚举类型,typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
枚举类型是一种根本数据类型而不是构造类型,它用于声明一组命名的常数,将变量的值逐个列出来,变量的值只限于罗列出来的值的范围内,因而当一个变量有几种或许的取值时,能够将它界说为枚举类型。
assert_param(IS_FUNCTIONAL_STATE(NewState));
这句话的作用是判别参数NewState的值是否正确,假如发现参数犯错,它会调用函数assert_failed()向程序员陈述过错。
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{}
}