目录
内容目录
所有外设都有以下几类寄存器:
- 控制寄存器xxx_CR(Control/Configuration Register):这类寄存器是用来配置、控制相应外设的工作方式的。比如GPIOx_CRL、GPIOx_CRH、AFIO_EXTICR1~AFIO_EXTICR4,串口的USART_CR1~USART_CR3等。
- 数据寄存器xxx_DR(Data Register):这类寄存器主要是存储了外设进行输入输出的数据。如GPIOx_IDR、GPIOx_ODR、USART_CR3等。
- 状态寄存器xxx_SR(Status Register):这类寄存器主要存储了当前外设的运行状态,主要为一些标志位。如USART_SR、ADR_SR等。
初始化
-
使用ST库对外设进行初始化,一般有以下几个步骤:
1.定义一个xxx_InitTypeDef类型的初始化结构体。
-
2.根据使用需求,向这些初始化结构体成员写入特定的控制参数。
3.填充好结构体后,把这个结构体作为输入参数调用相应的外设库函数xxx_Init(),从而实现先寄存器写入控制参数,并配置好外设。
数据输入与输出
- 对于外设的使用,一般涉及其输入和输出数据,ST官方库有一类专门为此应用而生的函数。如GPIO的输入输出函数:GPIO_ReadOutputDataBit(),GPIO_ReadIntputData(),GPIO_SetBits();有USART的收发数据函数:USART_ReceiveData()、USART_SendData()。
这些函数控制相应外设数据寄存DR的内容,达到控制输入输出的目的。使用这些函数的方法也是类似的:
1.通过输入参数,向函数指定要使用的是什么外设,如用(GPIOA,GPIO_PIN_5)选定PA5进行控制,用(USART1)来指定使用使用串口1外设。
-
2.若要先外输出数据,则调用Output或者Send函数,把将要输出的数据变量作为函数的输入参数。
3.若为接收外部数据,则调用Read或Receive函数,读取函数的返回值来得到外部输入数据。
状态位、标志位:
-
1.事件
-
当外设完成了某些工作或出现某些状态的时候,会触发一些事件,这些事件会在状态寄存器SR中,以不同的寄存器来记录。这些寄存器称为相应的事件标志位。
- 如串口发送完成后,会在USART_SR寄存器中的位6置1,作为发送完成的事件标志。若发送完寄存器为空,则会在相应地在位7置1,作为发送寄存器已空的事件标志,如果我们不停地查询这个标志位,就可以得知串口的发送状态。
- 不停地查询标志位,会耗费内核宝贵的资源,ST以中断的方式解决这个问题,大部分事件都可以被配置中断。如把串口发送完成事件配置为可触发中断后,当串口发送完成时,外设不仅在USART_SR寄存器中记录事件,还会触发串口中断,从而可以进入相应的中断服务函数,针对不同的事件进行具体的处理,而内核也省去了不停查询标志位的工作。
-
2.标志位的检查与清除
-
对标志位进行检查的库函数,一般命名为xxx_GetFlagStatus()或xxx_Get ITStatus(),功能分别为获取事件标志位状态和中断标志位状态。如读取串口标志位的函数USART_GetFlagStatus();EXIT的获取EXIT线状态的函数EXIT_GetFlagStaus()。
- 既然有标志位检查,自然也有清除标志位功能的函数。对标志位进行清除的ST库函数,一般命名为xxx_ClearFlag()或xxx_ClearITPendingBit()函数,功能分别为清除事件标志位和清除挂起的中断标志位。比如串口的USART_ClearFlag(),EXTI的USART_ClearITPendingBit()。
- 对这些标志位进行操作的函数具有统一的方法。输入参数就是要检查的标志,如串口的发送完成标志USART_FLAG_TC、接受寄存器非空标志位USART_FLAG_RXNE.。检查函数是否具有返回值,返回值是SET或RESET,表示这个标志位被置位或没有被置位。而标志位清除函数就没有返回值了,调用函数后就直接把相应的标志位进行清除。