请教CH582如何用IO模拟4M高速采集端口数据?

#define PK GPIO_Pin_14

int main()

{

  SetSysClock( CLK_SOURCE_PLL_80MHz );

  GPIOB_ModeCfg( PK, GPIO_ModeIN_Floating );    //PK=1M

  while( 1 )

  {

    if(  GPIOB_ReadPortPin(  PK  )   )  GPIOB_SetBits(LED);

    else  GPIOB_ResetBits(LED);

  }

image.png

请问如上图显示,PK输入800K,有丢步现象,1.5M的话,丢步更厉害,不知如何用IO模拟4M高速采集端口数据?


将主循环的代码放到RAM跑,把主程序封成一个函数,之后用__HIGH_CODE修饰。

emobile_2022-03-30_14-57-31.png


按你的方法,代码如下,测试一下,效果有所改进,但1.5M就出现丢步现象。按理说80M的系统时钟处理1.5M的脉冲绰绰有余,因为MPU大部分指令应该是一个系统时钟吧?上次中断也是测试过,也是类似现象。有没有关于CH582的一些参数指标的文档,看一下。

#define PK GPIO_Pin_14

_HIGH_CODE

void acq( void )

{


  while( 1 )

  {

    if(  GPIOB_ReadPortPin(  PK  )   )  GPIOB_SetBits(LED);

    else  GPIOB_ResetBits(LED);

  }

}

int main()

{

  SetSysClock( CLK_SOURCE_PLL_80MHz );

  GPIOB_ModeCfg( PK GPIO_ModeIN_Floating );    //PK=1M

  acq( );

}


我又测试了一下,循环执行一条指令,如下:

_HIGH_CODE

void acq( void )

 while( 1 )

  {

    GPIOB_InverseBits(PLED);

  }

输出频率为5M,80M的主频,怎么会只输出5M??


这边虽然是一句函数,但是汇编指令是五条,那么一个周期就是十条,如果一条指令需要一个机器周期,那么理论上输出频率是8M,如果想提高的话,需要在主循环中多加几条翻io的函数,那么一个周期需要的平均指令就会减少,输出10M以上。

这样写也会提高不少

 R32_PA_OUT |= GPIO_Pin_4;

 R32_PB_CLR = GPIO_Pin_4;


只有登录才能回复,可以选择微信账号登录