由于工作中用到寄存器,之前都是容库函数写的代码,趁这个机会补一下寄存器的知识。
GPIO寄存器有哪些?
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
__IO uint16_t BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */
__IO uint16_t BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */
} GPIO_TypeDef;
GPIOA->AFR[0];//对应ARF_L
GPIOA->AFR[1];//对应ARF_H
GPIOA->BSRRH;
GPIOA->BSRRL;
GPIOA->IDR;
GPIOA->LCKR;
GPIOA->LCKR;
GPIOA->MODER;
GPIOA->ODR;
GPIOA->OSPEEDR;
GPIOA->OTYPER;
GPIOA->PUPDR;
GPIOA->AFR[0],GPIOA->AFR[1]
GPIOA->AFR[0]
GPIOA->AFR[1]
GPIOx_AFRL: 32位替代功能寄存器;
GPIOx_AFRH: 32位替代功能寄存器;
这两个的用法一般是把AFR[2]表示一个数组。
元素AFR[0]地址0x20 表示GPIOx_AFRL寄存器。
元素AFR[1]地址0x24 表示GPIOx_AFRH寄存器
GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A…I)
GPIO Alternate Function Low Register
GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A…I)
GPIO Alternate Function High Register
它管理谁?
它是管理复用功能的寄存器地位寄出器
如何理谁?
总结:两个寄存器就可以管理0-7和8-15这十六个管脚的模式多达8个端口GPIOA,GIOB,GPIOC,GIOD,GPIOE,GPIOF,GPIOG,GPIOH,GPIOI;
4个位就可以实现模式0000-1111十六种模式的切换,真的是秒啊;
库函数实现源码
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
{
uint32_t temp = 0x00;
uint32_t temp_2 = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
assert_param(IS_GPIO_AF(GPIO_AF));
temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
}
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_USART1);