铺垫:
外设基本都具有以下几类寄存器:
控制寄存器xxx_CR,用于配置、控制相应外设,如USART_CR1~USART_CR3等。
数据寄存器xxx_DR,存储外设输入输出的数据,如GPIOx_IDR、GPIOx_ODR等。
状态寄存器xxx_SR,存储当前外设状态,主要为一些标志位,如USART_SR、ADC_SR等。
功能划分十分清晰,这样我们也基本能明白常见的初始化操作乃至其他操作寄存器在做什么。
初始化
先前的学习中,我们使用函数库来初始化,大量使用XXX_InitTypeDef
类型的XXX_InitStructure
来配置对应的外设,如NVIC、EXTI等。
这些初化结构体中的参数往往是与相应外设的控制寄存器CR对应的,使用库函数开发的时候,参阅参考手册可以了解参数的意义。
如下图为USART_CR1的寄存器说明:(部分)
使用ST库进行外设的初始化一般有如下步骤:
- 定义一个
xxx_InitTypeDef
类型的初始化结构体 - 根据使用要求,向结构体成员写入相应的控制参数。
- 填充好结构体后,将其作为输入参数调用相应的外设库函数xxx_Init(),从而实现向寄存器写入控制参数。
所有的库函数初始化结构体和初始化函数都有类似的应用方式,我们熟练地掌握这应用方式,每次使用时仅需了解结构体成员控制参数的意义就能轻松控制外设。
数据的输入输出
对于有数据输入输出的外设,官方库一般有相应的库应运而生,如GPIO_ReadOutputDataBit()
、GPIO_ReadInputData()
等。
这些函数则是控制应的数据寄存器DR的内容达成数据的输入输出的目的,使用方法依然共性可循:
- 输入参数,向函数指定使用的是什么外设,如使用GPIOA,GPIO_Pin_5,选定PA5进行控制。用USART1来指定外设。
- 若向外输出数据则调用相应的Output或send函数,将要输出的数据作为输入参数。
若为接收数据,则是调用read或Receive函数,读取函数的返回值来得到外部输入数据。
对于其他外设也有类似的控制数据输入输出的库函数。如用ADC_GetConversionValue()
函数获取ADC转换的值。
状态位&标志位
让我们方便地了解外设当前的状态,而无需其他特别手段检验外设状态。最常用的就是串口收发时的收发完成标志位、总线空闲标志位等。
当然也会有相应的查询和清除函数,一般命名为xxx_ClearFlag()
或xxx_ClearITPendingBit()
,如串口的USART_ClearFlag()
。
事件
上文提到的总线空闲标志位正是一种事件标志位,当外设完成一些工作或出于某些状态时候会触发一些事件,这些事件就会在状态寄存器SR中以不同位存储记录,也就是相应的事件标志位。
如串口完成发送后,会在UASRT_SR中位6置1,作为发送完成标志。我们一直检查它就可以得知是否发送完成。但这样会耗费宝贵的内核资源,ST以中断解决这个问题,那不是我们这里应当讨论的内容了;)
外设函数分类
库函数还有许多共同点,如外设都有xxx_Cmd()
函数,能用来使能外设等。
在此对外设主要共有的函数进行简单分类(不代表一定有):
函数名 | 功能 | 输入参数 | 返回值 | 实例 |
---|---|---|---|---|
xxx_Init() | 初始化外设 | xxx_InitTypeDef类型结构体 | void | GPIO_Init() |
xxx_DeInit() | 按照缺省值初始化外设 | 外设名 | void | USART_DeInit() |
xxx_StructInit() | 按照默认数据填充结构体 | xxx_InitTypeDef结构体 | void | GPIO_StructInit() |
xxx_SendData() | 让外设发送数据 | 外设名,要发送的数据 | void | USART_SendData() |
xxx_ReceiveData() | 让外设接收数据 | 外设名 | 接收到的数据 | USART_ReceiveData() |
xxx_GetFlagStatus() | 查询状态位 | 事件标志名 | SET/RESET | USART_GetFlagStatus() |
xxx_GetITStatus() | 查询中断标志位 | 中断标志名 | SET/RESET | USART_GetITStatuss() |
xxx_ClearFlag() | 清除状态位 | 事件标志名 | void | USART_ClearFlag() |
xxx_ClearITPendingBit() | 清除挂起的中断标志位 | 中断标志名 | void | USART_ClearITPendingBit() |
xxx_ITConfig() | 配置中断 | 外设名,中断标志名, ENABLE./DISABLE | void | USART——ITConfig() |
xxx_Cmd() | 使能/失能 | ENABLE./DISABLE | void | TIM_Cmd() |
xxx_DMACmd() | 配置外设是否可用DMA请求 | 外设名,要配置的DMA请求(如DMA接收请求),ENABLE./DISABLE | void | USART_DMACmd() |