前言
说明
- 本文只针对于软件层面的阅读,详细操作请查阅对应的手册,使用过标准库的朋友更好的能理解
- 本文针对的是STM32F10x系列,其他的类似
参考资料
- STM32F10x中文参考手册
工具
- stm32cubemx6.5
- clion最新版
HAL源码之GPIO的阅读
步骤一:先大致看一遍STM32F10x中文手册
- 此过程中我们主要了解关于GPIO相关的寄存器地址和地址(HAL也是根据此进行封装)
- 不需要将所有的都弄明白(针对初学者),前期理解大概就行了,这是别人的规定的。
GPIO的基地址映射表
> GPIO的功能描述
这张图就大概阐述出GPIO的功能,我的理解如下:
1、GPIOx的配置模式寄存器是: GPIOx_CRL和GPIOx_CRH
2、GPIOx的数据寄存器(操作数据只有两种:输入、输出): GPIOx_IDR、GPIOx_ODR
3、GPIOx的置位或复位寄存器: GPIOx_BSRR(32位)
4、GPIOx的复位寄存器: GPIOx_BRR(16位)
5、GPIOx的锁定寄存器: GPIOx_LCKR
6、GPIO寄存器操作必须是32位(即4字节操作)
GPIO寄存器
这里就是对上述进行详细的说明,根据需要自行阅读.
步骤二:阅读HAL源码中的GPIO结构体
结构体
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
根据结构体定义会发现,此处定义的字段和上述的寄存器排列是一一对应的关系;
结构体和地址进行映射的关系(核心)
以下宏定义来源与源码 stm32f103xe.h
// 片段1
#define FLASH_BASE 0x08000000UL /*!< FLASH base address in the alias region */
#define FLASH_BANK1_END 0x0807FFFFUL /*!< FLASH END address of bank1 */
#define SRAM_BASE 0x20000000UL /*!< SRAM base address in the alias region */
#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */
// 2
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000UL)
// 将手册的映射表地址关系进行映射
#define GPIOA_BASE (APB2PERIPH_BASE + 0x00000800UL)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x00000C00UL)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x00001000UL)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x00001400UL)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x00001800UL)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x00001C00UL)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x00002000UL)
// 将地址和结构体进行映射
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *)GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *)GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *)GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *)GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *)GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *)GPIOG_BASE)
步骤三: 阅读HAL源码中操作GPIO的函数
此内容需要配合手册进行阅读,效果更好。你会发现操作到最后也是在对地址进行一些的操作。
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
总结
1、此记录只做源码的的大概梳理,具体的分析,后续持续更新