由于工作中用到寄存器,之前都是容库函数写的代码,趁这个机会补一下寄存器的知识。
GPIO寄存器有哪些?
typedef struct
{
__IO uint32_t MODER;
__IO uint32_t OTYPER;
__IO uint32_t OSPEEDR;
__IO uint32_t PUPDR;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint16_t BSRRL;
__IO uint16_t BSRRH;
__IO uint32_t LCKR;
__IO uint32_t AFR[2];
} GPIO_TypeDef;
GPIOA->AFR[0];
GPIOA->AFR[1];
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;
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);
|