STM32
直播中

李秀珍

8年用户 1043经验值
私信 关注
[问答]

如何配置HAL库操作IO口?

如何配置HAL库操作IO口?

回帖(1)

程傍纯

2021-11-25 11:15:15

一、配置HAL库操作IO口步骤:
(1) 初始化HAL库:HAL_Init( );


(2) 初始化系统时钟:Stm32_Clock Init( );


                                 Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz


(3) 使能IO口时钟。


操作寄存器:配置IO口时钟使能寄存器:RCC->AHB1ENR


HAL库方法:_HAL_RCC_GPIOB_CLK_ENABLE( );


(4) 初始化IO口模式。


操作寄存器:GPIOx­_MODER  OTYPER  OSPEEDR  PUPDR


HAL库方法:HAL_GPIO_Init( );


在HAL库中,操作四个配置寄存器初始化GPIO是通过HAL_GPIO_Init函数完成:


void HAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init);


该函数有两个参数,第一个参数是用来指定需要初始化的GPIO对应的GPIO组,取值范围为GPIOA~GPIOK。第二个参数为初始化参数结构体指针,结构体类型为GPIO_InitTypeDef。


定位到HAL_GPIO_Init 函数体处,双击入口参数类型GPIO_InitTypeDef 后右键选择“Go to definition of…”可以查看结构体的定义如下:


typedef struct


{
uint32_t Pin;   //指定I0口


uint32t Mode;  //模式设置


uint32_tPull;   //上下拉设置


uint32_t Speed; //速度设置


uint32_tAlternate;//复用映射配置


}GPIO_Init TypeDef;


typedef为结构体定义一个别名GPIO_Init TypeDef,这样我们可以通过GPIO_Init TypeDef 来定义结构体变量。该结构体有5个成员变量。结构体成员变量的引用方法是:结构体变量名字.成员名


初始化GPIO的常用格式是:


GPIO_Init TypeDef  GPIO_Initure;  // 为结构体定义一个变量GPIO_Initure


GPIO_Initure.Pin = GPIO_PIN_0;   //PB0


GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出


GPIO_Initure.Pull = GPIO_PULLUP;//上拉


GPIO_Initure.Speed = GPIO_SPEED_HIGH;//高速


HAL_GPIO_Init(GPIOB,&GPIO_Initure);//调用HAL_GPIO_Init()函数


上面代码的意思是设置PBO端口为推挽输出模式,输出速度为高速,上拉。


从上面初始化代码可以看出,结构体GPIO_Initure的第一个成员变量Pin用来设置是要初始化哪个或者哪些I0口。第二个成员变量Mode是用来设置对应I0端口的输出输入端口模式,这个变量实际配置的是GPIOx的MODER寄存器。第三个成员变量Pull是用来设置上拉还是下拉,配置的是GPIOxPUPDR寄存器。第四个成员变量Speed用来设置输出速度,配置的是GPIOxOSPEEDR寄存器。第五个成员变量Alternate,它是用来设置引脚的复用映射的。


(5) 操作IO口,输出高低电平。


操作寄存器:配置寄存器GPIOX_ODR或者GPIOX_BSRR。


HAL库方法:HAL_GPIO_WritePin ( );


库函数操作BSRR寄存器来设置IO电平的函数为:


void HAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin,GPIO_PinState PinState);该函数用来设置一组I0口中的一个或者多个IO口的电平状态。


比如我们要设置GPIOB.5输出高电平,方法为:


HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);//GPIOB.5输出高电平


设置GPIOB.5输出低电平,方法为:


HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);//GPIOB.5输出低电平


(6) HAL库操作IDR寄存器读取IO输入电平相关函数


GPIO_PinState HAL_GPIO_Read(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);该函数用来读取一组I0下的一个或者多个I0口电平状态。


比如我们要读取GPIOF.5的输入电平,方法为:


HAL _GPIO_ ReadPin(GPIOF,GPIO PIN_5);//读取PF5的输入电平


该函数返回值就是IO口电平状态。


(7) 取反IO口输出电平HAL_GPIO_TogglePin函数


void HAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin);该函数是通过操作 ODR寄存器,达到取反IO口输出电平的功能。



二、硬件连接


引脚硬件
PB1LED0(DS0)
PB0LED1(DS1)

三、代码及分析
led.c
#include "led.h"
//初始化PB0,PB1为输出.并使能这两个口的时钟                    
//LED IO初始化
void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;                 //初始化GPIO常用格式,定义结构体指针类型的变量GPIO_Initure
    __HAL_RCC_GPIOB_CLK_ENABLE();                        //开启GPIOB时钟,使能GPIOB,就用其对应的宏标识符
       
    GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB0,1
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);     // 调用函数HAL_GPIO_Init实现配置PB0和PB1为推挽输出,上拉,高速。                                       
       
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);//调用 HAL_GPIO_WritePin函数,它有三个入口参数:那个分组,那个引脚,引脚状态
                                            
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);        //PB1置1,默认灯灭
}
在LED_Init()函数中,调用函数HAL_GPIO_Init实现配置PB0和PB1为推挽输出,上拉,高速。并把PB1置1,默认灯灭。


main. c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
int main(void)
{
   Cache_Enable();                  //打开L1-Cache
   HAL_Init();                                        //初始化HAL库
   Stm32_Clock_Init(432,25,2,9);    //设置时钟,216Mhz
   delay_init(216);                 //延时初始化
   uart_init(115200);                        //串口初始化
   LED_Init();                      //初始化LED

    while(1)
    {
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //LED0对应引脚PB1拉低,亮,等同于LED0(0)
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);   //LED1对应引脚PB0拉高,灭,等同于LED1(1)
        delay_ms(500);                                                                                //延时500ms
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);   //LED0对应引脚PB1拉高,灭,等同于LED0(1)
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //LED1对应引脚PB0拉低,亮,等同于LED1(0)
        delay_ms(500);                                      //延时500ms
    }
}

首先包含相关的头文件,在主函数main中调用相关函数进行初始化。在while循环中,(LED0亮,LED1灭,延时0.5s)(LED0灭,LED1亮,延时0.5s)反复循环,就会看到跑马灯的效果了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分