2.从点亮小灯开始学stm32

这个文件管理树,看着挺复杂。
在这里插入图片描述
其中,User里面有mian.c和头文件。BSP是驱动程序,在本例程中就是驱动小灯的程序。
如何驱动小灯?其实就是对gpio口进行设置,然后通过给对应的数据寄存器赋值,使得灯亮灭。还需要延时模块,可以实现亮灭交替。
前面一篇文章说过,设置寄存器很简单,就是给ram中某个地址的变量赋值。但是如果寄存器数据多,而且地址是32位的情况下,记住相对于的寄存器地址就会很麻烦,所以在stm32中,有一个叫做HAL库的东西,可以帮助我们实现对寄存器的设置。
具体是如何实现的呢?
比如我想给GPIOI中的PIN1进行设置。
1、引脚配置初始化
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
GPIOI是什么东西呢?其实就是一个地址。
#define GPIOI ((GPIO_TypeDef ) GPIOI_BASE)
=》
#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000)
=》
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
=》
#define PERIPH_BASE ((uint32_t)0x40000000) /
!< Base address of : AHB/ABP Peripherals

&GPIO_InitStruct是啥呢?就是新建的GPIO_InitStruct结构体的首地址。

2、下面介绍给某个引脚进行赋值的函数

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if(PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16;
  }
}

GPIOx->BSRR = GPIO_Pin;这个代码是如何实现某个引脚进行赋值的呢?

BSRR是从哪里来的?我GOTO一下,发现在这个结构体里面。难道GPIOI是下面这个结构体变量的首地址?果然没错,GPIO_TypeDef* GPIOx

typedef struct
{
  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
  __IO uint32_t BSRR;     /*!< GPIO port bit set/reset register,      Address offset: 0x18      */
  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
} GPIO_TypeDef;

3、总结

GPIO_TypeDef这个结构体变量在stm32f746xx.h中。
GPIO_InitTypeDef这个结构体变量在stm32f7xx_hal_gpio.h
HAL_GPIO_Init()在stm32f7xx_hal_gpio.c中,这个函数就是把类似硬件的功能给配置好。就好像在51中,选择P0,还是P1,。
HAL_GPIO_WritePin()也在stm32f7xx_hal_gpio.c中;这个函数是实现计算机的数值0,1输出功能。就好像51中,给P0口的某一个引脚赋值一样。
HAL_GPIO_TogglePin();这个函数和writepin功能类似,都在gpio.c中。
需要进行设置的结构体变量放在stm32f746xx.h,不晓得这个结构体是如何与地址进行绑定的。。,,
如何实现把一个对象结构体赋值给对应的地址,就是在stm32f7xx_hal_gpio.c中。

gpiox,x=A~k。这个多组引脚。每组都在ram中有个地址。每组同样也在ram中占一定的空间。根据我目前掌握的知识来看,gpio这个功能对应的寄存器地址在每组首地址的最前部分。此外还有其他的复用功能寄存器在ram中,依次往后排。

猜你喜欢

转载自blog.csdn.net/qq_34190043/article/details/94612713