15、库函数开发小结

  • Post author:
  • Post category:其他



目录


0x01、初始化


0x02、数据输入输出


0x03、状态位、标志位


0x0001、事件


0x0002、标志位的检查与清除


0x04、外设函数分类


本节我们来总结一下ST库开发的步骤和共同点,在总结之前,我们来看一下基本所有外设都有的以下几类寄存器:

1、

控制寄存器xxx_CR

:这类寄存器是用来配置、控制相应外设的工作方式的,入GPIOx_CRL、GPIOx_CRH、AFIO_EXTICR1 ~  AFIO_EXTICR4,串口的USART_CR1 ~ USART_CR3等。

2、

数据寄存器xxx_DR

:这类寄存器主要是存储了外设进行输出输入的数据。如GPIOx_IDR、GPIOx_ODR、USART_DR等。

3、

状态寄存器xxx_SR

:这类寄存器主要存储了当前外设的运行状态,主要为一些标志位。如USART_SR、ADC_SR等。

0x01、初始化

使用ST库对外设进行初始化,一般有以下步骤:

1、定义一个xxx_InitTypeDef类型的初始化结构体。

2、根据使用需求,向这些初始化结构体的成员写入特定的控制参数。

3、填充好结构体之后,把这个结构体作为输入参数调用相应的外设库函数xxx_Init(),从而实现向寄存器写入控制参数,并配置好外设。

在以后的其他外设开发中,我们还会遇到各种类型的初始化结构体及初始化函数。如ADC_InitTypeDef,ADC_Init();I2C_InitTypeDef,I2C_Init()等。它们的应用方法是相同的,区别在于不通的外设,其结构体成员不一样,可输入参数相应也不同。只要理解了这些结构体成员所控制参数的意义,我们就能轻松的使用一个全新的外设。

0x02、数据输入输出

对外设的使用,一般涉及其输入和输出数据,ST官方库中有一类函数专门为此应用而生,如GPIO的输入输出函数:GPIO_ReadOutputDataBit();GPIO_ReadInputData()、GPIO_SetBit()还有USART的收发数据函数:USART_ReceiveData()、USART_SendData(),这类函数都是用于控制输入输出数据的。

这些函数控制相应外设数据寄存器DR的内容,达到控制输入输出的目的。使用这些函数的方法也是类似的。

1、通过输入参数,向函数指定要使用的是什么外设,如用(GPIOA、GPIO_Pin_5)选定PA5进行控制,用(USART1)来指定使用串口1外设。

2、若向外输出数据,则调用Output或Send函数,把要输出的数据变量作为函数的输入参数。

3、若为接收外部数据,则调用Read或Receive函数,读取函数的返回值来得到外部输入数据。

对于其他外设,也有类似的控制数据输入输出函数。如用ADC_GetConversionValue()函数来获取ADC转换所得到的数值;用I2C_SendData()函数来使用I2C接口进行发送数据。

0x03、状态位、标志位

当我们需要知道外设的工作状态时,就涉及一系列标志检查的ST官方库函数。

0x0001、事件

当外设完成了某些工作或出现某些状态的时候,会触发一些事件,这些事件会在状态寄存器SR中,以不同的寄存器位来记录。这些寄存器位称为相应的事件标志位。

如串口发送完成后,会在USART_SR寄存器中的位6置1,作为发送完成的时间标志。若发送寄存器为空,则会相应的在位7置1,作为发送寄存器已空的事件标志,如果我们不停的查询这个标志位,就可以得知串口的发送状态。

不停的查询标志位,会耗费内核宝贵的资源,ST以中断的方式解决这个问题,大部分事件都可以被配置成中断。例如,若把串口发送完成事件配置为可触发中断后,当串口发送完成时,外设不仅在USART_SR寄存器中记录事件,还会触发串口中断,从而可以进入相应的中断服务函数,针对不同的事件进行具体得处理,而内核也省去了不停查询标志位的工作。

0x0002、标志位的检查与清除

假如我们把串口的发送完成事件、接收寄存器非空事件(串口接收到数据)都配置为可触发中断,因为它们触发的都是串口中断,所以中断时都是进入到同一个串口中断服务函数中处理的。那么我们再串口的中断服务函数中,就要区分这个中断究竟是由发送完成事件触发的,还是由接收到数据事件触发的。

在这个时候,我们就必须进行一次标志位检查了,对标志位进行检查的库函数,一般命名为xxx_GetFlagStatus()或xxx_Get ITStatus() ,功能分别为获取事件标志位状态和中断标志位状态。如前面使用过的读取串口标志位的函数USART_GetFlagStatus();EXTI的获取EXTI线状态的函数EXTI_GetFlagStatus()。

既然有标志位检查,自然也有清除标志位功能的函数。对标志位进行清除的ST库函数,一般命名为xxx_ClearFlag()或xxx_ClearTPendingBit()函数,功能分别为清除事件标志位和清除挂起的中断标志位。如串口的USART_ClearFlag(),EXTI的USART_ClearIPendingBit()。

这四类函数都是对应到外设的xxx_SR寄存器的。

清除标志位时,xxx_ClearFlag()和xxx_ClearITPendingBit()结果都是对xxx_SR寄存器进行清除的,但是在使用的时候,还是尽量在中断时使用xxx_ClearITPendingBit(),在非中断时采用xxx_ClearFlag()要严谨一点。

这些对标志位进行操作的函数都有统一的方法。

输入参数就是要检查的标志,如串口的发送完成标志USART_FLAG_TC、接收寄存器非空标志USART_FLAG_RXNE。检查函数具有返回值,返回值是SET或RESET,表示这个标志位被置位或者没有置位。而标志位清除函数就没有返回值了,调用函数后就直接把相应的标志位进行清除。

0x04、外设函数分类

其实ST官方库的库函数还有很多共同点,如外设都有xxx_Cmd()函数,用来使能外设;如 xxx_ITConfig()函数用来配置外设的事件触发中断。在此,对这些外设主要的共有函数进行了简单的分类,一般外设都具有以下的函数



版权声明:本文为thebestleo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。