tottionly 发表于 2020-2-11 16:45

请问HC32F030 IO翻转最高速率是多少

本帖最后由 tottionly 于 2020-2-11 16:48 编辑

int main(void)
{

      static uint32_t u32temp1 = 0;
      static uint32_t u32temp2 = 0;

      Sys_Clk_Init();
      u32temp1= Sysctrl_GetHClkFreq();
      u32temp2= Sysctrl_GetPClkFreq();

      Led_PortInit();
      
      while(1)
      {
            setBit(((uint32_t)&M0P_GPIO->PABSET + GpioPortD), GpioPin5, TRUE);
            setBit(((uint32_t)&M0P_GPIO->PABCLR + GpioPortD), GpioPin5, TRUE);
      }
               
}

static void Led_PortInit(void)
{
    stc_gpio_config_t pstcGpioCfg;
      
   
    ///< 打开GPIO外设时钟门控
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
   
    ///< 端口方向配置->输出
    pstcGpioCfg.enDir = GpioDirOut;
    ///< 端口驱动能力配置->高驱动能力
    pstcGpioCfg.enDrv = GpioDrvH;
    ///< 端口上下拉配置->无上下拉
    pstcGpioCfg.enPuPd = GpioNoPuPd;
    ///< 端口开漏输出配置->开漏输出关闭
    pstcGpioCfg.enOD = GpioOdDisable;
    ///< 端口输入/输出值寄存器总线控制模式配置->AHB
    pstcGpioCfg.enCtrlMode = GpioAHB;
   
    ///< GPIO IO PD05初始化(PD05在STK上外接LED)
    Gpio_Init(GpioPortD, GpioPin5, &pstcGpioCfg);

}

HCLK已经设置为48MHz,通过Sysctrl_GetHClkFreq()函数可读取。
简单测试IO翻转的最高频率,测下来翻转频率是1.5MHz. 理论上不应该这么慢,是哪里设置有问题吗?
感谢解答。

martinhu 发表于 2020-2-11 17:47

030支持单周期的IO翻转,如果要这么设置,“
[*]   ///< 端口输入/输出值寄存器总线控制模式配置->AHB
[*]    pstcGpioCfg.enCtrlMode = GpioAHB;”
这里不应该是AHB

另外要使用寄存器需PxOUT来控制IO的输出,
而且不能使用库函数操作,因为库函数也额外花费代码执行时间,到时翻转频率变慢。

你可以试一下以下这段代码,用KEIL5以后的版本,
PA012是单周期执行的,PB0不是。

int32_t main(void)
{
    uint32_t u32High = 0x00000007;///< PA0/1/2
    uint32_t u32Low= 0x00000000;

    stc_sysctrl_pll_config_t stcPLLCfg;

    DDL_ZERO_STRUCT(stcPLLCfg);

   //Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);
       
    //48M时候需要加flash等待
    __set_PRIMASK(1);//Disableinterrupt
    //Flash_WaitCycle(FlashWaitCycle1);
    __set_PRIMASK(0);//Enableinterrupt
       

    stcPLLCfg.enInFreq    = SysctrlPllInFreq4_6MHz;   //RCH 4MHz
    stcPLLCfg.enOutFreq   = SysctrlPllOutFreq36_48MHz;//PLL 输出48MHz
    stcPLLCfg.enPllClkSrc = SysctrlPllRch;            //输入时钟源选择RCH
    stcPLLCfg.enPllMul    = SysctrlPllMul6;//SysctrlPllMul12;            //4MHz x 6 = 24MHz
    Sysctrl_SetPLLFreq(&stcPLLCfg);
    Sysctrl_SetPLLStableTime(SysctrlPllStableCycle16384);
    Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE);

    ///< 时钟切换
    Sysctrl_SysClkSwitch(SysctrlClkPLL);



    ///< 打开GPIO外设时钟门控
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
               
    M0P_GPIO->CTRL2_f.AHB_SEL = 0;

    M0P_GPIO->PAOUT = u32High;
    M0P_GPIO->PADIR = u32Low;

    M0P_GPIO->PBDIR_f.PB00 = 0;

    while(1)
    {
      M0P_GPIO->PAOUT = u32High;
      M0P_GPIO->PAOUT = u32Low;
      M0P_GPIO->PAOUT = u32High;
      M0P_GPIO->PAOUT = u32Low;
      M0P_GPIO->PAOUT = u32High;
      M0P_GPIO->PAOUT = u32Low;
      M0P_GPIO->PAOUT = u32High;
      M0P_GPIO->PAOUT = u32Low;
      M0P_GPIO->PAOUT = u32High;
      M0P_GPIO->PAOUT = u32Low;
      M0P_GPIO->PAOUT = u32High;
      M0P_GPIO->PAOUT = u32Low;
      M0P_GPIO->PAOUT = u32High;
      M0P_GPIO->PAOUT = u32Low;
      M0P_GPIO->PAOUT = u32High;
      M0P_GPIO->PAOUT = u32Low;
      M0P_GPIO->PAOUT = u32High;
      M0P_GPIO->PAOUT = u32Low;

      M0P_GPIO->PBOUT_f.PB00 = 1;
      M0P_GPIO->PBOUT_f.PB00 = 0;
    }
}

tottionly 发表于 2020-2-11 18:09

martinhu 发表于 2020-2-11 17:47
030支持单周期的IO翻转,如果要这么设置,“
[*]   ///< 端口输入/输出值寄存器总线控制模式配置->AHB
[*]...

感谢回复。
已经测试,按照这个代码,如果HCLK=48MHz,IO翻转频率最高是15MHz左右。

gx_huang 发表于 2020-2-11 18:26

你用库函数,速度能快才怪呢,光函数调用就很多时间了

martinhu 发表于 2020-2-12 08:52

tottionly 发表于 2020-2-11 18:09
感谢回复。
已经测试,按照这个代码,如果HCLK=48MHz,IO翻转频率最高是15MHz左右。 ...

MCU主频在24MHz时钟以下的时候,使用FAST IO模式可以做到每个HCLK时钟周期IO翻转一次,24M时钟以上,因为需要加Flash等待周期,虽然FAST IO 是单周期的指令,但因为读取Flash指令的时间变多了,所以IO做不到每个HCLK翻转


菜鸟同学 发表于 2020-2-13 12:16

martinhu 发表于 2020-2-12 08:52
MCU主频在24MHz时钟以下的时候,使用FAST IO模式可以做到每个HCLK时钟周期IO翻转一次,24M时钟以上,因为 ...

好就你说的读取flash需要延迟,直接跑到RAM 中试试,MCU的IO 翻转速度24M那很吊。我目前用过的还没有发现有这么高的。

天苍苍野茫茫 发表于 2020-2-18 15:48

最起码在8M以上!

天苍苍野茫茫 发表于 2020-2-18 15:49

MCO输出功能可以到主频的4分频

desertsailor 发表于 2020-11-26 22:02

可惜HC32F030读取FLASH没有CACHE,48M主频必须要白等一个周期,STM这方面做得就好些。

desertsailor 发表于 2020-11-26 22:54

本帖最后由 desertsailor 于 2020-11-26 22:57 编辑

FAST IO只能用于OUT和IN寄存器,改写其中一位的时候其余位也赋了值,这样就要求写之前必须先读,这样一来一回耽误了时间,单周期也就没啥意义了,如果置位和清零寄存器也能适用单周期就完美了。

martinhu 发表于 2020-11-28 21:40

desertsailor 发表于 2020-11-26 22:02
可惜HC32F030读取FLASH没有CACHE,48M主频必须要白等一个周期,STM这方面做得就好些。 ...
华大M4的芯片也有cache,200M主频的时候flash也可以做到几乎0等待,
不过ST的030有cache吗?你确定?

desertsailor 发表于 2020-11-29 10:29

martinhu 发表于 2020-11-28 21:40
华大M4的芯片也有cache,200M主频的时候flash也可以做到几乎0等待,
不过ST的030有cache吗?你确定? ...

STM的F0、F1和F4都有CACHE的,只是大小和性能不同,F0的是3个32位的预取指缓存,F1是2个64的预取指缓存,F4的更大而且还区分I-CODE和D-CODE

和下土 发表于 2020-11-29 12:06

差不多8mdh\

和下土 发表于 2020-11-29 12:07

华大M4的芯片确实有cache

和下土 发表于 2020-11-29 12:08

48M主频必须要白等一个周期吗?
页: [1]
查看完整版本: 请问HC32F030 IO翻转最高速率是多少