本文首先介绍常用的HAL库输出函数,随后实现嵌入式系统开发的经典案例——LED流水灯项目。由第4章分析可知,要实现LED流水灯项目,需要配置PF口的工作模式,并设置PF0-PF7的电平状态,现将涉及到的HAL库函数一一详解如下。要使用STM32微控制器某一外设,首先就必须打开其外设时钟,HAL库外设时钟使能和失能是通过一组宏定义来完成的,函数前缀为__。(1)使能GPIOF外设时钟函数:__HAL_RCC_GPIOF_CLK_ENABLE()(2)失能GPIOF外设时钟函数:__HAL_RCC_GPIOF_CLK_DISABLE() | |
| HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) |
| 根据GPIO_Init结构体中指定的参数初始化外设 GPIOx 寄存器 |
| GPIOx:x可以是A-I中的一个,用来选择 GPIO 外设 |
| GPIO_Init:指向结构体GPIO_InitTypeDef的指针,包含了外设GPIO 的配置信息。 |
| |
| |
1.GPIO_InitTypeDef structureGPIO_InitTypeDef 定义于文件stm32f4xx_hal_gpio.h,代码如下: 该参数选择待设置的GPIO管脚,使用操作符“|”可以一次选中多个管脚。该参数可以使用表2中的任意组合。Mode参数用以设置选中管脚的工作模式。表3给出了其可取的值。 | | | |
| | | |
| | | |
| | GPIO_MODE_IT_RISING_FALLING | |
| | | |
| | | |
| | GPIO_MODE_EVT_RISING_FALLING | |
Pull参数用于设置是否使用内部上拉或下拉电阻。表4给出了其可取的值。Speed参数用于设置选中管脚的速率,表5给出了其可取的值。 | |
| |
| |
| |
GPIO_SPEED_FREQ_VERY_HIGH | |
Alternate参数定义引脚的复用功能,在文件stm32f4xx_hal_gpio_ex.h中定义了该参数的可用宏定义,这些复用功能的宏定义与具体的MCU型号有关,表6是其中的部分定义示例。 | |
| void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) |
| |
| GPIOx:x可以是A-I中的一个,用来选择 GPIO 外设 |
| GPIO_Pin:指定反初始化端口引脚,取值参阅表2 |
| |
| |
表8描述了函数HAL_GPIO_WritePin。 | |
| void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) |
| |
| GPIOx:x可以是A-I中的一个,用来选择 GPIO 外设 |
| |
| PinState:写入电平状态,取值GPIO_PIN_RESET或GPIO_PIN_SET |
| |
| |
表9描述了函数HAL_GPIO_TogglePin。 | |
| void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) |
| |
| GPIOx:x可以是A-I中的一个,用来选择 GPIO 外设 |
| |
| |
| |
HAL库函数并没有提供访问GPIO端口输出数据寄存器的库函数,所以如果程序中需要读取或更新端口数据,可以采用直接访问端口数据寄存器GPIOx_ODR的方式来完成,其更加高效和快捷。/* Write data to GPIOA data port */GPIOA->ODR=0x1101;
已知开发板LED流水灯原理图如图1所示。由图可知,如需实现LED流水灯控制只需要依次点亮L1-L8,即需依次设置PF0-PF7为低电平即可,对应GPIOF端口写入数据分别为0xFE、0xFD、0xFB、0XF7、0xEF、0xDF、0xBF、0x7F。第1步:复制第3章创建的工程模板文件夹到桌面(也可以复制到其他路径,只是桌面操作更方便),并将文件夹重命名为0501 LEDWater(其他名称完全可以,只是命名需要遵循一定原则,以便于项目积累)。第2步:打开工程模板文件夹里面的Template.ioc文件,启动CubeMX配置软件,首先在引脚视图下面将PF0-PF7全部设置为GPIO_Output模式,然后选择System Core类别下项的GPIO子项,LED控制引脚均设置为推挽、低速、无上拉/下拉、初始输出高电平,添加用户标签LED1~LED8,配置结果如图2所示。时钟配置和工程配置选项无须修改,单击GENERATE CODE按钮生成初始化工程。第3步:打开MDK-RAM文件夹下面的工程文件Template.uvprojx,将生成工程编译一下,没有错误和警告就可以开始用户程序编写了。此时工程创建了一个gpio.c文件,并将其添加到Application/User/Core项目组下面,生成的LED初始化程序就存放在该文件当中,部分代码如下: GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOF_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOF, LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin |LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin, GPIO_PIN_SET); GPIO_InitStruct.Pin = LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin |LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);第4步:打开main.c文件,在程序沙箱内编写一个简单的延时程序delay()。在main()函数中,需要完成系统初始化、时钟配置,GPIO初始化,上述代码均是由CubeMX自动生成。用户只需定位main函数的while循环程序沙箱,编写流水显示程序,即先点亮一个LED灯,调用延时函数,等待约1秒时间,再点亮下一个LED灯,如此往复。需要注意的是,用户编写的所有程序均需写在程序沙箱内,否则修改系统配置后再次生成工程时,用户代码将会丢失。main.c文件的部分程序如下,为便于读者查看用户编写代码,已将程序沙箱注释语句作加粗显示。void SystemClock_Config(void); SystemClock_Config(); //系统时钟配置 MX_GPIO_Init(); //GPIO初始化 /* USER CODE BEGIN WHILE *//* USER CODE END WHILE */第5步:编译工程,直到没有错误为止,下载程序到开发板,复位运行,检查实验效果。
7 项目可复制文件下载
STM32项目实例:LED流水灯 .docx
抽奖(ARM Cortex-M4嵌入式系统原理及应用)
(2) 在公众号对话框界面输入“9”,弹出抽奖二维码(抽奖截至时间为9月4日20:00);(3) 扫描二维码参与抽奖,中奖者请于开奖当日填写邮寄地址。若有广告投放、招聘发布、会议宣传等合作需求,请联系微信:AISTEQ