HC32
(→HC32L130F8UA) |
(→Overview) |
||
(未显示1个用户的75个中间版本) | |||
第1行: | 第1行: | ||
== Overview == | == Overview == | ||
− | https://hdsc.com.cn/Category82 | + | * https://hdsc.com.cn/Category82 |
+ | * [https://developer.arm.com/tools-and-software/embedded/cmsis ARM CMSIS] | ||
+ | * [https://arm-software.github.io/CMSIS_5/Core/html/templates_pg.html CMSIS github doc] | ||
+ | |||
+ | |||
+ | * [https://hdsc.com.cn/Category83-1590 HC32D391FEUA-TFN32TR] 192KB RAM,512KB Flash, up to 200MHz Cortex-M4, QFN32 4x4mm, 1.8-3.6V, USB, I2S | ||
+ | * [https://www.hdsc.com.cn/Category83-1499?All=1 HC32F4A0PITB-LQFP100] 516KB RAM, 2048KB Flash, up to 240MHz Cotex-M4, LQFP100 14x14mm [https://www.hdsc.com.cn/Category82?All=1 All] | ||
+ | * [https://hdsc.com.cn/Category83-1501 HC32F4A0SGHB-VFBGA176] 516KB RAM, 1024KB Flash, up to 240MHz Cortex-M4, VFBGA176 10×10mm, 1.8-3.6V, USB, CAN, I2S, SDIO | ||
+ | * [https://hdsc.com.cn/Category83-1497 HC32F4A0SIHB-VFBGA176] 516KB RAM, 2048KB Flash, up to 240MHz Cortex-M4, VFBGA176 10×10mm, 1.8-3.6V, USB, CAN, I2S, SDIO | ||
+ | |||
+ | |||
+ | * [http://product.sitimechina.com/uploadfile/images/202103/202103231149138817.pdf SiT1630] <-----> SiT1533 | ||
+ | * [http://product.sitimechina.com/product_list.php?id=1 32.768KHz 抗振动] | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | == Bare Metal == | ||
+ | |||
+ | === Reset Handler === | ||
+ | |||
+ | hc32/variants/hc32l130f8ua/hc32l130f8ua.ld (Link Script) : | ||
+ | |||
+ | <source lang=python> | ||
+ | ENTRY(Reset_Handler) | ||
+ | |||
+ | SECTIONS | ||
+ | { | ||
+ | .text : | ||
+ | { | ||
+ | KEEP(*(.vectors)) | ||
+ | __Vectors_End = .; | ||
+ | __Vectors_Size = __Vectors_End - __Vectors; | ||
+ | __end__ = .; | ||
+ | *(.text*) | ||
+ | ...... | ||
+ | ...... | ||
+ | </source> | ||
+ | |||
+ | hc32/common/startup_hc32l13x.c: | ||
+ | |||
+ | <source lang=cpp> | ||
+ | void Reset_Handler(void) { | ||
+ | |||
+ | uint32_t *pSrc, *pDest; | ||
+ | uint32_t *pTable __attribute__((unused)); | ||
+ | |||
+ | SystemInit(); | ||
+ | |||
+ | /* | ||
+ | * Single section scheme. | ||
+ | * | ||
+ | * The ranges of copy from/to are specified by following symbols | ||
+ | * __etext: LMA of start of the section to copy from. Usually end of text | ||
+ | * __data_start__: VMA of start of the section to copy to | ||
+ | * __data_end__: VMA of end of the section to copy to | ||
+ | * | ||
+ | * All addresses must be aligned to 4 bytes boundary. | ||
+ | */ | ||
+ | pSrc = &__etext; | ||
+ | pDest = &__data_start__; | ||
+ | |||
+ | for ( ; pDest < &__data_end__ ; ) { | ||
+ | *pDest++ = *pSrc++; | ||
+ | } | ||
+ | __START(); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | <br> | ||
+ | |||
+ | === SystemInit() === | ||
+ | |||
+ | '''位于 hc32/common/system_hc32l13x.c:''' | ||
+ | |||
+ | <source lang=cpp> | ||
+ | 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(); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | <br> | ||
+ | |||
+ | === Makefile === | ||
+ | |||
+ | <source lang=bash> | ||
+ | -D__START=main | ||
+ | </source> | ||
<br><br> | <br><br> | ||
第7行: | 第97行: | ||
== HC32L130F8UA == | == HC32L130F8UA == | ||
+ | * Cortex-M0+, Up to 48MHz | ||
+ | * 8KB RAM, 64KB Flash | ||
+ | * UART x2, LPUART x2, SPI x2, I2C x2 | ||
+ | * AES-128, TRNG | ||
+ | * 0.9μA @3V 深度休眠模式+ RTC 工作 | ||
+ | * 130μA/MHz@3V@24MHz 工作模式:CPU 和外设运行,从 Flash 运行程序 | ||
+ | * -40 ~ 85 'C | ||
+ | * 1.8 ~ 5.5V | ||
* QFN32, 4x4mm | * QFN32, 4x4mm | ||
[[文件:HC32L130-QFN32.png]] | [[文件:HC32L130-QFN32.png]] | ||
+ | |||
+ | |||
+ | 引脚规划参考官方文档:《HC32L130 / HC32L136 / HC32F030 系列硬件开发指南》 | ||
* PB0 - AIN8/VC0_INN10/VC1_INN6/SEG13 | * PB0 - AIN8/VC0_INN10/VC1_INN6/SEG13 | ||
* PB1 - AIN9/EXVREF/VC1_INP6/VC1_INN7/SEG12 | * PB1 - AIN9/EXVREF/VC1_INP6/VC1_INN7/SEG12 | ||
− | * PB6 - I2C0_SCL | + | * PB6 - I2C0_SCL (SEL1) |
− | * PB7 - I2C0_SDA | + | * 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 | ||
+ | |||
+ | * PD0/PD1 as UART1_TX/RX (SEL3) ------------------------> M_RX / M_TX | ||
− | |||
− | |||
<br> | <br> | ||
第44行: | 第160行: | ||
- 建议预留 PA9、PA10 作为 ISP 编程接口,如需使用 PA13、PA14 作为 ISP 编程接口请参见 PCN:[https://hdsc.com.cn/Public/Uploads/uploadfile/files/20200723/20200723142051_5f192c43a9684.pdf PCN20191230-1_HC32L130HC32F030HC32L136] 提高烧录速度。 | - 建议预留 PA9、PA10 作为 ISP 编程接口,如需使用 PA13、PA14 作为 ISP 编程接口请参见 PCN:[https://hdsc.com.cn/Public/Uploads/uploadfile/files/20200723/20200723142051_5f192c43a9684.pdf PCN20191230-1_HC32L130HC32F030HC32L136] 提高烧录速度。 | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == Toolchain == | ||
+ | |||
+ | === 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 | ||
+ | |||
+ | <br> | ||
+ | |||
+ | === Uploader === | ||
+ | |||
+ | ==== UART ==== | ||
+ | |||
+ | * https://github.com/kicer/hc32flash | ||
+ | |||
+ | <br> | ||
+ | |||
+ | ==== STLINK or J-LINK ==== | ||
+ | |||
+ | * [http://www.51hei.com/bbs/dpj-194723-1.html pyOCD] | ||
+ | |||
+ | <br> | ||
+ | |||
+ | === Linker Script === | ||
+ | |||
+ | <source lang=python> | ||
+ | MEMORY | ||
+ | { | ||
+ | FLASH ( rx ) : ORIGIN = 0x00000000, LENGTH = 64K | ||
+ | RAM ( rxw ) : ORIGIN = 0x20000000, LENGTH = 8K | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | .vectors (Vector Table) 位于 Flash 开始处,Flash 上代码段 .text 之前: | ||
+ | |||
+ | <source lang=python> | ||
+ | ENTRY(Reset_Handler) | ||
+ | |||
+ | SECTIONS | ||
+ | { | ||
+ | .text : | ||
+ | { | ||
+ | KEEP(*(.vectors)) | ||
+ | __Vectors_End = .; | ||
+ | __Vectors_Size = __Vectors_End - __Vectors; | ||
+ | __end__ = .; | ||
+ | ...... | ||
+ | ...... | ||
+ | </source> | ||
+ | |||
+ | arch/hc32/common/startup_hc32l13x.c: | ||
+ | |||
+ | <source lang=c> | ||
+ | /*---------------------------------------------------------------------------- | ||
+ | Exception / Interrupt Vector table | ||
+ | *----------------------------------------------------------------------------*/ | ||
+ | const pFunc __Vectors[] __attribute__ ((section(".vectors"))) = { | ||
+ | /* Cortex-M Exception Handlers */ | ||
+ | (pFunc)&__StackTop, /* Initial Stack Pointer */ | ||
+ | Reset_Handler, /* Reset Handler */ | ||
+ | ...... | ||
+ | ...... | ||
+ | </source> | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == SystemInit() == | ||
+ | |||
+ | '''位于 hc32/common/system_hc32l13x.c:''' | ||
+ | |||
+ | <source lang=cpp> | ||
+ | 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(); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | <br> | ||
+ | |||
+ | === 系统时钟 === | ||
+ | |||
+ | HC32L13x 支持以下五种时钟源作为系统时钟: | ||
+ | |||
+ | <source lang=python> | ||
+ | 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 时钟 | ||
+ | </source> | ||
+ | |||
+ | |||
+ | 还有两个辅助时钟: | ||
+ | * 内部低速 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。 | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == SysTick 定时器 == | ||
+ | |||
+ | SysTick 为 24 位的定时器,向下计数。定时器的计数减到 0 后,就会重新装载一个可编程的数值,同时产生 SysTick 异常(异常编号为 15) | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == GPIO == | ||
+ | |||
+ | MCU 的 GPIO 是通过 CMOS 的 PMOS 输出高电平,NMOS 输出低电平。 | ||
+ | |||
+ | 内部上拉电阻也是一个 PMOS,引脚输出时,PMOS 或 NMOS 工作在线性区域,其等效导通电阻随着 MCU 的 VCC 变化而变化。到 MCU 工作下限电压附近时,其导通电阻会急剧变化,表象上看就是驱动能力急剧下降,上拉电阻也变大 | ||
+ | |||
+ | |||
+ | 芯片复位后端口为高阻输入,目的是防止芯片被异常复位时,对外部器件产生异常动作。但为了避免高阻输入而产生的漏电,用户要在芯片启动之后对端口进行相应的配置(配置成内部拉高/拉低输入或者输出)。 | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == Interrupt == | ||
+ | |||
+ | 嵌套向量中断控制器 (NVIC) ,支持 32 个外部中断请求(IRQ), 1 个不可屏蔽中断(NMI) | ||
+ | |||
+ | Cortex-M0+ 的中断向量表,位于存储器空间的开始位置,注意主栈指针(MSP)的初始值位于第一个入口: | ||
+ | |||
+ | [[文件:Cortex-m0plus-int-vec-table.png]] | ||
+ | |||
+ | |||
+ | 中断号定义于 '''arch/hc32/common/hc32l13x.h:''' | ||
+ | |||
+ | <source lang=cpp> | ||
+ | /* Interrupt Number Definition */ | ||
+ | typedef enum IRQn | ||
+ | { | ||
+ | NMI_IRQn = -14, /* 2 Non Maskable */ | ||
+ | HardFault_IRQn = -13, /* 3 Hard Fault */ | ||
+ | SVC_IRQn = -5, /* 11 SV Call */ | ||
+ | PendSV_IRQn = -2, /* 14 Pend SV */ | ||
+ | SysTick_IRQn = -1, /* 15 System Tick */ | ||
+ | |||
+ | PORTA_IRQn = 0 , | ||
+ | PORTB_IRQn = 1 , | ||
+ | PORTC_IRQn = 2 , | ||
+ | PORTD_IRQn = 3 , | ||
+ | DMAC_IRQn = 4 , | ||
+ | TIM3_IRQn = 5 , | ||
+ | UART0_IRQn = 6 , | ||
+ | UART1_IRQn = 7 , | ||
+ | LPUART0_IRQn = 8 , | ||
+ | LPUART1_IRQn = 9 , | ||
+ | SPI0_IRQn = 10, | ||
+ | SPI1_IRQn = 11, | ||
+ | I2C0_IRQn = 12, | ||
+ | I2C1_IRQn = 13, | ||
+ | TIM0_IRQn = 14, | ||
+ | TIM1_IRQn = 15, | ||
+ | TIM2_IRQn = 16, | ||
+ | LPTIM_IRQn = 17, | ||
+ | ADTIM4_IRQn = 18, | ||
+ | ADTIM5_IRQn = 19, | ||
+ | ADTIM6_IRQn = 20, | ||
+ | PCA_IRQn = 21, | ||
+ | WDT_IRQn = 22, | ||
+ | RTC_IRQn = 23, | ||
+ | ADC_IRQn = 24, | ||
+ | PCNT_IRQn = 25, | ||
+ | VC0_IRQn = 26, | ||
+ | VC1_IRQn = 27, | ||
+ | LVD_IRQn = 28, | ||
+ | LCD_IRQn = 29, | ||
+ | FLASH_RAM_IRQn = 30, | ||
+ | CLKTRIM_IRQn = 31, | ||
+ | } IRQn_Type; | ||
+ | </source> | ||
+ | |||
+ | PortA, B, C, D 为 GPIO 中断处理入口 | ||
+ | |||
+ | 四个口的对应寄存器: | ||
+ | * 中断状态寄存器 Px_STAT 地址分别为: 0x200, 0x240, 0x280, 0x2C0 (PA_STAT, PB_STAT, PC_STAT, PD_STAT) | ||
+ | * 中断清除寄存器 Px_ICLR 地址分别为: 0x210, 0x250, 0x290, 0x2D0 | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == UART == | ||
+ | |||
+ | 《HC32L130 / HC32L136 / HC32F030 系列硬件开发指南》: | ||
+ | |||
+ | * PA09 --- UART0_TX | ||
+ | * PA10 --- UART0_RX | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == I2C == | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == SPI == | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == RTC == | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == ADC == | ||
+ | |||
+ | https://bbs.21ic.com/icview-2817282-1-1.html | ||
<br> | <br> | ||
第51行: | 第391行: | ||
* https://www.hdsc.com.cn/list/71/35.htm | * https://www.hdsc.com.cn/list/71/35.htm | ||
* https://hdsc.com.cn/cn/index/listView/catid/94/cdk/56a757q!57yW56iL | * https://hdsc.com.cn/cn/index/listView/catid/94/cdk/56a757q!57yW56iL | ||
+ | * HC32L130_HC32L136系列数据手册Rev1.9.pdf | ||
+ | * HC32L130_硬件开发指南.pdf | ||
+ | * HC32L130_HC32L136系列用户手册Rev2.31.pdf | ||
+ | * [https://vivonomicon.com/2018/04/02/bare-metal-stm32-programming-part-1-hello-arm/ "Bare Metal" STM32 Programming] | ||
+ | * [https://www.geeksforgeeks.org/memory-layout-of-c-program/ Memory Layout of C Programs] | ||
<br><br> | <br><br> | ||
<br><br> | <br><br> |
2023年3月17日 (五) 16:14的最后版本
目录 |
[编辑] 1 Overview
- HC32D391FEUA-TFN32TR 192KB RAM,512KB Flash, up to 200MHz Cortex-M4, QFN32 4x4mm, 1.8-3.6V, USB, I2S
- HC32F4A0PITB-LQFP100 516KB RAM, 2048KB Flash, up to 240MHz Cotex-M4, LQFP100 14x14mm All
- HC32F4A0SGHB-VFBGA176 516KB RAM, 1024KB Flash, up to 240MHz Cortex-M4, VFBGA176 10×10mm, 1.8-3.6V, USB, CAN, I2S, SDIO
- HC32F4A0SIHB-VFBGA176 516KB RAM, 2048KB Flash, up to 240MHz Cortex-M4, VFBGA176 10×10mm, 1.8-3.6V, USB, CAN, I2S, SDIO
- SiT1630 <-----> SiT1533
- 32.768KHz 抗振动
[编辑] 2 Bare Metal
[编辑] 2.1 Reset Handler
hc32/variants/hc32l130f8ua/hc32l130f8ua.ld (Link Script) :
ENTRY(Reset_Handler) SECTIONS { .text : { KEEP(*(.vectors)) __Vectors_End = .; __Vectors_Size = __Vectors_End - __Vectors; __end__ = .; *(.text*) ...... ......
hc32/common/startup_hc32l13x.c:
void Reset_Handler(void) { uint32_t *pSrc, *pDest; uint32_t *pTable __attribute__((unused)); SystemInit(); /* * Single section scheme. * * The ranges of copy from/to are specified by following symbols * __etext: LMA of start of the section to copy from. Usually end of text * __data_start__: VMA of start of the section to copy to * __data_end__: VMA of end of the section to copy to * * All addresses must be aligned to 4 bytes boundary. */ pSrc = &__etext; pDest = &__data_start__; for ( ; pDest < &__data_end__ ; ) { *pDest++ = *pSrc++; } __START(); }
[编辑] 2.2 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(); }
[编辑] 2.3 Makefile
-D__START=main
[编辑] 3 HC32L130F8UA
- Cortex-M0+, Up to 48MHz
- 8KB RAM, 64KB Flash
- UART x2, LPUART x2, SPI x2, I2C x2
- AES-128, TRNG
- 0.9μA @3V 深度休眠模式+ RTC 工作
- 130μA/MHz@3V@24MHz 工作模式:CPU 和外设运行,从 Flash 运行程序
- -40 ~ 85 'C
- 1.8 ~ 5.5V
- QFN32, 4x4mm
引脚规划参考官方文档:《HC32L130 / HC32L136 / HC32F030 系列硬件开发指南》
- 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
- PD0/PD1 as UART1_TX/RX (SEL3) ------------------------> M_RX / M_TX
[编辑] 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 SysTick 定时器
SysTick 为 24 位的定时器,向下计数。定时器的计数减到 0 后,就会重新装载一个可编程的数值,同时产生 SysTick 异常(异常编号为 15)
[编辑] 9 GPIO
MCU 的 GPIO 是通过 CMOS 的 PMOS 输出高电平,NMOS 输出低电平。
内部上拉电阻也是一个 PMOS,引脚输出时,PMOS 或 NMOS 工作在线性区域,其等效导通电阻随着 MCU 的 VCC 变化而变化。到 MCU 工作下限电压附近时,其导通电阻会急剧变化,表象上看就是驱动能力急剧下降,上拉电阻也变大
芯片复位后端口为高阻输入,目的是防止芯片被异常复位时,对外部器件产生异常动作。但为了避免高阻输入而产生的漏电,用户要在芯片启动之后对端口进行相应的配置(配置成内部拉高/拉低输入或者输出)。
[编辑] 10 Interrupt
嵌套向量中断控制器 (NVIC) ,支持 32 个外部中断请求(IRQ), 1 个不可屏蔽中断(NMI)
Cortex-M0+ 的中断向量表,位于存储器空间的开始位置,注意主栈指针(MSP)的初始值位于第一个入口:
中断号定义于 arch/hc32/common/hc32l13x.h:
/* Interrupt Number Definition */ typedef enum IRQn { NMI_IRQn = -14, /* 2 Non Maskable */ HardFault_IRQn = -13, /* 3 Hard Fault */ SVC_IRQn = -5, /* 11 SV Call */ PendSV_IRQn = -2, /* 14 Pend SV */ SysTick_IRQn = -1, /* 15 System Tick */ PORTA_IRQn = 0 , PORTB_IRQn = 1 , PORTC_IRQn = 2 , PORTD_IRQn = 3 , DMAC_IRQn = 4 , TIM3_IRQn = 5 , UART0_IRQn = 6 , UART1_IRQn = 7 , LPUART0_IRQn = 8 , LPUART1_IRQn = 9 , SPI0_IRQn = 10, SPI1_IRQn = 11, I2C0_IRQn = 12, I2C1_IRQn = 13, TIM0_IRQn = 14, TIM1_IRQn = 15, TIM2_IRQn = 16, LPTIM_IRQn = 17, ADTIM4_IRQn = 18, ADTIM5_IRQn = 19, ADTIM6_IRQn = 20, PCA_IRQn = 21, WDT_IRQn = 22, RTC_IRQn = 23, ADC_IRQn = 24, PCNT_IRQn = 25, VC0_IRQn = 26, VC1_IRQn = 27, LVD_IRQn = 28, LCD_IRQn = 29, FLASH_RAM_IRQn = 30, CLKTRIM_IRQn = 31, } IRQn_Type;
PortA, B, C, D 为 GPIO 中断处理入口
四个口的对应寄存器:
- 中断状态寄存器 Px_STAT 地址分别为: 0x200, 0x240, 0x280, 0x2C0 (PA_STAT, PB_STAT, PC_STAT, PD_STAT)
- 中断清除寄存器 Px_ICLR 地址分别为: 0x210, 0x250, 0x290, 0x2D0
[编辑] 11 UART
《HC32L130 / HC32L136 / HC32F030 系列硬件开发指南》:
- PA09 --- UART0_TX
- PA10 --- UART0_RX
[编辑] 12 I2C
[编辑] 13 SPI
[编辑] 14 RTC
[编辑] 15 ADC
https://bbs.21ic.com/icview-2817282-1-1.html
[编辑] 16 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