RISC-V Bumblebee GD32VF103C8U6
核心
RISC-V Bumblebee GD32VF103C8U6
32位处理器内核,工作频率为108MHz
时钟
内置
8Mhz
40Khz
外置
3-25M
32.768Khz
电源管理
2.6至3.6 V
几种节能模式为唤醒延迟和功耗之间的最大优化提供了灵活性,这在低功耗应用中尤为重要。
节电模式
单片机支持三种节电模式,实现更低的功耗。它们是睡眠模式、深度睡眠模式和待机模式。这些操作模式降低了功耗,并允许应用程序在CPU操作时间、速度和功耗之间实现最佳平衡。
睡眠模式
在睡眠模式下,只有核心时钟关闭。所有外围设备继续运行,任何中断/事件都可以唤醒系统。
深度睡眠模式
在深度睡眠模式下,1.2V域中的所有时钟都关闭,IRC8M、HXTAL和PLL都被禁用。
只保留SRAM和寄存器的内容。任何来自外部线路的中断或唤醒事件都可以将系统从深度睡眠模式唤醒,包括16条外部线路、RTC警报/时间戳/篡改、LVD输出、USB唤醒。
退出深度睡眠模式时,选择IRC8M作为系统时钟。
待机模式
在待机模式下,整个1.2V域断电,LDO关闭,IRC8M、HXTAL和PLL全部禁用。
SRAM和寄存器(备份寄存器除外)的内容丢失。
待机模式有四个唤醒源,包括来自NRST pin的外部重置、RTC警报/时间戳/篡改、FWDGT重置和WKUP pin的上升沿。
存储
闪存访问零等待状态
高达128 KB的片上闪存和32 KB的SRAM内存
片上存储器
高达128千字节的闪存
32千字节的SRAM
RISC-V处理器采用哈佛体系结构,可以使用单独的总线来获取指令和加载/存储数据。
最多128kbytes的内部闪存和32kbytes的内部SRAM可用于存储程序和数据,两者都以CPU时钟速度访问(R/W),无等待状态。
GD32VF103存储器映射显示GD32VF103系列设备的存储器映射,包括代码、SRAM、外围设备和其他预定义区域。
启动模式
启动时,引导管脚用于选择三个引导选项之一:
从主闪存启动(默认)
从系统内存引导
从片上SRAM引导
引导加载程序位于内部引导ROM内存(系统内存)中。
它用于在设备模式下使用USART0(PA9和PA10)、USART1(PD5和PD6)、USBFS(PA9、PA11和PA12)重新编程闪存。
它还可用于传输和更新闪存代码、数据和矢量表部分。
外设
ADC
DAC
定时器
SPI
I2C
USART
I2S
CAN
USBFS
dma
7通道DMA0控制器和5通道DMA1控制器
每个通道都连接到固定硬件DMA请求。DMA信道请求的优先级由软件配置和硬件信道数决定。源和目标的传输大小是独立且可配置的。
支持的外设:定时器、ADC、SPIs、I2Cs、USARTs、DAC、I2S
支持三种访问方法:
外设到存储器,存储器到外设,存储器到存储器
总线
APB总线
三条AHB总线,即I-Code、D-Code和系统总线。
RISC-V处理器的所有内存访问都根据不同的目的和目标内存空间在三条总线上执行。
内存组织使用哈佛架构、预定义的内存映射和高达4GB的内存空间,使系统具有灵活性和可扩展性。
中断控制器
ECLIC // Enhancement Core-Local Interrupt Controller
EXTI
调试扩展
高级调试支持
支持标准JTAG调试接口和成熟的交互式调试工具GDB,最多支持四个硬件断点
RISC-V核心不支持跟踪调试。
硬件断点主要用于在只读部分(如Flash)设置断点。
代码
https://riscv-mcu.com/quickstart-quickstart-index-u-pdf-id-8.html
https://doc.nucleisys.com/nuclei_board_labs/labs/rvstar/level1/lab1_3.html
https://blog.csdn.net/weifengdq/article/details/102786466
https://blog.csdn.net/athieka/article/details/100895290
https://blog.csdn.net/weixin_41788560/article/details/104392380
代码地址
.lds
SECTIONS
{
__stack_size = DEFINED(__stack_size) ? __stack_size : 1K;
.init :
{
KEEP (*(SORT_NONE(.init)))
} >flash AT>flash
.text :
{
*(.rodata .rodata.*)
*(.text.unlikely .text.unlikely.*)
*(.text.startup .text.startup.*)
*(.text .text.*)
*(.gnu.linkonce.t.*)
} >flash AT>flash
.data :
{
*(.rdata)
*(.gnu.linkonce.r.*)
*(.data .data.*)
*(.gnu.linkonce.d.*)
. = ALIGN(8);
PROVIDE( __global_pointer$ = . + 0x800);
*(.sdata .sdata.*)
*(.gnu.linkonce.s.*)
. = ALIGN(8);
*(.srodata.cst16)
*(.srodata.cst8)
*(.srodata.cst4)
*(.srodata.cst2)
*(.srodata .srodata.*)
} >ram AT>flash
.bss :
{
*(.sbss*)
*(.gnu.linkonce.sb.*)
*(.bss .bss.*)
*(.gnu.linkonce.b.*)
*(COMMON)
. = ALIGN(4);
} >ram AT>ram
// 为什么这里有栈的分布
.stack ORIGIN(ram) + LENGTH(ram) - __stack_size :
{
PROVIDE( _heap_end = . );
. = __stack_size;
PROVIDE( _sp = . );
} >ram AT>ram
}
- start.S
.section .init
vector_base:
j _start
_start:
/* Jump to logical address first to ensure correct operation of RAM region */
/* Set the the NMI base to share with mtvec by setting CSR_MMISC_CTL */
/* Intial the mtvt*/
/* Intial the mtvt2 and enable it*/
/* Intial the CSR MTVEC for the Trap ane NMI base addr*/
/* Enable FPU */
/* Load data section */
/* Clear bss section */
/*enable mcycle_minstret*/
/* Call global constructors */
call main
- main.c
int main(void)
{
/* system clocks configuration */
rcu_config();
/* GPIO configuration */
gpio_config();
/* TIMER configuration */
timer_config();
/* DMA configuration */
dma_config();
/* ADC configuration */
adc_config();
/* enable TIMER1 */
timer_enable(TIMER1);
while(1){
}
}