STM32之HAL库GPIO,LED闪烁
之前使用过STM32CubeMx点亮过LED,使用图形化界面生产程序非常方便。STM32开发可以使用标准库或者STM32Cube的HAL库,当然还可以直接操作寄存器,以及最新的ll库,下面图片可以对比下。
标准库和HAL库都是使用库函数开发,不过ST公司比较主推hal库,今天我们就来用hal库开发。
stm32的开发环境有很多,比如MDK-ARM,IAR-EWARM,VisualGBD之类的,我这里选择VSCode+PlatformIO开发。一来是比较方便,二来是之前只用过MDK,不过mdk写代码太不太便捷,这里尝试下新的开发方式。platformio不仅仅能开发stm32,esp32,esp8266等等芯片都支持,还支持跨平台。
只需要在VSCode里面下载好PlatformIO插件,我参考了windows 下vscode+platformio开发stm32f103c8t6最小系统
我的板子的芯片是STM32F103VCT6,选择自己对应的型号,开发框架选择STM32Cube。
建立好项目后首先配置一下,相关配置可以在platformio官方文档查到https://docs.platformio.org/
[env:genericSTM32F103VC]
platform = ststm32 //开发平台
board = genericSTM32F103VC//板子
framework = stm32cube//开发框架
upload_protocol = stlink //下载方式,官方文档表示支持blackmagic/dfu/jlink/serial/stlink
暂时就先配置这几项,源码文件在src文件夹下,如果需要添加程序文件xxx.c,xxx.h都放在这下面。现在我们暂时只需要一个main.c,一切都配置好了现在开始写代码吧!
我的板子上的按键和LED对应的GPIO是GPIOE4和GPIOE5。
下面的程序是让LED灯每隔0.5s明暗变化
#include "stm32f1xx_hal.h"
#define GPIO_PORT GPIOE
#define LED_PIN GPIO_PIN_5
#define GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
#define KEY_PIN GPIO_PIN_4
#define KEY_GPIO_LEVEL HAL_GPIO_ReadPin(GPIO_PORT,KEY_PIN)
//延时函数
void delay_ms(int32_t nms)
{ int32_t temp; SysTick->LOAD = 1000*nms;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//GPIO初始化
void GPIO_Init()
{
HAL_Init();//初始化函数
GPIO_CLK_ENABLE();//使能GPIOE时钟
GPIO_InitTypeDef GPIO_InitStruct;//定义结构函数
GPIO_InitStruct.Pin = LED_PIN;//LED引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//工作模式
GPIO_InitStruct.Pull = GPIO_PULLUP;//上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;//翻转速度50MHZ
HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStruct); //初始化结构体
}
int main(void)
{
GPIO_Init();
HAL_GPIO_WritePin(GPIO_PORT,LED_PIN,GPIO_PIN_SET);//事先将LED置高
while(1){
delay_ms(500);
HAL_GPIO_TogglePin(GPIO_PORT,LED_PIN);
}
}