程序运行过程经常 变工作主频 需要注意什么?

我在程序运行中修改CH32V208的主频,经常遇到 程序跑着跑着不跑了的情况。但是不变频就没问题?请问变频有什么注意事项?以下是我的变频程序


void MySystemInit (uint8_t clock)  //clock:144 主频144MHz, clock:32 主频32MHz,

{

  RCC->CTLR |= (uint32_t)0x00000001;

  RCC->CFGR0 &= (uint32_t)0xF0FF0000;

  RCC->CTLR &= (uint32_t)0xFEF6FFFF;

  RCC->CTLR &= (uint32_t)0xFFFBFFFF;

  RCC->CFGR0 &= (uint32_t)0xFF00FFFF;

  RCC->INTR = 0x009F0000;

  switch(clock){

      case 144  :

          MySetSysClockTo144_HSE();

          SystemCoreClock=144000000;

         break; /* 可选的 */

      case 72  :

          MySetSysClockTo72_HSE();

          SystemCoreClock=72000000;

         break; /* 可选的 */


      case 32  :

          MySetSysClockToHSE();//32MHz

          SystemCoreClock=((uint32_t)32000000);

         break;


      /* 您可以有任意数量的 case 语句 */

      default : /* 可选的 */

          MySetSysClockTo144_HSE();

          SystemCoreClock=144000000;

          ;

  }


  USART_Printf_Init( 1000000 );

  SystemCoreClockUpdate();

  Delay_Init();

}


static void MySetSysClockToHSE(void)

{

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;



  RCC->CTLR |= ((uint32_t)RCC_HSEON);


  /* Wait till HSE is ready and if Time out is reached exit */

  do

  {

    HSEStatus = RCC->CTLR & RCC_HSERDY;

    StartUpCounter++;

  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));


  if ((RCC->CTLR & RCC_HSERDY) != RESET)

  {

    HSEStatus = (uint32_t)0x01;

  }

  else

  {

    HSEStatus = (uint32_t)0x00;

  }


  if (HSEStatus == (uint32_t)0x01)

  {

    /* HCLK = SYSCLK */

    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;

    /* PCLK2 = HCLK */

    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;

    /* PCLK1 = HCLK */

    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1;


    /* Select HSE as system clock source

     *  CH32V20x_D6 (HSE=8MHZ)

     *  CH32V20x_D8 (HSE=32MHZ)

     *  CH32V20x_D8W (HSE=32MHZ)

     */

    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));

    RCC->CFGR0 |= (uint32_t)RCC_SW_HSE;


    /* Wait till HSE is used as system clock source */

    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x04)

    {

    }

  }

  else

  {

        /* If HSE fails to start-up, the application will have wrong clock

     * configuration. User can add here some code to deal with this error

         */

  }

}


有没有可能堆栈什么需要设置大一些?因为跑几个循环突然不跑了


您好,请问一下程序中不停改变主频的目的是什么,若是某个外设需要改变时钟,建议可以改变该外设所在总线的时钟。注意改变主频后,要注意外设时钟的同步,建议对外设重新进行初始化,若是程序中含有中断,建议改变主频之前先关闭中断,然后再开启。后续若有问题,可邮箱(lzs@wch.cn)沟通。


可能是发生了时钟Glitch的问题。建议先切回HSI,然后重新配好PLL等待稳定再切回PLL。


你只给出了 MySetSysClockToHSE,却没有 MySetSysClockTo72_HSE、MySetSysClockTo144_HSE

那么无法看到你是怎么切换的。


但是,你应该先切回IRC时钟,等待PLL稳定后再使用PLL时钟。


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