草庐IT

HK32F030MF4P6的Linux GCC工具链开发环境

Milton 2023-03-28 原文

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低, 可能只剩下存量项目和教学用途了.

项目模板地址:

相关资料下载:

相关链接

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

软件环境

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工具链开发环境的更多相关文章

  1. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  2. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  3. ESP32学习入门:WiFi连接网络 - 2

    目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方

  4. Spring Security 6.0系列【32】授权服务器篇之默认过滤器 - 2

    有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N

  5. ruby - 摘要::CRC32 与 Zlib - 2

    在我的代码中,我需要使用各种算法(包括CRC32)对文件进行哈希处理。因为我还在Digest系列中使用其他加密哈希函数,所以我认为为它们维护一个一致的接口(interface)会很好。为了记录,我确实找到了digest-crc,一颗完全符合我要求的gem。问题是,Zlib是标准库的一部分,并且有一个我想重用的CRC32工作实现。此外,它是用C编写的,因此它应该提供与digest-crc相关的卓越性能,后者是纯ruby​​实现。实现Digest::CRC32一开始看起来非常简单:%w(digestzlib).each{|f|requiref}classDigest::CRC32一切正常:

  6. ruby - 安装gem : Couldn't reserve space for cygwin's heap, Win32错误487错误 - 2

    我正在尝试在我的机器上安装win32-apigem,但在构建native扩展时我遇到了一些问题:$geminstallwin32-api--no-ri--rdocTemporarilyenhancingPATHtoincludeDevKit...Buildingnativeextensions.Thiscouldtakeawhile...C:\Programs\dev_kit\bin\make.exe:***Couldn'treservespaceforcygwin'sheap,Win32error0ERROR:Errorinstallingwin32-api:ERROR:Failed

  7. Ruby 1.9 - 没有这样的文件可以加载 'win32/open3' - 2

    我在Windows上运行ruby​​1.9.2并试图移植在Ruby1.8中工作的代码。该代码使用以前运行良好的Open4.popen4。对于1.9.2,我做了以下事情:通过geminstallPOpen4安装了POpen4需要POpen4通过require'popen4'尝试像这样使用POpen4:Open4.popen4("cmd"){|io_in,io_out,io_er|...}当我这样做时,我得到了错误:nosuchfiletoload--win32/open3如果我尝试安装win32-open3(geminstallwin32-open3),我会收到错误消息:win32-op

  8. Dell Inspiron 5488加内存32G - 2

    DellInspiron5488加内存32G 原装内置内存仅仅8G,目前看,真的太小了! 1.内存型号Dell5488内存型号:DDR42666。笔记本有两个内存插槽,原装占了一个,还能扩展一个。 2.买内存如果买Dell原装笔记本内存,8G就得500块左右。 我咨询了一下,三星的笔记本内存,可以兼容。16G,299块(2023年2月23日,京东价) Dell5488内存组合,最多只能插两根16G内存。 我于是买了两根三星16G内存。装上,很爽😄 跑国产系统统信UOS,再也看不到用交换区了,32G内存,爽!  

  9. 蓝桥杯 stm32 MCP4017 - 2

    本文代码使用HAL库。文章目录前言一、MCP4017的重要特性二、MCP4017计算RBW阻值三、MCP4017地址四、MCP4017读写函数五、CubeMX创建工程(利用ADC测量MCP4017电压)、对应代码:总结前言一、MCP4017的重要特性蓝桥杯板子上的是MCP4017T-104ELT,如图1。MCP4017是一个可编程电阻,通过写入的数值可以改变电阻的大小。重点在于6引脚(W),5引脚(B&#

  10. STM32 OTA应用开发——通过USB实现OTA升级 - 2

    STM32OTA应用开发——通过USB实现OTA升级目录STM32OTA应用开发——通过USB实现OTA升级前言1环境搭建2功能描述3BootLoader的制作4APP的制作5烧录下载配置6运行测试结束语前言什么是OTA?百度百科:空中下载技术(Over-the-AirTechnology;OTA),是通过移动通信的空中接口实现对移动终端设备及SIM卡数据进行远程管理的技术。经过公网多年的应用与发展,已十分成熟,网络运营商通过OTA技术实现SIM卡远程管理,还能提供移动化的新业务下载功能。实际上,现在我们所说的OTA比百度百科的定义还要更广泛,OTA的形式已经不再局限于手机和SIM卡,只要涉及

随机推荐