HC32
目录 |
1 Overview
2 Bare Metal
2.1 Reset Handler
2.2 Makefile
-D__START=main
3 HC32L130F8UA
- Cortex-M0+, Up to 48MHz
- 8KB RAM, 64KB Flash
- -40 ~ 85 'C
- 1.8 ~ 5.5V
- QFN32, 4x4mm
- PB0 - AIN8/VC0_INN10/VC1_INN6/SEG13
- PB1 - AIN9/EXVREF/VC1_INP6/VC1_INN7/SEG12
- PB6 - I2C0_SCL (SEL1)
- PB7 - I2C0_SDA (SEL1)
- PA04 - SPI0_CS (SEL1)
- PA05 - SPI0_CLK (SEL1)
- PA06 - SPI0_MISO (SEL1)
- PA07 - SPI0_MOSI (SEL1)
- PA09 - UART0_TXD (SEL1)
- PA10 - UART0_RXD (SEL1)
- PA14 - UART0_TXD (SEL2) - SWCLK
- PA13 - UART0_RXD (SEL2) - SWDIO
- PB0/PB1, PB4/PB5: I2C1
4 最小系统
5 MODE (模式) PIN
在正常情况下,必须通过电阻(推荐 10KΩ)将 MODE Pin (PD03/MD)下拉到 GND。
- MODE (PD03)为高电平时,Power Reset 或硬件 Reset,则芯片进入在线编程模式(如加上跳帽使 MODE Pin 置位于高电平),通过上位机可以进行在线编程;
- MODE (PD03)为低电平时,芯片进入用户模式。
PD03/MD 用户可用作输入端口,但是在 NRST 有效期间(即 RESETB 为低电平期间)必须保持低电平,否则 NRST 解除后(即 RESETB 变为高电平),芯片会误进入在线编程模式(Boot Mode)。
- 当复位时 BOOT0(PD03)管脚为高电平,芯片工作于 ISP 编程模式,可通过 ISP 协议对 Flash 进行编程。
- 当复位时 BOOT0(PD03)管脚为低电平,芯片工作于用户模式,芯片执行 Flash 内的程序代码,可通过 SWD 协议对 Flash 进行编程。
注意:
- 建议预留 PA9、PA10 作为 ISP 编程接口,如需使用 PA13、PA14 作为 ISP 编程接口请参见 PCN:PCN20191230-1_HC32L130HC32F030HC32L136 提高烧录速度。
6 Toolchain
6.1 Compier
- toolchain/gcc-arm-none-eabi/bin/
- arm-none-eabi-gcc
- arm-none-eabi-g++
- arm-none-eabi-gdb
- toolchain/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/v6-m/
- libc.a
- libstdc++.a
- libm.a
6.2 Uploader
6.2.1 UART
6.2.2 STLINK or J-LINK
6.3 Linker Script
MEMORY { FLASH ( rx ) : ORIGIN = 0x00000000, LENGTH = 64K RAM ( rxw ) : ORIGIN = 0x20000000, LENGTH = 8K }
.vectors (Vector Table) 位于 Flash 开始处,Flash 上代码段 .text 之前:
ENTRY(Reset_Handler) SECTIONS { .text : { KEEP(*(.vectors)) __Vectors_End = .; __Vectors_Size = __Vectors_End - __Vectors; __end__ = .; ...... ......
arch/hc32/common/startup_hc32l13x.c:
/*---------------------------------------------------------------------------- Exception / Interrupt Vector table *----------------------------------------------------------------------------*/ const pFunc __Vectors[] __attribute__ ((section(".vectors"))) = { /* Cortex-M Exception Handlers */ (pFunc)&__StackTop, /* Initial Stack Pointer */ Reset_Handler, /* Reset Handler */ ...... ......
7 SystemInit()
位于 hc32/common/system_hc32l13x.c:
void SystemInit(void) { M0P_SYSCTRL->RCL_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C22ul))); M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C08ul))); SystemCoreClockUpdate(); _HidePinInit(); }
7.1 系统时钟
HC32L13x 支持以下五种时钟源作为系统时钟:
SysctrlClkRCH = 0u, // 内部 RC 高速时钟,输出频率为 4~24MHz SysctrlClkXTH = 1u, // 外部晶振高速时钟,XTH 可以不接晶振,直接从 PD00 引脚输入 4~32MHz 的时钟信号 SysctrlClkRCL = 2u, // 内部 RC 低速时钟,可选频率:38.4K 与 32.768K。当系统进入 DeepSleep,此低速时钟不会自动关闭,超低功耗外设模块可以选择 RCL 作为其时钟。 SysctrlClkXTL = 3u, // 外部晶振低速时钟,XTL 可以不接晶振,直接从 PC14 引脚输入 32.768KHz 的时钟信号。当系统进入 Deep Sleep,此低速时钟不会自动关闭。超低功耗模式下工作的外设模块可以选择 XTL 作为其时钟。 SysctrlClkPLL = 4u, // 锁相环 PLL 时钟
还有两个辅助时钟:
- 内部低速 10K 时钟;仅供 WatchDog 和 CLKTRIM 模块使用。
- 内部 150K 时钟:仅供 LVD 和 VC 模块使用。
芯片上电或复位后的默认时钟源为 4MHz 的内部 RCH 时钟;当系统进入 Deep Sleep,此高速时钟会自动关闭。
更改寄存器 RCH_CR[10:0]的数值即可调整 RCH 的输出频率。寄存器数值每增加 1 则 RCH 的输出频率增加约 0.2%,总调整范围为 4~24MHz。更改 RCH 输出频率需要按照特定的更改时序,详见系统时钟切换章节。
内部高速时钟 RCH 从启动到稳定仅需 4us。为了在深度休眠模式下能快速响应中断,建议进入深度休眠模式前将系统时钟切换为 RCH。
8 GPIO
MCU 的 GPIO 是通过 CMOS 的 PMOS 输出高电平,NMOS 输出低电平。
内部上拉电阻也是一个 PMOS,引脚输出时,PMOS 或 NMOS 工作在线性区域,其等效导通电阻随着 MCU 的 VCC 变化而变化。到 MCU 工作下限电压附近时,其导通电阻会急剧变化,表象上看就是驱动能力急剧下降,上拉电阻也变大
芯片复位后端口为高阻输入,目的是防止芯片被异常复位时,对外部器件产生异常动作。但为了避免高阻输入而产生的漏电,用户要在芯片启动之后对端口进行相应的配置(配置成内部拉高/拉低输入或者输出)。
9 I2C
10 SPI
11 RTC
12 ADC
https://bbs.21ic.com/icview-2817282-1-1.html
13 Reference
- https://www.hdsc.com.cn/list/71/35.htm
- https://hdsc.com.cn/cn/index/listView/catid/94/cdk/56a757q!57yW56iL
- HC32L130_HC32L136系列数据手册Rev1.9.pdf
- HC32L130_硬件开发指南.pdf
- HC32L130_HC32L136系列用户手册Rev2.31.pdf
- "Bare Metal" STM32 Programming
- Memory Layout of C Programs