最近在折腾沁恒微的 RISC-V 芯片,官方推荐的开发工具 MounRiver Studio 用了一段时间,踩了不少坑,也总结了一些经验。这篇文章就来分享一下我的使用心得,希望能帮助大家少走弯路。首先,MounRiver Studio 提供了包括代码编辑、编译、调试、烧录等一站式 RISC-V 开发环境。但实际使用中,问题也不少,例如仿真器配置、编译选项优化等等。本文将会深入剖析这些问题,并给出具体的解决方案。
常见问题及解决方案
仿真器配置问题
初次使用 MounRiver Studio 连接仿真器,最容易遇到的就是连接不上,提示各种错误信息。这通常是驱动或者配置的问题。首先,确保你的仿真器驱动已经正确安装。可以在设备管理器中查看是否有未识别的设备。如果驱动没问题,那就要检查 MounRiver Studio 的仿真器配置。
- 打开 MounRiver Studio,选择
Debug->Debug Configurations。 - 在左侧选择你的项目,然后在右侧的
Debugger选项卡中,确保选择了正确的仿真器类型。常用的有 J-Link 和 DAP-Link,根据你的实际情况选择。 - 在
Interface选项卡中,设置仿真器的接口,通常是SWD或JTAG。注意SWD模式需要正确的引脚连接。
# 仿真器配置示例
interface swd
transport select swd
set CHIP_NAME CH32V307
# 其他配置...
编译选项优化
MounRiver Studio 默认的编译选项可能不是最优的,尤其是在追求代码体积和执行效率的时候。可以通过修改 Makefile 文件来优化编译选项。
- 找到你的项目的 Makefile 文件。通常位于项目根目录下。
- 修改
CFLAGS变量,添加或修改编译选项。例如,-O2优化级别可以提高执行效率,-Os可以减小代码体积。
# Makefile 示例
CFLAGS += -O2 -Wall -Wextra -fno-common # 优化级别,警告,其他选项
LDFLAGS += -Wl,-gc-sections # 链接选项,去除未使用的代码
解决 printf 函数重定向问题
在嵌入式开发中,printf 函数默认是不会输出到串口的。需要进行重定向,才能在串口终端中看到打印信息。
- 在你的代码中,添加
_write函数的定义。 - 在
_write函数中,调用串口发送函数,将要打印的数据发送到串口。
// printf 重定向示例
#include <stdio.h>
#include "ch32v30x_uart.h" // 假设你使用了沁恒的 UART 库
int _write(int file, char *ptr, int len)
{
for(int i = 0; i < len; i++)
{
UART_SendData(USART1, (uint8_t) ptr[i]); // 使用 USART1 发送数据
while (UART_GetFlagStatus(USART1, UART_FLAG_TC) == RESET); // 等待发送完成
}
return len;
}
- 在使用
printf函数之前,需要初始化串口。
// 串口初始化示例
void USART1_Init(uint32_t baudrate)
{
UART_InitTypeDef UART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
// USART1 TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART1 RX GPIOA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
UART_InitStructure.UART_BaudRate = baudrate; // 设置波特率
UART_InitStructure.UART_WordLength = UART_WordLength_8b;
UART_InitStructure.UART_StopBits = UART_StopBits_1;
UART_InitStructure.UART_Parity = UART_Parity_No;
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
UART_InitStructure.UART_Mode = UART_Mode_Tx | UART_Mode_Rx;
UART_Init(USART1, &UART_InitStructure);
UART_Cmd(USART1, ENABLE);
}
实战避坑经验
- 仔细阅读官方文档:沁恒微的官方文档非常详细,一定要仔细阅读,特别是关于芯片的启动流程和外设的使用方法。
- 善用 MounRiver Studio 的调试功能:MounRiver Studio 的调试功能非常强大,可以单步调试、设置断点、查看变量值等。善用这些功能可以快速定位问题。
- 关注官方论坛和社区:沁恒微的官方论坛和社区有很多开发者,可以在这里提问和交流经验。
- 多做实验:嵌入式开发需要多做实验,才能更好地理解芯片的特性和开发工具的使用方法。
MounRiver Studio 的未来展望
虽然 MounRiver Studio 目前还有一些不足,但总体来说,它是一款非常实用的 RISC-V 开发工具。随着 RISC-V 生态的不断发展,相信 MounRiver Studio 也会越来越完善。希望本文能帮助大家更好地使用 MounRiver Studio 进行 RISC-V 开发。
冠军资讯
代码一只喵