以前都是用正点原子的stm32 demo开发stm32,最近在学习物联网开发,发现stm32cubemx+hal库开发更快,stm32cubemx配置stm32外设驱动初始化,简直是神器,感觉现在的应用都是为了避免重复造轮子,大部分有库,直接调用就好,像ros,rtthread,谁的库越多,接口越多,谁就NB,我想以后会不会出一个库,直接打通整个世界,一库走天下,哈哈。现在记录下一些stm32cubemx+hal库的学习教程,备忘,也为了开发项目时速查。
STM32的GPIO端口知识要点 GPIO :G eneral P urpose I nput & O utput STM32芯片最拥有GPIOA 、GPIOB …GPIOG 等7组端口 ,每组端口最多拥有Pin0、Pin1…Pin15共16个引脚 。 STM32的每个I/O端口都可以自由编程,但I/O端口寄存器必须按32位字被访问 。STM32的每个I/O端口都由7个寄存器 来控制。 STM32的GPIO端口 可以由软件配置成8种模式 : 推挽输出、开漏输出、推挽式复用功能、开漏式复用功能; 模拟输入、浮空输入、下拉输入、上拉输入。
GPIO电平输出HAL库函数 1 2 3 4 5 6 7 8 9 void HAL_GPIO_WritePin (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) ;参数1 :GPIOx,端口号,如:GPIOB,GPIOF。 参数2 :GPIO_Pin,引脚号,如:GPIO_PIN_9,GPIO_PIN_12。 参数3 :PinState,引脚输出状态。高电平----GPIO_PIN_SET;低电平----GPIO_PIN_RESET。 返回值:void ,空。 应用举例:向PB8引脚输出高电平。 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
GPIO电平翻转HAL库函数 1 2 3 4 5 6 7 void HAL_GPIO_TogglePin (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) ;参数1 :GPIOx,端口号,如:GPIOB,GPIOF。 参数2 :GPIO_Pin,引脚号,如:GPIO_PIN_9,GPIO_PIN_12。 返回值:void ,空。 应用举例:将PA3引脚输出电平翻转。 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_3);
GPIO初始化函数源码剖析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 void MX_GPIO_Init (void ) { GPIO_InitTypeDef GPIO_InitStruct = {0 }; __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET); GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); }
实训案例:基于STM32CubeMX的跑马灯 在XMF07A 或XMF07C 开发板上,利用STM32CubeMX 对STM32芯片的LED控制引脚进行配置并快速生产项目,在Keil5 中进行代码编写,实现跑马灯 功能,即:LED1灯亮,过一会,LED2灯亮,过一会,LED1灯熄灭,过一会,LED2灯熄灭….如此循环。XMF07C 开发板:STM32L151C8T6 (电路功能兼容物联网国赛设备)XMF07A 开发板:STM32F103C8T6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 while (1 ){ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET); HAL_Delay(500 ); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); HAL_Delay(500 ); HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8); HAL_Delay(500 ); }