HK32F030MF4P6的Linux GCC工具鏈開發環境

来源:https://www.cnblogs.com/milton/archive/2022/09/18/16705771.html
-Advertisement-
Play Games

航順的 HK32F030MF4P6, TSSOP20封裝, Arm Cortex M0 內核, 內建32MHz時鐘, 16K Flash, 2K RAM(實際上可用的有4K). 這個型號的目的應該是硬體替換 STM8S003, 管腳和 STM8S003 相容(和 STM32F030 相容的型號是 H... ...


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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、什麼是SQL片段 就是將我們Mapper.xml文件中部分SQL語句拿出來單獨用一個sql標簽進行標記,這個sql標簽就是一個SQL片段。 二、為什麼要用到SQL片段 這個sql標簽可以被引用,這樣需要用到這個sql標簽中的SQL語句的地方直接引用就可以,如此一來就提高了SQL代碼的復用性,而不 ...
  • #MyBatis Plus 國產的開源框架,基於 MyBatis 核心功能就是簡化 MyBatis 的開發,提高效率。 ##MyBatis Plus 快速上手 官網快速上手案例 Spring Boot(2.3.0) + MyBatis Plus(國產的開源框架,並沒有接入到 Spring 官方孵化器 ...
  • 今天我就來告訴你“一名合格的爬蟲師需要學習哪些技術”?哪些技術我們該著重掌握? 一、Python語言 重要程度 :★★★★★(重中之重) 任何一門技術都是需要語言來支持的。在眾多的電腦編程語言中,Python無疑是最適合做爬蟲的,最適合併不代表是唯一的,其它的語言例如Java、C等等都是可以來做爬 ...
  • 在上一篇if中我們已經把if和where標簽進行了學習,現在我們學習一些剩下的標簽。 一、set標簽 首先看官方文檔給出的說明: 用於動態更新語句的類似解決方案叫做 set。set 元素可以用於動態包含需要更新的列,忽略其它不更新的列。 set 元素會動態地在行首插入 SET 關鍵字,並會刪掉額外的 ...
  • 2022-09-17 裝飾器的使用實例——獲得計時函數所用時間: 1 import time 2 # 定義裝飾器函數 3 def decorator(fun): 4 def inner(): 5 # 獲得開始時間 6 start = time.time() 7 # 執行計時函數 8 fun() 9 ...
  • /** * 版權所有 2022 塗聚文有限公司 * 許可信息查看: * 描述: * 裝飾模式 Decorator Patterns * 歷史版本: JDK 14.02 * 2022-09-12 創建者 geovindu * 2022-09-12 添加 Lambda * 2022-09-12 修改:d ...
  • 先新建一個類,因為我們肯定要在類裡面寫,在main方法里調用(為求好理解這裡我用的預設名,請勿糾結) 首先我們要想到函數中的字元串最好是要用戶自行輸入的,那麼我們可以通過main方法里的Console.WriteLine獲取到用戶輸入的三個字元串,依次賦值給參數,然後調用我們在類里寫好的方法體 可以 ...
  • 前言:以下內容,手把手從搭建到最終實現,完成多語言切換以及換裝功能。 本地系統環境:win 10 編譯器環境:VS2022 社區版 .NET 環境: .NET 6 1、新建一個WPF項目 2、新建完畢,添加兩個按鈕備用。 3、添加WPF用戶控制項庫類庫項目 4、創建控制項庫類庫項目 Wesky.Skin ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...