STM32F407标准库学习笔记-AFIO
- 头文件 gpio.h
#define GPIO_PinSource0 ((uint8_t)0x00)
#define GPIO_PinSource1 ((uint8_t)0x01)
#define GPIO_PinSource2 ((uint8_t)0x02)
#define GPIO_PinSource3 ((uint8_t)0x03)
#define GPIO_PinSource4 ((uint8_t)0x04)
#define GPIO_PinSource5 ((uint8_t)0x05)
#define GPIO_PinSource6 ((uint8_t)0x06)
#define GPIO_PinSource7 ((uint8_t)0x07)
#define GPIO_PinSource8 ((uint8_t)0x08)
#define GPIO_PinSource9 ((uint8_t)0x09)
#define GPIO_PinSource10 ((uint8_t)0x0A)
#define GPIO_PinSource11 ((uint8_t)0x0B)
#define GPIO_PinSource12 ((uint8_t)0x0C)
#define GPIO_PinSource13 ((uint8_t)0x0D)
#define GPIO_PinSource14 ((uint8_t)0x0E)
#define GPIO_PinSource15 ((uint8_t)0x0F)
引脚标号;注意0x07以下第四位(bit3)为0;0x08以上第四位(bit3)为1;
#define GPIO_AF_RTC_50Hz ((uint8_t)0x00)
#define GPIO_AF_MCO ((uint8_t)0x00)
#define GPIO_AF_TAMPER ((uint8_t)0x00)
#define GPIO_AF_SWJ ((uint8_t)0x00)
#define GPIO_AF_TRACE ((uint8_t)0x00)
#if defined(STM32F446xx)
#define GPIO_AF0_TIM2 ((uint8_t)0x00)
复用功能选择;决定引脚连接到哪一个模块,一个引脚有多个不同选择,具体选择见
参考手册7.3.2、7.3.7;
数据手册第三章table7、table9
typedef struct
{
__IO uint32_t MODER;
...
__IO uint32_t AFR[2];
} GPIO_TypeDef;
GPIOx->AFR使用了数组来定义;
AFR[0]=AFRL对应0~7号引脚;
AFR[1]=AFRH对应8~15号引脚;
刚好可以使用引脚标号的bit3来进行选择;
一个引脚对应4位。
- C文件 gpio.c
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
{
uint32_t temp = 0x00;
uint32_t temp_2 = 0x00;
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;
}
(uint32_t)GPIO_PinSource & (uint32_t)0x07 ;
排除了引脚号第4位的影响,找出引脚号对应AFR[]寄存器中的第几组;
以上*4;
找到对应位的起始bit;
(uint32_t)(GPIO_AF) << 以上;
将所选的复用功能放在引脚对应寄存器正确的4位上;
GPIOx->AFR[GPIO_PinSource >> 0x03];
根据引脚标号的第四位选择AFR[0]、AFR[1];
未完