完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、配置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口输出电平的功能。 二、硬件连接
三、代码及分析 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)反复循环,就会看到跑马灯的效果了。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1278 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1290 浏览 1 评论
695 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
514 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1299 浏览 2 评论
1713浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
414浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
380浏览 3评论
367浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
343浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-17 21:08 , Processed in 1.023185 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号