CH32V307/CH32V203 IO极限翻转测试 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

[文章]

CH32V307/CH32V203 IO极限翻转测试

本帖最后由 l爱学习 于 2023-8-30 14:16 编辑

记录RISC-V MCU CH32V307/CH32V203 在144MHz主频、-Os优化下,IO极限翻转频率。
GPIO初始化代码如下:
  1. /*********************************************************************
  2. * @fn      GPIO_Toggle_INIT
  3. *
  4. * [url=home.php?mod=space&uid=2666770]@Brief[/url]   Initializes GPIOA.0
  5. *
  6. * [url=home.php?mod=space&uid=1141835]@Return[/url]  none
  7. */
  8. void GPIO_Toggle_INIT(void)
  9. {
  10.     GPIO_InitTypeDef GPIO_InitStructure = {0};
  11.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  16. }
  17. int main(void)
  18. {
  19.   
  20.     Delay_Init();
  21.     USART_Printf_Init(115200);
  22.     printf("ch32v307 hello world\r\n");
  23.     GPIO_Toggle_INIT();
  24.     while(1)
  25.     {
  26.         GPIOA->OUTDR |= GPIO_Pin_0;
  27.         GPIOA->OUTDR &= ~GPIO_Pin_0;
  28.     }
  29. }
使用A0作为测试IO口,初始化为推挽输出模式,翻转速度设置为50MHz。

翻转频率为 9.6MHz,测试结果如下:


9.6MHz 的速度与预估差距有点大,看下反汇编结果如下:

两条C语言代码,需要翻译成7条汇编指令执行,速度当然快不起来。
7条汇编指令,共花费 144MHz / 9.6MHz = 15 个周期,
换个方式,采用异或的方式翻转IO GPIOA->OUTDR ^= GPIO_Pin_0;反汇编只有4条指令。

测试结果如下:

只有 9MHz,虽然执行指令数量只有 4 条,但是翻转速度竟然变慢了,共花费 144Mhz / 9MHz = 16 个周期。
我猜测是 xori 这条异或指令的执行周期比 ori 或 addi 指令执行周期长导致的。
为了测试 IO 的极限翻转速度,将执行指令压缩至最短,不用 ori 或 addi 指令,共3条汇编指令,代码如下:

测试结果如下:

IO翻转速度提高到 24MHz, 3条汇编指令共花费 144Mhz / 24MHz = 6 个周期。
上面测试的是GPIO的极限翻转速率,即通过GPIO引脚模拟通信协议波特率最高不会超过 24Mbps
如需更高频率,可以通过 SPI 等外设模拟。




回帖(1)

更多回帖

×
发帖