概述

这一章中,我们基于之前用STM32CubeMX产生的项目,使用STM32CubeIDE环境来开发一个LED闪灯的简单程序。

打开默认项目

先打开STM32CubeIDE,选择File -> Open Projects from File System:

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_stm32

点击Dirctory选择之前用STM32CubeMX产生的工程目录。

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_嵌入式_02

然后点击Finish按钮即可。

找到main函数

在左侧的项目浏览窗口中,找到刚刚打开的项目,在src/main.c中能找到main函数入口。

main函数是C语言的入口函数,至于main之前所做的事情,有兴趣的可以自行去跟踪。

编译项目

在项目上右键选择Build Project即可开始编译项目。

控制LED灯闪烁

查找控制LED灯的GPIO

在开发板的电路图上找到LED灯的线路:

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_main函数_03

可以看到,LED0的控制引脚是PC13,当PC13输出低电平时灯点亮,当PC13输出高时灯熄灭。

添加GPIO初始化代码

在main函数前面添加下面的代码

static void led_init(void)
{
	// PC13 is LED control PIN
	GPIO_InitTypeDef gpiodef;

	gpiodef.Pin = GPIO_PIN_13;
	gpiodef.Mode = GPIO_MODE_OUTPUT_PP;
	gpiodef.Speed = GPIO_SPEED_FREQ_HIGH;

	HAL_GPIO_Init(GPIOC, &gpiodef);
}

添加LED控制接口

在main函数前面添加下面的代码

static void led_onoff(int onoff)
{
	if (onoff)
	{
		// PC13 = HIGH
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
	}
	else
	{
		// PC13 = LOW
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
	}
}

延时功能

在stm32f1xx_hal.c文件里,已经有一个延时函数:HAL_Delay,这个延时函数可以实现毫秒级的延时

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_main函数_04

这个延时是基于系统的节拍时钟Tick计时器来实现的,有兴趣的可以去百度查阅Tick时钟相关的内容。

既然有了现成的接口,我们就不用再费劲去自己造轮子了,至少这个接口目前阶段够我们用了。

实现LED闪烁

在main函数的while(1)循环前加入led初始化代码,在while循环里加入闪烁的代码即可:

/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  led_init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

	  led_onoff(1);
	  HAL_Delay(500);
	  led_onoff(0);
	  HAL_Delay(500);

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

所谓闪烁,其实就是控制LED灯间歇性的点亮和熄灭反复循环即可。

然后再次编译,如果有语法错误,根据语法错误排查即可。

用串口下载程序

供电:将CH341的USB转串口线拿出,将电平选择为3.3V,然后就可以直接用串口线给开发板供电了。

串口:将CH341串口端的Rx/Tx分别连接STM32开发板上的PA9/PA10。另外,Rx/Tx如果接反了不会烧毁主板,所以接反了没关系,下载不成功再对调一下即可。

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_STM32CUBEMXLED灯闪烁_05

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_单片机_06

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_STM32CUBEMXLED灯闪烁_07

跳线:主板上需要将BOOT0和3V用跳线帽短接起来,这样上电后STM32会进入串口bootloader中以支持下载固件(下图的跳线帽是不对的,要将跳线帽改成红色标记那样才能进下载模式)。

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_stm32_08

工具:使用STM32CubeProgrammer即可

下载步骤:

  1. 在工具开启后,右侧连接方式选择UART(1),将CH341插入到PC的USB口上,点击刷新(2), 然后选择对应的串口号(3),然后点击Connect(4)

CH341的串口号,通过设备管理器可以查看到,下图显示的是:COM15.

  1. 点击Connect后再Log区域能看到连接日志,如果不对,可以对主板重新上电重试。
  2. 成功连接后工具会自动读出FLASH中的数据,不用理睬它。
  3. 选择左侧的Erase & Programming页,可以进入下载页面:
  4. 在下载页面里,选择要下载的程序,可以选择elf文件

你可能会发现,当你选择elf或hex类型的文件时,不需要设置Start address,而选择bin文件则需要设置Start address。这是因为:ELF文件及HEX文件中已经携带了程序文件的地址信息,而BIN文件则是纯粹的机器语言程序,里面是没有地址信息的,必需我们告诉下载程序将它下载到FLASH的哪个位置去才能正常运行,上图右侧就是FLASH的扇区信息,可以看到FLASH的起始地址是0x08000000,通常我们默认编出来的程序烧录的起始地址就是FLASH的起始地址0x08000000了。

当然,FLASH里如果已经有了一个系统(如:Arduino),就需要根据系统的要求将程序烧到指定位置了,此处按住不表。

  1. 按上图设置号选项后,点击Start Programming开始烧录,完成后会弹出提示框
  2. 在Log区域里也能看到烧录信息:
  3. 烧录完成后,将STM32CubeProgrammer工具关掉,然后断开供电,将BOOT0与GND用跳线帽短接,再次上电后就是运行的刚刚烧录进去的程序了。

程序运行效果如下:


STM32程序效果:闪灯


 

典型错误:

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_main函数_09

此错误可能需要检查STM32开发板的BOOT0是否没有上拉到3V3.

IDE环境配置

编译输出HEX文件

在项目上右键点击 - 选择Properties,然后选择 C/C++ Build -> Settings -> MCU Post build outputs

将Intel Hex file这个选择勾上:

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_嵌入式_10

Apply and close后,再次编译项目即可得到HEX文件,位于项目的Debug目录下:

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_单片机_11

选择编译Debug/Release版本

上面我们看到编译的东西在Debug版本里,因为项目默认编译的是Debug配置,我们正式发布产品是需要编译Release版本的,通常Release版本具备更高的优化级别以及去掉了一些调试及日志相关的功能,IDE本身支持编译Debug或Release版本的切换,类似VisualStudio那样。

方法很多,如:

项目右键 -> Build Configurations -> Set Active -> Release

或:

选择菜单 Project -> Build Configurations -> Set Active -> Release

或者在Build时直接点击Build图标右侧三角形选择Release即可:

STM32CUBEMXLED灯闪烁 stm32灯闪烁程序_main函数_12

上图的小锤子就是Build图标,直接点击这个小锤子就能编译,点小锤子旁边的箭头则可以选择编译Debug或Release版本。