笔者做嵌入式开发的,主要用到linux系统来做开发,有时候遇到既要开发arm linux,又要挂载MCU的情况(主要是STM32这款),这两个芯片跨平台,指令不兼容。以前开发STM32是在windows下的IDE,使用keil或者IAR来开发,自从搞arm linux以来,很少开windows系统,两个系统切来切去着实麻烦。这篇文章主要针对长期使用Linux系统的用户,有什么不对的地方,欢迎指正。
接下教教大家怎么在linux下部署STM32开发环境
首先安装一个stm32cubemx,该软件可以在st官网下载,要注册账号,还要搞邮件的乱七八糟的步骤就不说了,自行解决
下载下来的文件中就用到下面两个文件
SetupSTM32CubeMX-4.23.0.exe
SetupSTM32CubeMX-4.23.0.linux
顺便提一下,cubemx是用java编写的,安装需要较新的java环境,这个问题读者自行解决
命令行下运行SetupSTM32CubeMX-4.23.0.linux,也可以鼠标双击,但是命令行更有逼格一些,推荐使用
安装完之后/home下面有个STM32CubeMX文件夹,打开文件夹,双击图中可执行文件
选择芯片型号,就选一个stm32f103c8的芯片好了,不嫌累可以在右下方的型号表里面翻,也可以从左上角的搜索框直接查找。
确认型号后点start project开启一个工程
打开新世界的大门后是这样一个界面,推荐把PD0,PD1,PC14,PC15设置为RCC管脚,接外部晶振,并在左边RCC选项下打开。接着点上乱七八糟的管脚配置,笔者比较喜欢勾选上freertos操作系统
时钟配置为外部时钟,倍频到72Mhz
NVIC DMA等看情况配置,都不傻,瞎配着多踩几下坑就会了,就不啰嗦了
点击这个齿轮生成工程,并选择生成makefile版本的工程,工具链暂时先按默认处理吧,后面再讲讲工具链怎么搞
你以为这就搞好了吗,嘿嘿,STM32cubeMX还有点bug,生成工程的时候有几条是重复的,如果不管会导致编译出错的,比如图中选中的部分,75行和108行是一样的,要手动把Makefile重复的部分删掉一个
--------------------------------------------------
接下来配置一下交叉工具链,STM32的交叉工具链是arm-none-eabi-
可以从 https://launchpad.net/gcc-arm-embedded/+download
下载工具链,笔者比较喜欢下载源码自己编译,但是这里一不小心下载成bin文件了,没关系,可以运行就好。需要折腾的选择src版本自行编译。
找到工具链位置,export 一下。或者打开STM32cubeMX,点击load project,打开之前生成工程的.ioc文件,在生成工程时指定工具链位置
或者简单粗暴一点,在makefile里面直接指定路径
之后make 一下,生成hex和bin,没问题~~~~~~oh yeah
----------------------------------------------------------
接下来安装stlink驱动。
准备工作,先装上libusb
sudo apt-get install libusb-dev
sudo apt-get install libusb-1.0-0-dev
获取源码
git clone https://github.com/texane/stlink
编译方法参考https://github.com/texane/stlink/blob/master/doc/compiling.md
编译安装完成后,./st-flash erase 擦一擦芯片试试
makefile里面加上一段
#---------------------------- write to mcu -----------------------------#
flash:
st-flash write build/$(TARGET).bin 0x8000000
使用命令make flash就能下载程序到MCU里面去了
需要jlink来调试的,到http://www.segger.com/jlink-software.html下载linux版本安装包,具体用法我就告诉你,这道题太难了,我不会做,不会做,读者自行解决,有好的教程也可以分享给我。
后面还有仿真之类的乱七八糟的,就呵呵了,不会配也很少用。
在这里可以教大家一个debug技巧,重定向一下printf函数,这里需要敲一下黑板,在keil下,printf的底层是fputc函数实现的,但gnu下面是_write函数,注意不要搞错了。
//gnu下用此函数重定向printf
int _write (int fd, char *pBuffer, int size)
{
int i;
for (i = 0; i < size; i++)
{
while((USART1->SR&0X40)==0);//等待上一次串口数据发送完成
USART1->DR = (uint8_t) pBuffer[i]; //写DR,串口1将发送数据
}
return size;
}
//end
最后喜欢写寄存器代码的,可以参考我的开源代码,我就不喜欢ST的库,函数名老是变来变去的,今年写的代码明年不能编译,蛋蛋受不了
上一篇:STM32实现串口下载
下一篇:STM32高级开发(15)-使用eclipse开发STM32
推荐阅读最新更新时间:2024-11-12 18:12