STM32从零开始 - 第二章:LED闪烁程序

概述

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

打开默认项目

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

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

然后点击Finish按钮即可。

找到main函数

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

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

编译项目

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

控制LED灯闪烁

查找控制LED灯的GPIO

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

可以看到,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,这个延时函数可以实现毫秒级的延时

这个延时是基于系统的节拍时钟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如果接反了不会烧毁主板,所以接反了没关系,下载不成功再对调一下即可。

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

工具:使用STM32CubeProgrammer即可

下载步骤:

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

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

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

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

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

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

程序运行效果如下:

STM32程序效果:闪灯

 

典型错误:

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

IDE环境配置

编译输出HEX文件

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

将Intel Hex file这个选择勾上:

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

选择编译Debug/Release版本

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

方法很多,如:

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

或:

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

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

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值