STM32之HAL库GPIO,LED闪烁

@fsw  February 6, 2019

之前使用过STM32CubeMx点亮过LED,使用图形化界面生产程序非常方便。STM32开发可以使用标准库或者STM32Cube的HAL库,当然还可以直接操作寄存器,以及最新的ll库,下面图片可以对比下。

比较1.png

比较2.png

标准库和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。
新建项目.png

配置文件.png

建立好项目后首先配置一下,相关配置可以在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);
  }
}
阅读量:295

添加新评论