这个文件管理树,看着挺复杂。
其中,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中,依次往后排。