关于使用VS Code开发stm32的一些感想

发布者:omega34最新更新时间:2019-07-31 来源: eefocus关键字:Code  开发  stm32 手机看文章 扫描二维码
随时随地手机看文章

0. 引言

这几天在推【宇宙最强编辑器VS Code】专栏系列文章,不少群聊和文章的留言都是关于使用VS code 进行stm32开发和调试,看到后思绪万千,不知如何回复,决定暂停更新,结合自身的经历写篇文章来回复这个问题。


两年前我还是一个小萌新,老老实实的使用keil-MDK开发,我认识的一个学长在Linux方面非常强,当我第一次见到可以在满屏代码的条件下玩单片机,瞬间颠覆了我的认知,原来开发可以如此炫酷。


我开始接触Linux这个神奇的东西,在电脑上装了Ubuntu16.04,踏上Linux学习之旅,跟着网上诸多的教程搭建Linux下stm32的开发环境,两年多的时间里搭建了不少于5次,每次都要至少花费6-8个小时,结果都以失败告终。


直到上学期学校开设了Linux课程,我才得以系统的学习了Linux基础命令,C语言的编译链接过程,gcc和gdb工具的使用,makefile的编写,另外一方面,由于一直使用stm32做项目,对stm32也比较熟悉,之后我再次折腾了一下,花了不到一个小时的时间就配置好了,很有成就感,整个过程写了博客,公众号,在野火论坛也发帖分享。

回顾整个过程,我有以下几个方面的总结分享,共勉。


1. 关于环境搭建

开发stm32的程序需要使用交叉编译工具链gcc-arm-none-eabi,ARM为三个平台都提供了该工具,可以在其官网下载到:


关于该工具的安装和配置,如果有Linux操作基础,非常简单,只有三步:


下载

解压

配置环境变量

关于该工具的使用,因为是基于gcc的,如果使用gcc开发过c语言程序,使用方法基本相同:


编译得到可执行文件后,可以使用openocd将程序写入单片机运行。


openocd全名叫做Open On-Chip Debugger,是一个自由开放的片上调试工具和编程工具,目前已经发布到0.10.0版本,目前主流调试器几乎都支持,具体可以查看Open On-Chip Debugger:OpenOCD User’s Guide,它的项目托管在sourceforge上,同样支持Windows平台和Linux平台。


下载之后,如果有Linux操作基础,执行其中的安装脚本程序即可。


总结为一句话:如果有Linux操作基础和gcc基础,搭建开发调试环境非常容易,即使没有任何Linux基础,跟着教程也能搭建成功。


2. 难点一 —— 链接文件及链接过程

在日常开发中编译这个词广为人知,但是链接却很少有人了解,这是因为Keil MDK给我们屏蔽了这一过程,导致普遍认知是 —— “源代码编译之后生成可执行文件”。


其实C语言程序,特别像单片机开发中这样文件非常多的,一个固件库就能有几十个c文件,头文件就不说了,都懂,要经历四个过程:


预处理:处理每个C文件中的预处理指令;

编译:将每个文件中翻译为汇编语言;

汇编:将汇编语言翻译成机器码,通常叫.o目标文件,每个c文件对应一个目标文件;

链接:将所有目标文件以及依赖库进行链接,生成可执行文件;

可以看到,最重要的不是编译,因为编译器干的活太简单了,只是针对每个文件进行编译,不受其他影响,但是链接器就不一样了,链接器不仅要顾全大局,而且要默默无闻的干活:


将所有的目标文件进行链接;

需要将启动文件链接在程序最开始,否则运行出错;

链接过程必须要根据链接文件安排;

因为链接过程的复杂性,加上每个单片机的flash和SRAM的大小都不一样,所以链接文件别说自己编写,就是去找现有的,也是一件比较难的事情,当时我是参考了truestudio,直接拿truestudio的链接文件过来用才相对那么容易。


即使有了链接文件,在编译和链接过程中需要带非常多的参数,尤其是链接过程,不是我危言耸听,这些参数错一个就会导致失败:


3. 难点二 —— makefile的编写

stm32的开发都是基于标准库和HAL库的,HAL我暂且没试,拿标准库来说,需要编写makefile文件,构建整个编译关系,这个其实不是太难,理解了makefile的一些自动变量规则和隐含规则后,就很好编写出这个makefile了,在以后的开发中,只需要进行一些简单的修改就可以了:


4.关于VS Code

说了这么多,是该回归正题了,关于要不要使用VS Code开发stm32简述一下个人观点。


VS Code只是一个轻量级编辑器,就像上篇文章中使用VS Code进行C/C++语言开发,我们只是使用了它的编辑器功能而已,随便写一个小程序很方便,但是程序稍微复杂点的话,重点还是makefile如何编写,VS Code只是调用执行一下make命令而已。


同样,使用VS Code开发stm32,重点还是在环境搭建,链接文件,makefile文件上,我个人认为,如果对gcc和makefile这些很熟悉了,想要追求更高的效率,可以折腾一下玩玩,如果Linux还没有入门,不值得花费大把大把的时间再去折腾了,老老实实用MDK吧,不要本末倒置,你的初衷是学习单片机。


当然如果实在想折腾一下,那就折腾一下吧,尽管花费了大量的时间,但是会学到非常非常多的知识,在后续进行嵌入式Linux的开发会有非常大的帮助,折腾一番后,对于单片机的开发就如庖丁解牛一般~

关键字:Code  开发  stm32 引用地址:关于使用VS Code开发stm32的一些感想

上一篇:STM32之三标准外设版USB驱动库详解(架构+文件+函数+使用说明
下一篇:STM32 之六 USB IP(USB模块)、官方驱动版本 详解

推荐阅读最新更新时间:2024-11-13 20:39

京瓷新开发出0.635mm间距电路板对电路板连接器“5689系列”
京瓷连接器制品株式会社(以下简称“京瓷连接器”)日前开发出用于FA设备以及计测设备并具有高度可靠性的0.635mm间距电路板对电路板连接器“5689系列”。 0.635mm间距电路板对电路板连接器“5689系列” 以伺服驱动器、PLC为代表的FA设备、计测设备等产业用设备以及车载用设备需要具备在振动等严酷条件下也能稳定,安全工作的性能。因此,所使用的连接器也要求具有高度的接触可靠性。 京瓷连接器此次新开发的5689系列产品是间距0.635mm、嵌合高度8.0mm、并且能够将电路板与电路板进行平行连接的垂直式连接器。 产品采用在嵌合状态下可以向XY方向移动正负0.5mm的滑动构造,提高了连接后的稳定性。 此
[模拟电子]
京瓷新<font color='red'>开发</font>出0.635mm间距电路板对电路板连接器“5689系列”
OK6410开发板uboot烧写
uboot的移植完成以后,满以为很快能烧写到板子上并安装linux,结果uboot烧写了三天才终于成功,这其中碰到了不少的问题,在此做个总结。 首先,飞凌的OK6410开发板并不支持JLink烧写uboot,只能通过SD卡来烧写,这一点我事先并不知道,他们网店介绍里并未说明,而且销售人员也没有做出任何提示,结果我花了整整一天时间尝试所有通过JLink烧写uboot的可能方法,结合网上个别人反映,最终意识到通过JLink完成uboot烧写是不可能成功的了,后来在销售人员那里确认了这一点,对飞凌表示不满。 当时买板的时候没有买SD卡,因为感觉没什么用,就想给老板省点钱,现在没SD卡不行了,但在寻找JLink烧写uboot方法的过程中我
[单片机]
stm32 IAR环境printf函数调用
在串口都配置好的情况下,在main.c文件中加入 #include stdio.h #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { USART_SendData(EVAL_COM1, (uint8_t) ch); while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
[单片机]
STM32——利用STM32CubeMX来点亮GPIO口的led
GPIO口的 LED 点亮(以STM32F407IGTb芯片为例 ) 1、掌握的GPIO口的使用方法 2、熟悉Keil uVision5工具软件的使用 原理: 只要是对硬件操作,就要首先查看原理图。 查看外设是给模块的MCU的哪个引脚相连。 FS-STM32F407开发平台上的LED的亮灭状态,与芯片上的引脚I/O输出电平有关。 FS-STM32F407开发平台上LED的I/O扩展: IO操作重要结构体:GPIO_InitTypeDef typedef struct { uint32_t Pin; 操作的管脚 uint32_t Mode; 模式选择 uint32_t Pull;
[单片机]
<font color='red'>STM32</font>——利用STM32CubeMX来点亮GPIO口的led
关于STM32能否使用malloc申请动态内存的问题
首先,malloc( )属于标准C语言函数,当然可以在单片机上使用,如STM32可以先在启动文件中设置heap的大小,再使用动态内存分配: Heap_Size EQU 0x00000200 \也就是 512字节; 但是一般单片机的内存都比较小,而且没有MMU,malloc 与free的使用容易造成内存碎片。而且可能因为空间不足而分配失败,从而导致系统崩溃,因此应该慎用,或者自己实现内存管理。 以下摘自网络: 在函数中使用malloc,如果是大的内存分配, 而且malloc与free的次数也不是特别频繁,使用malloc与free是比较合适的, 但是如果内存分配比较小,而且次数特别频繁,那么使用mall
[单片机]
英飞凌主导并协调大型研究项目,为高度自动化联网汽车开发超级计算机
【2023 年 04 月 11日,德国慕尼黑讯】 英飞凌科技股份公司表示,内置在汽车中的高性能计算机,能够尽可能快速、可靠地处理所有可用的数据和信息,以便车辆能够安全地行驶,这是自动化联网汽车的关键所在 。曼海姆-CeCaS研究项目的宗旨就是要开发相应的车用超级计算平台。该项目由来自业内和高校的 30 家研究合作伙伴共同参与,并且已被德国联邦政府纳入旨在推动汽车与移动出行行业实现数字化转型的大规模资助计划之中。整个项目由英飞凌负责领导和协调。近日,各方代表齐聚英飞凌慕尼黑总部 Campeon 大楼,出席了项目启动仪式。 英飞凌科技汽车电子事业部总裁 Peter Schiefer 表示:“驾驶辅助系统如此广受欢迎,意味着
[物联网]
英飞凌主导并协调大型研究项目,为高度自动化联网汽车<font color='red'>开发</font>超级计算机
STM32基础知识4-va_list原理及用法
VA_LIST 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。 下面是va_list的用法示例 : #include stdarg.h int AveInt(int,...); void main() { printf( %d/t ,AveInt(2,2,3)); printf( %d/t ,AveInt(4,2,4,6,8)); return; } int AveInt(int v,...) { int ReturnValue=0;
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved