一、配置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口输出电平的功能。
二、硬件连接
引脚 | 硬件 |
PB1 | LED0(DS0) |
PB0 | LED1(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)反复循环,就会看到跑马灯的效果了。
一、配置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口输出电平的功能。
二、硬件连接
引脚 | 硬件 |
PB1 | LED0(DS0) |
PB0 | LED1(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)反复循环,就会看到跑马灯的效果了。
举报