#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引脚为推挽输出模式,速度为高速,无上...
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_TypeDef 这段代码,这个代码用 typedef 关键字声明了名为 GPIO_TypeDef 的结构体类型,结构体内又定义了 7 个 __IO uint32_t 类型的变量。这些变量每个都为 32 位,也就是每个变量占内存空间 4 个字节。在 c 语言中,结构体内变量的存储空间是连续的,也就是说假如我们定义了一个 GPIO_TypeDef ,...
#defineGPIOA ((GPIO_TypeDef *) GPIOA_BASE) 这里将 GPIOA 宏定义为 GPIOA 基地址经过强制类型转换为 GPIO_TypeDef 的指针,这样的作用是使 GPIOA 结构体内对应的成员按顺序填充内存区域,如图3所示。因此 GPIOA 的 CRL 寄存器就是作为 GPIOA 基地址后的第一个内存块,GPIOA->CRL 的本质就是这个内存块的...
一次接触STM32时,打开一段底层驱动代码,满屏的GPIO_TypeDef、USART_HandleTypeDef之类的类型名,后面还带个"_t、Def"之类的尾巴。 明明用unsigned int就能解决问题,为什么非要多此一举搞个typedef? 别人的代码全是自定义类型,我照着写却不知道为什么要这样用? 有句话叫存在即合理,做开发很多年以后,我才明白typedef...
typedef struct{uint16_t GPIO_Pin; // 用于选择待初始化的IO口引脚。GPIOSpeed_TypeDef GPIO_Speed; // 设置IO口的输出速度。GPIOMode_TypeDef GPIO_Mode; // 设置IO口的工作模式,提供8种选择。} GPIO_InitTypeDef;其中,GPIO_Pin参数可以设置为无引脚被选中(GPIO_Pin_None)、选中特定引脚(如GPIO_Pin_n...
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{uint16_t GPIO_Pin;// GPIO引脚,可以是GPIO_Pin_0~GPIO_Pin_15GPIOMode_TypeDef GPIO_Mode;// GPIO模式,如输入、输出、复用等GPIOSpeed_TypeDef GPIO_Speed;// GPIO速度,仅在输出模式下有效}GPIO_InitTypeDef; GPIO_Pin:指定要配置的GPIO引脚,可以是GPIO_Pin_0到GPIO_Pin_15。可以用|运算符...