高中生
最后登录1970-1-1
在线时间 小时
注册时间2020-6-2
|
本帖最后由 忙碌的死龙 于 2023-8-22 17:24 编辑
LubanCat很多人都买了,也有一些人想把这个小板子当做一个便携式小电脑来使用。
既然是当做便携式小电脑,那做嵌入式最常见的stm32单片机开发自然就是一个必备功能了。
具体的编译和调试情况可以看视频。
https://www.bilibili.com/video/B ... 49999e7d90327ffbf7a
LubanCat ZW 是否具备开发stm32单片机的能力呢?要开发和调试stm32单片机,需要具备以下能力:
1、支持stm32的构建系统
2、能运行arm-none-eabi-gcc工具链
3、能运行Openocd或者JlinkGDBServer
4、能远程编辑和调试的代码编辑器(说的就是VSCode)
5、编辑器和GDBServer的中间人(调试插件,负责一键拉起调试和传输数据)
这几样东西,我们一个个来解决
一、构建系统选择
最常见的莫过于stm32cube工具自动生成的makefile项目,这种项目大家接触得最多,使用起来也简单。
但是makefile构建系统很慢,尤其是在鲁班猫这种性能不强的设备上,这是个死穴。
目前越来越多的项目使用了cmake,而stm32-cmake这个github上,star和fork数量都是挺多的。
本次教程就使用这个项目作为试验方案吧。
https://github.com/ObKo/stm32-cmake
先把项目拉到鲁班猫上
- git clone https://github.com/ObKo/stm32-cmake.git
复制代码 然后大概看了一下首页的教程,如果要使用这个工程,需要再另行下载STM32Cube 库,不同的芯片系列对应不同的功能。
由于我手上的板子是stm32f411ce迷你核心板,我需要把STM32CubeF4 库从github上拉下来。
- git clone https://github.com/STMicroelectronics/STM32CubeF4.git
复制代码 然后,需要在.bashrc 里添加一句环境变量配置。
- echo "export STM32_CUBE_F4_PATH="/home/cat/STM32CubeF4"">> .bashrc
复制代码 如果不设置这个环境变量,cmake生成ninja配置的时候是会报错,找不到stm32cube库配置的。
还需要把ninja安装上。ninja是Linux上的一个小型构建系统,CMake配合ninja才能最快(如果有ccache就更好)。
- sudo apt install ninja-build
复制代码 由于系统默认安装的CMake版本可能过低,使用最新的版本安装
- curl <span style="background-color: inherit; font-family: Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; font-size: inherit; color: rgb(18, 18, 18);">-fsSL </span>https://github.com/Kitware/CMake/releases/download/v3.27.3/cmake-3.27.3-linux-aarch64.sh <span style="background-color: inherit; font-family: Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; font-size: inherit; color: rgb(18, 18, 18);">-o install_cmake.sh</span>
复制代码 安装完毕后,第一步就做完了。
二、arm-none-eabi-gcc工具链安装
在官方网址 https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads 上面,可以找到下图这个工具链的下载链接
AArch64 Linux hosted 意思是可以在AArch64架构,Linux系统上运行的工具链
AArch32 bare-metal target (arm-none-eabi) 这个就是我们需要找的arm 32位裸机工具链了(当然这个也能编译RTOS,只是和Linux工具链区分开来)
下载好之后,需要把工具链解压缩到固定的目录里,我习惯把工具链放在/home/cat/.bin/arm-none-eabi/目录下,这样打包用户目录的时候可以把所有配置好的工具也一起打包带走(下次不需要重复安装)。
然后需要在.bashrc里添加这个工具链的PATH
- echo "export PATH=$HOME/.bin/arm-none-eabi/bin:$PATH" >> .bashrc
复制代码 然后就可以找到工具链了。
执行arm-none-eabi-gcc 命令测试的时候,会发现提示缺少libncurses.so.5库文件,需要安装这个库。
- sudo apt install libncurses5
复制代码 安装了这个库,arm-none-eabi-gcc正常运行了,执行arm-none-eabi-gdb的时候,会提示缺少libpython3.8.so.1.0库,需要执行以下命令进行安装,由于这个版本的工具链使用了Python3.8,必须安装它
需要先添加源
- sudo apt install software-properties-common
- sudo add-apt-repository ppa:deadsnakes/ppa
- sudo apt update
复制代码 然后再安装Python3.8
- sudo apt install python3.8
复制代码 安装完毕以后,arm-none-eabi-gdb就可以顺利执行了。
接下来就是安装GDBServer了,由于AArch64的Openocd不大好找,我手上又有Jlink,决定使用Jlink。
三、安装Jlink驱动和相关软件。
在SEGGER官网可以找到Jlink的arm64平台驱动,JLink_Linux_arm64.deb,在电脑上把文件下载下来,然后上传到鲁班猫板子上,使用以下命令安装
- sudo dpkg -i JLink_Linux_V792a_arm64.deb
复制代码 安装完毕就可以插入JLlink测试了,使用这个命令可以测试一下 JLinkGDBServer -if swd -device stm32f411CE
能顺利连接上开发板,这一步也完成了
四、VSCode ssh remote 插件安装和登陆
这一步就很简单了,我记得鲁班猫也是默认开启ssh的,那只需要VSCode上安装好remote ssh插件,然后通过
输入密码后,会在鲁班猫上安装code-server,等待安装完毕就可以连上鲁班猫了。
五、安装cortex-debug插件并配置
在VSCode插件安装界面,搜索cortex-debug并安装,由于我们需要把Jlink插到鲁班猫上进行调试,还需要把cortex-debug插件安装到鲁班猫上。
在cortex-debug插件详情页面可以点击按钮安装,如下图
接下来用VSCode打开第一步下载好的stm32-cmake工程目录,然后在.vscode目录下新建一个文件launch.json,文件内容如下
由于在调试文件里指定了前置指令,需要在在.vscode目录下新建一个文件tasks.json,文件内容如下
到这一步,先不要着急点调试,还有最后的步骤需要完成。
六、完善项目配置并生成ninja构建文件
6.1 修改examples/blinky/CMakeLists.txt文件,在第二行后添加以下内容,强行指定编译器路径
- set (CMAKE_C_COMPILER "/home/cat/.bin/arm-none-eabi/bin/arm-none-eabi-gcc")
- set (CMAKE_CXX_COMPILER "/home/cat/.bin/arm-none-eabi/bin/arm-none-eabi-g++")
- set (CMAKE_ASM_COMPILER "/home/cat/.bin/arm-none-eabi/bin/arm-none-eabi-gcc")
复制代码 6.2 修改examples/blinky/blinky.c文件,把点灯用的GPIO修改成自己手上开发板的IO和分组,GPIO时钟也需要调整,原文件是用systick点灯,现在改成HAL_Delay方式点灯,内容如下
- #if defined STM32L0
- #include <stm32l0xx_hal.h>
- // STM32L0538-Discovery green led - PB4
- #define LED_PORT GPIOB
- #define LED_PIN GPIO_PIN_4
- #define LED_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
- #elif defined STM32F1
- #include <stm32f1xx_hal.h>
- // STM32VL-Discovery green led - PC9
- #define LED_PORT GPIOC
- #define LED_PIN GPIO_PIN_9
- #define LED_PORT_CLK_ENABLE __HAL_RCC_GPIOC_CLK_ENABLE
- #elif defined STM32F4
- #include <stm32f4xx_hal.h>
- // STM32F4-Discovery green led - PD12
- #define LED_PORT GPIOC
- #define LED_PIN GPIO_PIN_13
- #define LED_PORT_CLK_ENABLE __HAL_RCC_GPIOC_CLK_ENABLE
- #endif
- void SysTick_Handler(void)
- {
- HAL_IncTick();
- // // 1 Hz blinking
- // if ((HAL_GetTick() % 500) == 0)
- // {
- // HAL_GPIO_TogglePin(LED_PORT, LED_PIN);
- // }
- }
- void initGPIO()
- {
- GPIO_InitTypeDef GPIO_Config;
- GPIO_Config.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_Config.Pull = GPIO_NOPULL;
- GPIO_Config.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_Config.Pin = LED_PIN;
- LED_PORT_CLK_ENABLE();
- HAL_GPIO_Init(LED_PORT, &GPIO_Config);
- }
- int main(void)
- {
- HAL_Init();
- initGPIO();
- // 1kHz ticks
- HAL_SYSTICK_Config(SystemCoreClock / 1000);
- while(1){
- /* USER CODE END WHILE */
- HAL_GPIO_TogglePin (GPIOC, GPIO_PIN_13);
- HAL_Delay (1000); /* Insert delay 100 ms */
- };
- return 0;
- }
复制代码 6.3 命令行输入以下内容,生成ninja构建文件- cd examples/blinky/ && mkdir build && cd build
复制代码 这段命令是要在examples/blinky/目录里新建一个build目录,并切换到build目录里执行cmake指令生成ninja构建文件。如果要新增c文件,或者增加HAL功能模块依赖的,需要修改CMakeLists.txt文件,并删除build目录,重新生成构建文件。
一切正常的话,就可以看到类似提示,顺利生成ninja构建文件了。
此时就可以直接点击VSCode的Debug小按钮,开启一键编译和调试了。
个人使用起来,感觉跟X86上直接用VSCode编译和调试,流畅度差不多。编译构建的速度也非常快。其实使用stm32cube生成的Makefile工程,基本上也差不多,
只是把launch.json里的cwd字段修改成${workspaceFolder}/build/,然后executable字段的elf文件也修改成对应elf文件即可。
|
|