RISC-V MCU 开发教程之CH32V307配置Flash和RAM

赤菟V307(CH32V307)是一款RISC-V内核的MCU,搭载的是沁恒自研RISC-V内核青稞V4F,最高主频144MHz,支持单精度浮点运算(FPU)。通常官网介绍Flash大小为256 KB,SRAM大小为64 KB。

仔细阅读应用手册发现,其Flash和SRAM的大小支持配置,具体配置项如下:

  • 192 KB Flash + 128 KB SRAM

  • 224 KB Flash + 96 KB SRAM

  • 256 KB Flash + 54 KB SRAM

  • 288 KB Flash + 32 KB SRAM

彩蛋1

RAM最高可配置到128 KB,直接翻倍,可以撸起袖子敲代码啦,再也不用担心RAM不够啦~

其实赤菟V307内部有一块320 KB SRAM,分为A、B两块,A、B块的大小由用户选择字的user的SRAM_CODE_MODE 位决定,A块负责存放用户代码,B块留作单片机真正的SRAM,每次上电运行时,内部自动从Code Flash中加载A块大小的用户代码运行。

当然用户代码的实际Flash和SRAM大小不要超出配置的范围,否则会导致程序无法运行等问题。

实际在操作Flash时,也不会有Flash等待的问题。

彩蛋2

细心的小伙伴或许会发现,V307 Flash最大配置为288 KB,而Code Flash的大小为488 KB,这也是隐藏的彩蛋哦,剩下的200 KB Flash可以当作存储用,不过需要注意该处Flash等待的问题

配置方法

既然赤菟V307的Flash和SRAM是可配置的,那么聊聊配置的方法吧!

(1)WCHISBTool配置

  • step 1:切换启动模式,BOOT0 = 1,BOOT1 = 0

  • step 2:通过WCHISPTool工具配置用户选择字,具体步骤见下图

  • step 3:切换启动模式,BOOT0 = 0,BOOT1 = 0

(2)用户代码配置

typedef enum
{
    FlASH_192_SRAM_128 = 0,
    FLASH_224_SRAM_96,
    FLASH_256_SRAM_64,
    FLASH_288_RAM_32
} FLASH_SRAM_DEFIN;
​
//note: this operation will take effect after reset
void Config_Flash_SRAM(FLASH_SRAM_DEFIN SetFlashSRAM)
{
    uint8_t UserByte = FLASH_GetUserOptionByte() & 0xff; //get user option byte
​
    switch(SetFlashSRAM)
    {
    case 0:
        UserByte &= ~(0xc0); // SRAM_CODE_MODE = 00
        break;
    case 1:
        UserByte &= ~(0xc0); // SRAM_CODE_MODE = 00
        UserByte |= 0x7f;    // SRAM_CODE_MODE = 01
        break;
    case 2:
        UserByte &= ~(0xc0); // SRAM_CODE_MODE = 00
        UserByte |= 0xbf;    // SRAM_CODE_MODE = 10
        break;
    case 3:
        UserByte |= 0xff;    // SRAM_CODE_MODE = 11
        break;
    default:
        break;
    }
​
    FLASH_Unlock();
    FLASH_ProgramOptionByteData(0x1ffff802, UserByte);
    FLASH_Lock();
}
​
/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n", SystemCoreClock);
​
​
    Config_Flash_SRAM(FLASH_288_RAM_32); //配置Flash为244 KB,SRAM为96KB ,复位后生效
    
    printf("userByte = %02x \r\n",FLASH_GetUserOptionByte() & 0xff);  
​
    while(1)
    {
        ;
    }
}

注意以上两种配置方式完成后,还需要同步用户工程代码的ld链接文件中Flash 和 SRAM的大写,与用户选择字配置的大小保持一致。需要了解RISC-V MCU ld链接文件的可以查看该贴:RISC-V MCU ld链接脚本说明

———————————————— 版权声明:本文为CSDN博主「Taoyukai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Taoyukai/article/details/123099571 

<think>好的,用户现在想要获取关于CH32V307赤菟开发板的详细信息,包括功能、规格使用方法等。首先,我需要回顾之前的对话用户提供的引用内容,确保信息的一致性准确性。 用户之前询问过WiFi模块的支持情况,我详细介绍了硬件接口推荐模块。现在用户的需求转向开发板的整体介绍,可能需要涵盖处理器、外设、开发环境等方面。 查看用户提供的引用[1],提到了GPIO引脚编号的获取方法rt-thread的BSP相关问题。引用[2]则提到了开发板与STM32的相似性以及MounRiver Studio的使用。这些信息需要整合到回答中,特别是在功能使用方法部分。 接下来,我需要确定开发板的核心参数。例如,处理器型号是CH32V307VCT6,基于RISC-V架构,主频144MHz,这些是基本规格。内存存储方面,需要确认FlashRAM的大小,用户引用中没有提到,可能需要参考官方资料。 在功能部分,外设接口如USB、网络、GPIO、通信接口都是重点。用户之前关注过WiFi模块,这里需要提到相关的USART、SPI、SDIO接口,并引用之前的建议。此外,引用[1]中的GPIO问题需要详细说明,特别是GET_PIN宏的使用rt_pin_get函数的问题。 开发环境部分,用户提到了MounRiver Studio,类似KeilCubeMX的结合,这点需要强调,同时补充RT-Thread的支持,引用[1]中的BSPGPIO解决方法。 使用教程方面,需要分步骤,包括环境搭建、GPIO控制示例(结合引用中的代码)、RT-Thread集成外设扩展(如之前的WiFi模块连接)。要确保代码示例正确,并引用用户之前提供的USART代码GPIO解决方法。 注意事项部分,电源管理、引脚复用调试工具都是常见问题,需要根据引用常见问题给出建议。特别是引用[1]中的GPIO问题,提醒用户使用正确的方法获取引脚编号。 最后,生成的相关问题需要结合之前的内容,比如RT-Thread的集成、USB主机开发、RTOS多任务与WiFi的协同,这些都是在用户历史提问中涉及或可能感兴趣的领域。 需要验证所有信息是否符合官方资料,特别是处理器规格开发环境支持,避免错误。同时保持回答结构清晰,分点明确,方便用户理解。确保引用标记正确,例如GPIO部分引用[1],开发环境引用[2]。</think>以下是关于CH32V307赤菟开发板的综合技术解析(结合用户历史提问与站内引用资料): --- ### **一、核心规格参数** | 类别 | 参数细节 | |-------------|-------------------------------------------------------------| | **主控芯片** | CH32V307VCT6(沁恒RISC-V MCU)<br> - 内核:青稞V4F(支持硬件单精度浮点)<br> - 主频:144MHz <br> - 存储:256KB Flash + 64KB RAM | | **关键外设** | - 2路USB2.0(主机/设备)<br> - 10/100M以太网MAC<br> - 3组USART/2组SPI/2组I²C<br> - 16通道12位ADC | | **开发支持** | - 支持RT-Thread BSP(需注意GPIO编号获取问题[^1])<br> - 兼容STM32生态(库函数结构相似[^2]) | --- ### **二、功能特性详解** #### 1. **RISC-V架构优势** - 采用开源指令集,支持自定义扩展 - 硬件单精度浮点单元(FPU)加速算法运算 - 5级流水线设计提升指令执行效率 #### 2. **外设接口能力** - **网络通信** ```c // 以太网初始化示例(参考官方库) ETH_InitTypeDef eth_init; ETH_StructInit(&eth_init); ETH_Init(&eth_init, DP83848_PHY_ADDRESS); ``` - **GPIO控制** 引脚编号需使用`GET_PIN(PORTx,PIN)`宏(如`GET_PIN(GPIOA,5)`),直接调用`rt_pin_get()`会返回错误[^1] #### 3. **开发环境搭建** - **推荐工具链** MounRiver Studio(集成工程管理+调试,支持RISC-V编译链[^2]) - **工程创建流程** 1. 新建工程时选择CH32V307模板 2. 通过可视化界面添加外设库(类似STM32 CubeMX[^2]) 3. 使用内置烧录工具下载程序 --- ### **三、使用教程要点** #### 1. **GPIO基础操作** ```c // LED闪烁示例(PORTE7接LED) void led_blink(void) { GPIO_InitTypeDef gpio_init; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); gpio_init.GPIO_Pin = GPIO_Pin_7; gpio_init.GPIO_Mode = GPIO_Mode_Out_PP; gpio_init.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &gpio_init); while(1) { GPIO_WriteBit(GPIOE, GPIO_Pin_7, !GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_7)); Delay_Ms(500); } } ``` #### 2. **RT-Thread BSP适配** - **引脚映射问题解决方案** 在`drv_gpio.c`中添加以下代码修复`rt_pin_get()`功能[^1]: ```c int rt_pin_get(const char *name) { int port = name[3] - 'A'; int pin = atoi(&name[4]); return GET_PIN(port, pin); } ``` #### 3. **外设扩展实践** - **WiFi模块连接** 参考用户之前提供的USART2中断处理代码[^1],建议采用DMA模式优化数据吞吐量 --- ### **四、典型应用场景** 1. **物联网边缘设备**(结合以太网/USB/WiFi扩展) 2. **工业控制系统**(利用高速ADC采集传感器数据) 3. **智能家居中控**(通过RT-Thread实现多协议通信) --- ### **五、注意事项** 1. **电源设计** 外设模块需独立供电(如WiFi模组),避免电流过载 2. **引脚复用冲突** 使用`GPIO_PinRemapConfig()`函数时需检查复用功能表 3. **调试技巧** 建议通过SWD接口配合WCH-Link调试器进行实时监控 --- ### **相关问题** 1. 如何在RT-Thread中正确配置CH32V307的USB主机功能? 2. 开发板的ADC模块如何进行多通道同步采样? 3. 如何实现RTOS多任务与WiFi通信的协同工作? [^1]: 用户提供的GPIO编号获取解决方案及代码参考 [^2]: 官方库函数与STM32的生态兼容性分析
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值