#include "stm32f4xx_hal.h" // 定义一个指向GPIOA的指针 GPIO_TypeDef* GPIOA_PTR = GPIOA; void GPIO_Config(void) { // 定义一个GPIO初始化结构体 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 使能GPIOA时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); // 配置PA5引脚为推挽输出模式,速度为高速,无上...
回到GPIO_TypeDef 这段代码,这个代码用 typedef 关键字声明了名为 GPIO_TypeDef 的结构体类型,结构体内又定义了 7 个 __IO uint32_t 类型的变量。这些变量每个都为 32 位,也就是每个变量占内存空间 4 个字节。在 c 语言中,结构体内变量的存储空间是连续的,也就是说假如我们定义了一个 GPIO_TypeDef ,...
6) GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A..I) GPIOport outputdataregister 偏移地址:0x14 复位值:0x00000000 7) GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x = A..I) GPIOportbitset/resetregister 偏移地址:0x18 复位值:0x00000000 8) GPIO 端口配置锁定寄存器 (GPIOx_LCKR) (x = A..I)...
我们以初始化GPIO引脚和读取传感器数据代码举例。 1.反面例子(未使用typedef,可读性差): 2.问题点 2.1 类型信息缺失: pin是uint8_t,但看不出是GPIO引脚、PWM通道还是其他硬件接口的编号。 value是uint32_t,可能是任意数值类型,需结合变量名或注释猜测其用途(如注释缺失则更难理解)。 2.2 数字不够直观: init_...
这里将 GPIOA 宏定义为 GPIOA 基地址经过强制类型转换为 GPIO_TypeDef 的指针,这样的作用是使 GPIOA 结构体内对应的成员按顺序填充内存区域,如图3所示。因此 GPIOA 的 CRL 寄存器就是作为 GPIOA 基地址后的第一个内存块,GPIOA->CRL 的本质就是这个内存块的地址,或者说是用 GPIOA->CRL 给这个地址取了个形...
(a)、GPIO端口的引脚:可选范围为GPIO_Pin_0~GPIO_Pin_15,也可以选所有引脚GPIO_Pin_All。 (b)、GPIO的端口模式:用于设置GPIO的端口模式,可选的端口模式如下。 登录后复制typedefenum{ GPIO_Mode_IN =0x00,//普通IO口输入GPIO_Mode_OUT =0x01,//普通IO口输出GPIO_Mode_AF =0x02,//管脚复用功能GPIO_Mo...
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } /** * @brief 系统时钟配置 * @param None * @retval None */ void SystemClock_Config(void) {RCC_OscInitTypeDefRCC_OscInitStruct = {0}; RCC_ClkInitTypeDefRCC_ClkInitStruct= {0}; ...
GPIO_InitTypeDef 类型的结构体 typedef struct{ uint32_tPin; /*!<指定要配置的GPIO引脚。该参数可以是@ref GPIO_pins_define 的任意值 */ uint32_t Mode; /*!<指定所选引脚的工作模式。该参数可以是@ref GPIO_mode_define 的值 */ uint32_t Pull; /*!< 指定所选引脚的上拉或下拉激活。该参数...
typedef struct { uint32_t GPIO_Pin; // GPIO引脚编号,可以是单个引脚或者多个引脚的组合,如 GPIO_Pin_0 | GPIO_Pin_1 GPIOMode_TypeDef Mode; // GPIO引脚的工作模式,包括输入模式、输出模式、复用模式等 GPIOSpeed_TypeDef Speed; // GPIO引脚的输出速率,通常有低速、中速、高速可选 ...