🗒️优雅の嵌入式开发
00 分钟
2023-12-23
2024-1-17
type
status
date
slug
summary
tags
category
password
icon
在大一入门学习51单片机时,采用keil4 C51对8051单片机编程使用,作为一个老牌的集成单片机开发环境,十分方便使用。包括后期学习STM32单片机,从Keil4 C51更换到keil5 MDK,国内许多做嵌入式开发培训的如野火,正点等都是基于Keil MDK来学习STM32,这使得大多数做STM32开发的大多使用Keil。另一方面,Keil可以用作许多单片机的开发,作为被ARM收购的集成开发IDE,大多数基于ARM Cortex-M内核的单片机都可以用Keil来做开发,直到现在,Keil仍然属于ARM。
notion image
 
keil作为业界知名的IDE,其操作简单,上手容易,调试功能强大。在学习初期就可以很快的入手,各个单片机厂商在自己制作集成开发环境的同时,也会提供Keil对于芯片的支持包,厂商所提供的例程中也基本上都有Keil所写的例程。这样即使是在切换不同的单片机时,也能快速的收悉开发环境,进入开发流程。
 
notion image
在国内,在大多数的开发还是基于STM32来进行开发,但在疫情期间,STM32的交期不能保证,在我的大一大二期间,央视就曾报道过STM32F103价格翻了数十倍。即使如此,国内大多数厂家还是采用基于STM32来开发产品。大多数工作中所使用的仍然是STM32。
notion image
但对于本人来说实际上使用Keil来编写程序,是一种非常不舒服的一种感觉,上世纪的UI及不算智能的代码补全,使得我在开始学习STM32时,就怀念写Python时所用的Pycham,极为舒服的UI、字体、代码补全、强大的插件功能。在参加电赛时,使用Ti家的CSS时,发现ST也有自家所出的CubeIDE,配合HAL库开发也很舒服。但还不够称作为优雅,此后看到了稚晖君了文章【优雅の嵌入式开发】,才开始配置CLion用作STM32的开发。
 
此后,在CubeMx的更新下,Toolchain/IDE逐渐只剩下了四个选项。
  • EWARM
  • MDK-ARM
  • STM32CubeIDE
  • MakeFile
不能继续选择稚晖君所选择的SW4STM32,是一种基于Eclipse的STM32集成开发环境,此后ST官方也不再支持对SW4STM32,而是这四种开发环境。CubeIDE作为ST官方的工具,自然不能被官方所舍弃,而IAR和MDK作为老牌的IDE,拥有大量的用户基础,自然也要支持。Makefile作为一种不依赖IDE的方式,自然也被支持。实际上,选择CubeIDE就导出了支持CMake的方式,在配置好相关的开发环境后,直接通过CLion来打开CubeMXh导出的文件夹就可以编译单片机程序。甚至在新版的CLion中,可以配置IAR的编译环境。这样,我们就可以编译除了MDK之外的单片机程序。
 

关于环境

CLion 支持与 GCC 或 IAR 工具链兼容的任何硬件的嵌入式开发
实际上Jetbrains在Clion的官方教程中就告诉了我们配置不同MCU的方式,对于 STM32 MCU 和板,CLion 与 STM32CubeMX 集成。您可以创建并打开.ioc项目,并将它们自动转换为CMake。请注意,目前不支持某些 STM32 芯片。
我们选择Windows (mingw-w64-i686) hosted cross toolchains下的压缩包,解压后将bin文件夹配置到环境变量中,重启生效通过终端查看版本信息,若正常输出,则安装成功。
 
CubeMX生成的CLion项目采用CMake管理项目,我们确定需要配置MinGW和CMake,关于MinGW、CMake,实际上在最新版本的CLion中已经内置捆绑,我们只需要配置一下ARM交叉编译环境的环境变量就可以完成Clion对于STM32开发环境的配置。
配置C编译器和C++编译器为arm-none-eabi-gcc.exe和arm-none-eabi-g++.exe
配置C编译器和C++编译器为arm-none-eabi-gcc.exe和arm-none-eabi-g++.exe
同时我们配置上关于OpenOCD和CubeMX的环境,OpenOCD用于调试下载,CubeMx用于项目生成,同时将RTOS集成使能。
notion image

关于项目创建

ST官方已经不在推荐使用标准库进行开发,非常推荐使用HAL库进行开发,Clion关于使用CubeMX项目有两种方式,一种是使用Clion新建界面创建STM32CubeMX项目,另一种是直接打开CubeMX生成的文件夹,CLion 将自动生成 CMake 项目结构。注意:文件名不要含特殊字符!
通过CLion创建STM32项目
通过CLion创建STM32项目
使用Clion新建项目较为麻烦,需要更改单片机型号并中手动提供名称并覆盖项目。我想对更推荐使用CubeMx直接生成STMCubeIDE项目文件夹后,直接使用CLion打开文件夹,
打开CubeMx生成的项目
打开CubeMx生成的项目
创建项目后返回Clion,CLion会自动刷新CMake项目,此时点击编译小锤子 构建固件,成功后会显示Memory region信息,cmake-build-debug会生成相应的中间编译文件和所生成的.hex.bin、.elf文件
 

调试烧录

在Keil中调试是个很简单的事情,而在CubeMx中,我们需要借助外部的GDB调试工具,如OpenOCD,此外,常用于嵌入式开发的还有PyOCD。在左上角添加openocd的相关配置,并自己编写面板配置文件。CLion支持使用OpenOn-Chip调试器进行调试。使用新的运行/调试配置模板,“OpenOCD 下载和运行 (OpenOCD Download and Run)” 来调试微控制器。
notion image
在这里我们需要新建cfg文件,用于openocd的连接与调试,更多关于OpenOCD的命令可以查看OpenOCD的相关文档来进行编写cfg文件。
采用daplink调试stm32f1x。
采用stlink调试stm32f4x。
 
 

串口重定向

关于printf重定向,新建文件retarget.h和retarget.c
 
 
同时将syscalls.c文件里面重复的几个函数删掉即可,在main函数的初始化代码中添加对头文件的引用并注册重定向的串口号。
对于无法正常读取浮点数,修改CMakeList.txt,加入下述编译选项。
 

编译C++

许多优秀的C程序员会使用函数指针,结构体来编写一些OOP思想的代码,这极大的提高了C编写大型软件的能力,国产Rt-Thread就采用面向对象的思维的进行设计,使用oop思想提高了可重用性和扩展性,增加新的对象类别很容易,只需要继承通用对象的属性再加少量扩展即可,同时提供统一的对象操作方式,简化了各种具体对象的操作,提高了系统的可靠性。
notion image
而在C++中,天然的支持OOP思想,同时支持模板,STL库等特性。能显著的改善代码质量,提高代码可读性。缩减大量的C代码来实现相同的功能,在单片机的C++中,所使用的大多数是C with Class,尽管这没有用到C++的一些优秀的特性,但对于传统的C语言通过函数指针,结构体来实现,代码可读性大大提高,一些优秀的C程序员采用函数指针就实现了C++的特性,让我们为高手点赞,但对于一些内功功底薄弱的韭菜单片机工程师而言,一大堆的函数指针简直就是灾难。大大的减小了代码的可读性。而C++使用语言的自身OOP特性,优雅的消灭所有的函数指针。
作为一名开发人员,优秀的编程思想大于语法糖,但好的语法糖可以让你更好的领率到编程思想。
我通过在main函数中调用C++函数将运行带入到C++的世界。
 
在Main()中我们编写一些具有OOP的C++代码。
 
对于CMakeList.txt,我们只需略微修改,添加源码目录和include文件夹的路径。同时注意在c++文件中只能引用具有#ifdef _cplusplus的头文件,不要直接引用HAL文件。
而对于Main函数的头文件,稚辉君是这样写的。
对于C++,如果你是个人开发代码,并且对个人C++水平有信心,那么用C++当然没有问题。但是考虑到整体程序员群体的C++水平以及C语言水平,用C做嵌入式项目会更现实一些。并且在可预见的未来,C仍然是单片机开发的主力军。
 

IAR工具链

CLion不仅仅支持Arm交叉编译环境,还在最先的CLion中支持了IAR编译器/工具链,使用IAR工具链的项目可以成功加载并在 CLion 中运行。
notion image
 

CMake

事实上,在Clion打开CubeMX 生成的.ioc文件作为项目,CLion 会自动创建一个 CMake 项目结构。我们只需要根据生成的CMakeList.txt进行稍微的修改。
我们需要增加修改头文件的搜索路径。
同时添加源文件的相对路径。
使用通配符可以减小cmakelist.txt文件的大小。对于一些其他配置,在cmakelist.txt都有详细的注释,可以根据注释进行修改。

评论
  • Twikoo
  • GitTalk