打印
[单片机芯片]

【沁恒CH32V307 RISC-V开发板测评】05 GPIO极限测试

[复制链接]
813|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本次测评主要测试一下CH32V307 GPIO的翻转速度。
一、背景
CH32V307搭载了一颗青稞V4F内核,支持硬件单精度浮点运算,144MHz主频下coremark达380,GPIO作为最基础的外设直接影响实时控制性能,因此对GPIO的翻转速度测试是很有必要的。
另外由于库函数的封装,会影响真实的硬件速度;输出速度50Mhz会误解为信号输出上限。
二、测试环境准备
1、核心板
CH32V307V-R2-1V1,外部晶振为8Mhz,通过PLL倍频到144Mhz
2、使用PD0作为测试引脚
3、测量设备
使用正点原子mini示波器,探头X1衰减模式
三、代码配置
1、基于沁恒官方的MRS开发工具,新建工程,生成的主函数如下
/*********************************************************************
* @fn      main
*
* [url=home.php?mod=space&uid=247401]@brief[/url]   Main program.
*
* [url=home.php?mod=space&uid=266161]@return[/url]  none
*/
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);  
    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    printf("This is printf example\r\n");

    while(1)
    {

    }
}


2、初始化测试引脚
/*********************************************************************
* @fn      GPIO_Toggle_INIT
*
* @brief   Initializes GPIOD.0
*
* @return  none
*/
void GPIO_Toggle_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}


3、编写IO翻转代码
/* Global define */
#define USE_LIB 0
#define USE_REG 0
#define USE_ASM 1

/*********************************************************************
* @fn      main
*
* @brief   Main program.
*
* @return  none
*/
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);  
    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    GPIO_Toggle_INIT();

    while(1)
    {
#if USE_LIB
        GPIO_SetBits(GPIOD,GPIO_Pin_0);
        GPIO_ResetBits(GPIOD,GPIO_Pin_0);
#elif USE_REG
        GPIOD->BSHR = GPIO_Pin_0;
        GPIOD->BCR = GPIO_Pin_0;
#elif USE_ASM
    //GPIO_Toggle_Asm((uint32_t)&GPIOD->OUTDR);
    GPIO_Toggle_Asm();
#endif
    }
}


4、新建汇编文件
gpio_toggle.s
.section .text
.global GPIO_Toggle_Asm

GPIO_Toggle_Asm :
    # 高速模式(约48MHz)
    li t1, 0x40011410   # GPIOD_BSHR地址
    li t2, 0x40011414   # GPIOD_BCR地址
    li a5, 0x0001     # PD0置位值
    loop:

    sw a5, 0(t1)      # 输出高电平
    sw a5, 0(t2)      # 输出低电平
    j loop


四、实测结果
1、使用库函数进行GPIO翻转,将USE_LIB宏定义的值改为1,其他值为0
实测波形如图,翻转速度为9Mhz


2、使用寄存器进行GPIO翻转,将USE_REG宏定义的值改为1,其他值为0
实测波形如图,翻转速度为24Mhz


3、使用汇编语言进行GPIO翻转,将USE_ASM宏定义的值改为1,其他值为0
实测波形与寄存器GPIO翻转一样,都为24Mhz.
从指令周期来分析,寄存器需要两个周期

汇编也只有两个周期

按道理只需要两个周期,频率能达到更高,但
1、SRAM写操作需2~3周期;
2、连续sw指令导致数据依赖,RISC-V单发射流水线无法并行执行。
综上,CH32V307的极限翻转速度只有24Mhz







使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:一切皆有可能

45

主题

473

帖子

3

粉丝