STM32L0开发板上手 - 点亮LED灯

入手了一块NUCLEO-L053R8的板子,然后就开始正式地学习ARM编程啦。这个板子搭载STM32L053R8 MCU,架构是ARM Cortex M0+,属于超低功耗的板子,而且同时支持Arduino和ST morpho的拓展。

第一次接触STM32(也是第一次接触这么底层的东西),当然要写Hello World,就从最简单的点亮LED开始吧!

工具准备

  • STM32L0开发板(废话)
  • USB数据线一根(因为我这个板子支持直接SWD,所以不需要另外的调试设备)
  • LED灯和电阻若干
  • 面包板和若干连接线
  • Keil MDK这个IDE
  • 应该没了吧

第零步!

当然是要接线啦。。。像这样就好。。。
接线

第一步

首先新建一个空文件夹,暂且叫LED吧

然后打开Keil,新建一个工程(Project),名字也叫LED好了。在弹出的对话框中选择MCU型号,这里是STM32L053R8T6。
选择目标MCU

接着会让你选运行时环境,这里我也刚入门不知道具体需要什么,反正昨天摸了接近一下午,选了CMSIS里的Core,然后将Device设置为Standalone,选择了Startup和全部HAL,虽然肯定有浪费但总比不知不觉报错好2333,如图所示
选择运行时环境

就创建好了,右击Target 1选择Options,我们需要修改频率和调试器。

将频率调到MCU对应的频率,我这块板子是32MHz,所以填上32.0;调试器选择ST-LINK Debugger,设置如下图;
Target界面
Debug界面

编写代码

新建一个main.c的文件到项目中,我参考了官方示例代码。另外我将这个LED灯接到了D5这个接口,查阅Reference得知它对应MCU的PORTB、PIN5(也就是PB5)。

#include "stm32l0xx_hal.h"

static GPIO_InitTypeDef GPIO_Init;

static void SystemClock_Config(void);
void SysTick_Handler(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();               //初始化系统时钟,等下来应该是要用延迟
    __HAL_RCC_GPIOB_CLK_ENABLE();       //开启GPIOB的时钟,必须

    GPIO_Init.Pin = (GPIO_PIN_4);
    GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init.Pull = GPIO_PULLUP;
    GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOB, &GPIO_Init);   //初始化GPIO

    while(1) {
        HAL_Delay(100);
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);
        //也可以直接修改GPIOB->ODR寄存器的4号比特来实现开关
        //实现上是一样的
        //GPIOB->ODR ^= (1u << 4);
        HAL_Delay(100);
    }
}

//下面两个函数都是官方Example里的,与时钟初始化和Delay有关,不加的话就无法正常运行
static void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  /* Enable Power Control clock */
  __HAL_RCC_PWR_CLK_ENABLE();

  /* The voltage scaling allows optimizing the power consumption when the device is 
     clocked below the maximum system frequency, to update the voltage scaling value 
     regarding system frequency refer to product datasheet.  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

  /* Enable MSI Oscillator */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5;
  RCC_OscInitStruct.MSICalibrationValue=0x00;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);


  /* Select MSI as system clock source and configure the HCLK, PCLK1 and PCLK2 
     clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;  
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

}

void SysTick_Handler(void)
{
  HAL_IncTick();
}

保存好后点左上角的Build,如果不出意外的话应该会编译成功。
Build

接下来再点击它旁边不远处的Download,这样就能把我们写的程序烧写到板子上。

成功之后,点板子上的Reset,这样就能看见我们的LED灯一闪一闪了~

一个LED不过瘾?

然后我连了6个LED灯。做了一个流水灯(跑马灯)的效果。main函数长这样

int main(void) {
    HAL_Init();
    SystemClock_Config();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_Init.Pin = ((uint16_t)0x037BU);   //PB3, PB4, PB5, PB6, PB8, PB9
                                            //D3,  D5,  D4,  D10, D15, D14
    GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init.Pull = GPIO_PULLUP;
    GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOB, &GPIO_Init);

    char i = 3;
    char flag = 0;
    for(;;) {
        HAL_Delay(100);
        if(i == 7) { 
            i = i + (flag == 0 ? 1 : -1);
        }
        if(flag == 0) {
            GPIOB->ODR |= (1u << i);
            i++;
            if(i > 9) {
                i = 9;
                flag = 1;
            }
        } else {
            GPIOB->ODR &= ~(1u << i);
            i--;
            if(i < 3) {
                i = 3;
                flag = 0;
            }
        }
        HAL_Delay(100);
    }

}

效果像这样,我懒就不做GIF或者视频了。
6 LEDs

本页面的全部内容在 CC BY-NC-SA 4.0 协议之条款下提供,附加条款亦可能应用
本文链接:https://www.copperion.com/2019/stm32-dev-0-led/