AIR32F103(三) Linux环境基于标准外设库的项目模板
目录
- AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告
- AIR32F103(二) Linux环境和LibOpenCM3项目模板
- AIR32F103(三) Linux环境基于标准外设库的项目模板
Linux 开发环境
使用的 GCC Arm, st-flash 和 JLink 与前一篇相同, 可以参考前一篇的说明
关于 Air32F103-Template
项目地址: https://gitee.com/iosetting/air32f103-template
这是为 GCC Arm 工具链准备的 AIR32F103x 项目开发模板
项目结构
├── Build # 编译结果
├── Examples # 示例代码
│ ├── FreeRTOS # FreeRTOS示例代码
│ └── NonFreeRTOS # 非FreeRTOS示例代码
├── Libraries
│ ├── AIR32F10xLib # AIR32F103外设层库代码
│ │ ├── inc # .h头文件
│ │ ├── lib
│ │ │ └── cryptlib
│ │ └── src # .c源文件
│ ├── CORE # Coretex M 核心外设层源文件
│ ├── Debug # delay和printf支持
│ ├── DeviceSupport # AIR32F103的gcc arm startup文件
│ │ └── startup
│ │ └── arm-gcc
│ ├── FreeRTOS # FreeRTOS 库代码
│ └── LDScripts # 连接脚本
├── Makefile
├── Misc
│ └── flash.jlink # JLink烧录脚本
├── README.cn.md
├── README.md
├── rules.mk # make规则
└── User # 用户项目代码
快速开始
1. 导出项目
git clone https://github.com/IOsetting/hk32f030m-template.git
2. 根据本地环境修改 Makefile
修改 Makefile 设置, 确保 ARM_TOOCHAIN 和 JLINKEXE(或ST_Flash) 指向正确的路径
##### Project #####
# 项目名称
PROJECT ?= app
# 编译结果目录
BUILD_DIR = Build
##### Options #####
# 是否使用 FreeRTOS, y:yes, n:no
USE_FREERTOS ?= n
# 烧录工具, jlink 或 stlink
FLASH_PROGRM ?= stlink
##### Toolchains #######
# 根据本地环境, 设置工具链路径
ARM_TOOCHAIN ?= /opt/gcc-arm/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin
# st-flash 可执行文件路径
ST_FLASH ?= st-flash
# JLinkExe 可执行文件路径和设备类型
JLINKEXE ?= /opt/SEGGER/JLink/JLinkExe
JLINK_DEVICE ?= STM32F103CB
##### Paths ############
# 当前芯片的连接脚本
LDSCRIPT = Libraries/LDScripts/air32f103cbt6.ld
3. 编译默认项目并烧录
# 清理
make clean
# 编译
make
# 带详细输出的编译
V=1 make
# 烧录
make flash
默认的项目会点亮板载的三个LED
示例代码
示例代码位于 Examples 目录下, 项目中的示例代码几乎都是迁移自合宙的Keil项目中的示例代码, 已经在GCC Arm下运行验证过.
如果需要运行示例代码, 先将 User 目录下的文件清空, 将示例代码复制到 User 目录下, make clean清空, 然后重新编译和烧录.
VSCode 配置文件
c_cpp_properties.json 供参考
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"HK32F030MF4P6"
],
"compilerPath": "/opt/gcc-arm/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc",
"cStandard": "gnu99",
"cppStandard": "gnu++14",
"intelliSenseMode": "gcc-arm",
"configurationProvider": "ms-vscode.makefile-tools"
}
],
"version": 4
}
tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "clean, build",
"type": "shell",
"command": "make clean;make",
"problemMatcher": []
},
{
"label": "build, download",
"type": "shell",
"command": "make;make flash",
"problemMatcher": []
},
{
"label": "build",
"type": "shell",
"command": "make",
"problemMatcher": []
},
{
"label": "clean",
"type": "shell",
"command": "make clean",
"problemMatcher": []
},
]
}
常见问题说明
切换GCC编译器版本, 11.2, 11.3 和 12.2
项目模板测试过的最新的GCC Arm编译器版本为12.2, 对比 11.2 和 11.3, 12.2 编译会带来一些性能提升, 但是检查也更严格, 按11.2和11.3的配置会产生不少warning. 在GCC Arm 12.2编译提示 LOAD segment with RWX permissions 警告 和 GCC Arm 11.3rel1, 12.2编译提示 _close is not implemented and will always fail 中有说明
printf 无法输出浮点数
printf输出浮点数默认是关闭的, 打印浮点无输出. 可以在TGT_LDFLAGS中增加选项 -u _printf_float 开启, 开启后会明显增加二进制程序尺寸.
TGT_LDFLAGS += $(ARCH_FLAGS) -specs=nano.specs -specs=nosys.specs -static -lc -lm \
-u _printf_float \
-Wl,-Map=$(BDIR)/$(PROJECT).map \
-Wl,--gc-sections \
-Wl,--print-memory-usage
开启后, 连接时会检查_getpid(void)和_kill(pid_t pid, int sig)这两个函数是否定义, 如果没定义会报warning.
对FreeRTOS的支持
运行 Examples/FreeRTOS 目录下的例子时, 需要在 Makefile 中开启对 FreeRTOS 的支持, 将需要下面的配置改为y
# Build with FreeRTOS, y:yes, n:no
USE_FREERTOS ?= n
切换不同的MCU型号
Makefile默认配置的是 AIR32F103CBT6 的编译选项, 如果需要切换到CCT6和RPT6, 需要在Makefile中修改两处
# CCT6不用改, RPT6需要修改为 STM32F103RB
JLINK_DEVICE ?= STM32F103CB
...
# 对应的修改为 air32f103cct6.ld 和 air32f103rpt6.ld
LDSCRIPT = Libraries/LDScripts/air32f103cbt6.ld
AIR32F103(三) Linux环境基于标准外设库的项目模板的更多相关文章
- Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- Keil MDK STM32系列(六) 基于抽象外设库HAL的ADC模数转换
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- STM32标准外设库、 HAL库、LL库
工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常用的库,后面的LL库是ST最近才添加,目前支持的 ...
- STM32(1)——使用Keil MDK以及标准外设库创建STM32工程
转载来自:http://emouse.cnblogs.com 1.1 开发工具与开发环境 1. 软件版本 本节所使用Keil MDK 为目前的最新版V4.21.其他版本差别不大,读者可以根据自己使用的 ...
- STM32之HAL库、标准外设库、LL库(STM32 Embedded Software)-(转载)
STM32 Embedded Software 工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是 ...
- STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ.写在前面 上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要内容:I2C协议.模 ...
随机推荐
- UI自动化框架搭建之Python3
UI自动化框架搭建--unittest 使用的代码是Python3版本,与时俱进哈哈 解释一下我的框架目录接口(每个人框架的目录接口不一样,根据实际要求) common目录:公共模块,这个地方可以存放 ...
- 【Java】学习路径61-“伪”枚举类型
public class RolyType { public static final int TEACHER = 0; public static final int STUDENT = 1; pu ...
- ABAQUS和UG许可证冲突问题的解决方案
前段时间重新安装了ABAQUS,更新到了2020版本后,发现NX UG怎么突然打不开了,搜索一下,发现是两个许可证有冲突.找了很多解决方案,主要归纳为以下两种: 方法一:Lmtools修改法 先说结论 ...
- Postman中的Pre-request Scrip详解
Postman中的Pre-request Scrip详解 一.Pre-request Scrip的简介 1.Pre-request Script是在请求发送之前需要执行的代码片段: 2.请求参数中包含 ...
- HDFS 伪分布式环境搭建
HDFS 伪分布式环境搭建 作者:Grey 原文地址: 博客园:HDFS 伪分布式环境搭建 CSDN:HDFS 伪分布式环境搭建 相关软件版本 Hadoop 2.6.5 CentOS 7 Oracle ...
- kingbaseES R6 读写分离集群修改ssh端口案例
数据库环境: test=# select version(); version ------------------------------------------------------------ ...
- Rust-函数
函数结构 函数要点 函数名和变量名使用蛇形命名法(snake case),例如 fn add_two() -> {} 函数的位置可以随便放,Rust 不关心我们在哪里定义了函数,只要有定义即可 ...
- ProxySQL(6):管理后端节点
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9286922.html 配置后端节点前的说明 为了让ProxySQL能够找到后端的MySQL节点,需要将后端的 ...
- 重要参考文档---MySQL 8.0.29 使用yum方式安装,开启navicat远程连接,搭建主从,读写分离(需要使用到ProxySQL,此文不讲述这个)
yum方式安装 echo "删除系统默认或之前可能安装的其他版本的 mysql" for i in $(rpm -qa|grep mysql);do rpm -e $i --nod ...
- Shell分析日志文件
文章转载自:https://mp.weixin.qq.com/s/o63aIM2p9rc2OjhxiC6wgA 1.查看有多少个IP访问: awk '{print $1}' log_file|sort ...