概述
这一章中,我们基于之前用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即可
下载步骤:
- 在工具开启后,右侧连接方式选择UART(1),将CH341插入到PC的USB口上,点击刷新(2), 然后选择对应的串口号(3),然后点击Connect(4)
CH341的串口号,通过设备管理器可以查看到,下图显示的是:COM15.
- 点击Connect后再Log区域能看到连接日志,如果不对,可以对主板重新上电重试。
- 成功连接后工具会自动读出FLASH中的数据,不用理睬它。
- 选择左侧的Erase & Programming页,可以进入下载页面:
- 在下载页面里,选择要下载的程序,可以选择elf文件
你可能会发现,当你选择elf或hex类型的文件时,不需要设置Start address,而选择bin文件则需要设置Start address。这是因为:ELF文件及HEX文件中已经携带了程序文件的地址信息,而BIN文件则是纯粹的机器语言程序,里面是没有地址信息的,必需我们告诉下载程序将它下载到FLASH的哪个位置去才能正常运行,上图右侧就是FLASH的扇区信息,可以看到FLASH的起始地址是0x08000000,通常我们默认编出来的程序烧录的起始地址就是FLASH的起始地址0x08000000了。
当然,FLASH里如果已经有了一个系统(如:Arduino),就需要根据系统的要求将程序烧到指定位置了,此处按住不表。
- 按上图设置号选项后,点击Start Programming开始烧录,完成后会弹出提示框
- 在Log区域里也能看到烧录信息:
- 烧录完成后,将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版本。