HK32F030MF4P6的Linux GCC工具链和VSCode开发环境
HK32F030MF4P6简介


航顺的 HK32F030MF4P6, TSSOP20封装, Arm Cortex M0 内核, 内建32MHz时钟, 16K Flash, 2K RAM(实际上可用的有4K).
这个型号的目的应该是硬件替换 STM8S003, 管脚和 STM8S003 兼容(和 STM32F030 兼容的型号是 HK32F030F4P6). HK32F030MF4P6 可能是当前市场上最便宜的 Cortex M0 芯片了, 单价0.9元不到. 一个32位的Arm M0芯片, 烧录能用普通编程器, 参数也还可以, 常用的外设I2C, SPI, UART, PWM, ADC都有, 甚至还有I2S, 性价比相当不错.
合宙也在放风要出1元的M0, 配置4K RAM, 256K Flash, M0这个级别很快就会进入一元的市场, 8bit系列按现在的价格, 如果不降到比M0低, 可能只剩下存量项目和教学用途了.
项目模板地址:
- GitHub: https://github.com/IOsetting/hk32f030m-template
- Gitee: https://gitee.com/iosetting/hk32f030m-template
相关资料下载:
- HK32F030Mxx系列开发资料 下载地址 https://ifxz.lanzoui.com/b015xbcoh 密码:fqnv
- 航顺MCU相关软件 下载地址 https://ifxz.lanzoui.com/b015ynwri 密码:ajnh
相关链接
- CMake项目 https://github.com/monoliths-uni/HK32F030MXX_CMAKE_PRO
- Nerd Ralph 对 HK32F030MF4P6 的hack记录
- JLink 设备支持 https://wiki.segger.com/HK32F030xx
- 国产替代 MCU 踩坑记 https://xw.qq.com/cmsid/20210402A015N900
HK32F030MF4P6 的外设库
对比 HK32F030M 的外设库和 STM32F0xx_StdPeriph_Lib_V1.5.0, 格式几乎是照抄的, 定义前者比后者有一些缩水而已, 因为端口和功能上确实少一些. 所以熟悉 STM32F0 的人很容易上手. 相比较之前介绍的华大 HC32 系列, HC32 这个系列就有很明显的 STC 寄存器风格, 和 STM 不是一条路线.
Linux GCC Arm Embedded 开发环境
Windows下的开发环境已经有很多资料了, 前面的资料下载里有很详细的文档. 这里主要介绍一下 Linux (再准确点, Ubuntu) 下的开发环境. 以下介绍 HK32F030MF4P6 这个芯片使用 Linux GCC Arm Embedded 工具链的开发环境.
硬件环境
- 带 HK32F030MF4P6 的开发板. 这个芯片不需要外围元件, 直接用 TSSOP20 转接板接出即可
- JLink OB, 最常见最便宜的那种 JLink 烧录器
JLink接线
## JLINK
VCC -> #9 VCC
GND -> #7 GND
CLK -> #11
SWD -> #2
软件环境
烧录软件 JLink
JLink7.70 已经内建对 HK32F030M 系列的支持, 安装后直接可用
GCC ARM工具链
在GCC ARM网站下载工具链接https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads, 解压到合适的目录
tar xvf gcc-arm-11.2-2022.02-x86_64-arm-none-eabi.tar.xz
cd /opt/gcc-arm/
sudo mv ~/Backup/linux/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/ .
sudo chown -R root:root gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/
检查版本
/opt/gcc-arm/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 11.2.1 20220111
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
HK32F030M外设库
从 https://bbs.21ic.com/icview-3236132-1-1.html 下载, 需要其中的外设库.
示例项目导出和编译
导出项目
git clone https://github.com/IOsetting/hk32f030m-template.git
将下载的外设库放到 Libraries/HK32F030M_Driver 目录下
根据自己的环境参数修改 Makefile
PROJECT ?= app
# path to gcc arm (or should be specified in PATH)
ARM_TOOCHAIN ?= /opt/gcc-arm/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin
# path to JLinkExe (or should be specified in PATH)
JLINKEXE ?= /opt/SEGGER/JLink/JLinkExe
# MCU type: HK32F030MD4P6, HK32F030MF4U6, HK32F030MF4P6 or HK32F030MJ4M6
DEVICE ?= HK32F030MF4P6
# The path for generated files
BUILD_DIR = Build
项目中带了一个LED Blink的演示, 接线
## LED
LED1 -> #18 PD1
LED2 -> #17 PC7
LED3 -> #6 PA2
编译
make clean
make
烧录
make flash
项目模板目录结构
项目模板结构
├── Build # 编译结果文件目录
├── Examples # 示例代码
├── flash.jlink # JLink 下载脚本
├── Libraries
│ ├── CMSIS
│ ├── Debug # SysTick 延时函数, printf 支持
│ ├── HK32F030M_Driver # MCU 外设库
│ └── LDScripts
├── LICENSE
├── Makefile # Make 配置
├── README.md
├── rules.mk # Makefile 预设的编译规则
└── User # 用户应用代码
其中并未包含外设库, 和STM32的太像了, 放上去感觉不妥, 怕有版权问题, 还是删掉了. 自己下载也很方便.
编译参数
rules.mk 中, 预设的包含文件和目录为
# C source folders
CDIRS := User \
Libraries/CMSIS/HK32F030M/Source \
Libraries/HK32F030M_Driver/src \
Libraries/Debug
# C source files (if there are any single ones)
CFILES :=
# ASM source folders
ADIRS := User
# ASM single files
AFILES := Libraries/CMSIS/HK32F030M/Source/startup_hk32f030mf4p6.s
# Include paths
INCLUDES := Libraries/CMSIS/CM0/Core \
Libraries/CMSIS/HK32F030M/Include \
Libraries/HK32F030M_Driver/inc \
Libraries/Debug \
User
其中 CDIRS, ADIRS, INCLUDES 对应的都是目录, CFILES 和 AFILES 对应的是单独的源文件.
如果引入其它的库或者源文件, 对应修改这部分即可.
编译参数如下所示
# Global compile flags
CFLAGS = -Wall -ggdb -ffunction-sections -fdata-sections
ASFLAGS = -g -Wa,--warn
# Arch and target specified flags
OPT ?= -Os
CSTD ?= -std=c99
ARCH_FLAGS := -fno-common -mcpu=cortex-m0 -mthumb
### c flags ###
TGT_CFLAGS += $(ARCH_FLAGS) $(addprefix -D, $(LIB_FLAGS))
### asm flags ###
TGT_ASFLAGS += $(ARCH_FLAGS)
### ld flags ###
TGT_LDFLAGS += --specs=nosys.specs -mcpu=cortex-m0 -mthumb -Wl,--gc-sections -Wl,-Map=$(BDIR)/$(PROJECT).map -Wl,--print-memory-usage
# Use newlib-nano instead of newlib for smaller flash size
TGT_LDFLAGS += --specs=nano.specs
# Exclude standard initialization actions, when __libc_init_array exists, this should be omit, \
otherwise it will generate "undefined reference to `_init'" error. \
**Remove** `bl __libc_init_array` from startup.s if you want to enable this.
# TGT_LDFLAGS += -nostartfiles
因为使用了__libc_init_array, 默认不使用-nostartfiles, 如果取消注释, 需要到 startup_hk32f030mf4p6.s 中删除这行, 否则会报错.
bl __libc_init_array
Startup 和 LD 代码
startup_hk32f030mf4p6.s 移植自 STM32F0 的 startup 代码, 没有什么特别的, 中断向量和手册是一致的. LD文件中
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 4K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K
}
内存大小在手册上写的是2KB, 但是实际可用的有4KB, 这里根据实际的内存大小将内存设成了 4K. 如果实际的规格有变化, 需要将其改回2K.
预声明的堆栈
_Min_Heap_Size = 0x200; /* required amount of heap: 512 bytes */
_Min_Stack_Size = 0x400; /* required amount of stack: 1024 bytes */
...
/* User_heap_stack section, used to check that there is enough RAM left */
._user_heap_stack :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >RAM
这里预声明了 512 Byte的堆和 1024 Byte的栈, 所以编译的结果, 显示的内存占用是一定大于1.5KB的, 如果希望增加或缩小, 在这里调整
示例代码
模板中 Examples 目录下面是一些示例代码
├── ADC
│ ├── ADC_Interrupt_Continous
│ └── ADC_Single
├── GPIO
│ └── LED_Blink
├── I2S
│ └── I2S_Audio_TX
├── SPI
│ └── MAX7219_8x8LED
├── TIM
│ ├── Advanced_Timer
│ ├── Basic_Timer
│ └── PWM_Complementary_Output
└── USART
└── UART_TxRx
除了 I2S 的代码, 其它都移植自官方的参考示例. 使用时, 将 User 目录下的代码删除, 将示例下的代码复制到 User 目录, 编译烧录即可.
I2S 音频输出演示
B站视频"航顺HK32F030MF4P6 I2S驱动MAX98357播放8k 8bit语音效果演示", 地址 https://www.bilibili.com/video/BV1AP411G7kf
HK32F030MF4P6的Linux GCC工具链和VSCode开发环境的更多相关文章
- HC32L110(三) HC32L110的GCC工具链和VSCode开发环境
目录 HC32L110(一) HC32L110芯片介绍和Win10下的烧录 HC32L110(二) HC32L110在Ubuntu下的烧录 HC32L110(三) HC32L110的GCC工具链和VS ...
- 64位的ubuntu14.04 LTS安装 Linux交叉编译工具链及32位“ia32-libs”依赖库
ubuntu又迎来了其新一代的长期支持版本 14.04 LTS,其带来了许多令人期待的新特新,遂决定进行升级. 装好了64位版本及安装 Linux交叉编译工具链 运行GCC,${CROSS_COMPI ...
- 更换gcc工具链
title: 更换gcc工具链 date: 2019/1/16 19:27:51 toc: true --- 更换gcc工具链 下载后解压到一个临时目录先看看文件结构 mkdir tmp tar xj ...
- Mac OS安装Go语言及配置VSCode开发环境:一个工具(gopls)解千愁
前言 截止到目前为止,Go语言已经更新到1.14.1,网上的很多教程均已经过时,我在此汇总并整理一下相关的教程,提供一个适合当下的Mac OS教程. 教程中使用了Go在1.11之后推出的依赖包管理工具 ...
- 39 Ubuntu下配置python的vscode开发环境
0 引言 最近想在ubuntu下搞深度学习,首先配置了python的vscode开发环境.在配置python时,选择了Anaconda3.x,保证了其相对于系统python2.x的独立性.另外,vsc ...
- golang+vscode开发环境的搭建
一.windows下安装golang开发环境 (1)配置GOROOT变量,在系统变量中点击新建,变量值是golang安装文件夹目录 (2)配置Path变量,选中Path点编辑即可,在变量值后面追加;% ...
- windows/Linux下设置ASP.Net Core开发环境并部署应用
10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用 创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 ...
- Ubuntu安装ARM架构GCC工具链(ubuntu install ARM toolchain)最简单办法
一.安装ARM-Linux-GCC工具链 只需要一句命令: sudo apt-get install gcc-arm-linux-gnueabi 前提是你的Ubuntu系统版本是官网支持的最新的版本, ...
- 【转】Ubuntu安装ARM架构GCC工具链(ubuntu install ARM toolchain)最简单办法
原文网址:http://www.cnblogs.com/muyun/p/3370996.html 一.安装ARM-Linux-GCC工具链 只需要一句命令: sudo apt-get install ...
随机推荐
- input标签的事件之oninput事件
最近在写前端的时候,用到了oninput事件.(其中也涉及了onclick) 问题:鼠标点击数字和运算符的时候,文本框里的内容到达一定长度时,会出现无法继续往后面跟随光标的问题. 解决:见下面代码 这 ...
- VM Ware 给Centos虚拟机配置静态IP
前言:在大家的日常运维工作中,肯定多多少少都会用到虚拟机,但是默认情况下VMware创建的虚拟机每次启动都有可能更换IP这就对我们的工作造成了一定的麻烦,下面我就给大家介绍下,如何给centos虚拟机 ...
- string的底层实现
String底层实现 string在C++也是一个重要的知识,但是想要用好它,就要知道它的底层是如何写的,才能更好的用好这个string,那么这次就来实现string的底层,但是string的接口功能 ...
- Aborted wiping of zfs_member.1 existing signature left on the device.Aborting pvcreate on /dev/sda
看意思是有什么签名在上面,创建不了逻辑卷,确认数据备份的情况下执行对应的下面命令: wipefs --all --force /dev/sdax
- MQ系列2:消息中间件的技术选型
1 背景 在高并发.高消息吞吐的互联网场景中,我们经常会使用消息队列(Message Queue)作为基础设施,在服务端架构中担当消息中转.消息削峰.事务异步处理 等职能. 对于那些不需要实时响应的的 ...
- 2022 07 13 第一小组 田龙跃 Java再学习笔记
1.类名命名规则: 只能由数字字母,下划线,美元符号组成(不能以数字开头,尽量不要用下划线开头) 2.注释(养成多写注释的好习惯) 单行注释 // ctrl+/ 多行注释 // ctrl+shirt+ ...
- 2022-7-18 第五组 pan 面向对象
面向过程 向过程就是:面向过程,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求. 面向对象 什么是面向对象: 面向对象思想就是不断的创建对象,使用对 ...
- linux 邮件
通过命令行发送邮件 [root@ProxyServer ~]# mail -s "test" justin@51cto.com dfdafd dfadf fadf EOT [roo ...
- [原创] RestartPC64-中文版v1.0.0.9
原来发布的RestartPC-中文版和英文版v1.0.0.5,在PE64下无效.所以重新编译了64位版的RestartPC64-中文版v1.0.0.9,可以在PE64下面.正常Win64系统下面重启关 ...
- 在使用amoeba连接数据库时,报错java.lang.Exception: poolName=slaves, no valid pools
项目场景:Mysql 实现数据库读写分离 搭建3台MySQL服务器,完成主从复制,搭建一台amoeba服务器,完成MySQL的读写分离 问题描述: 问题1. 在服务搭建完毕后,利用客户机连接amoeb ...