STM32F429使用HAL库的Stm32_Clock_Init()函数无法通过

2019-07-20 00:53发布

我自行设计并焊接了STM32F429的电路板,使用Jlink烧录程序没问题,但是如果没有注释掉Stm32_Clock_Init(360,25,2,8); 函数的话,程序会一直无法进行。如果注释掉这一个函数,那么程序可以正常进行,FMC驱动TFTLCD正常,按键检测也正常,但是屏幕刷新速度肉眼看上去有一点点的慢,不知道是什么原因。修改了正点原子哥的代码,把单次判断放到了循环判断内,依旧无法通过。现在不知道是什么原因,求解答!

void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
{
    HAL_StatusTypeDef ret = HAL_OK;
    RCC_OscInitTypeDef RCC_OscInitStructure;
    RCC_ClkInitTypeDef RCC_ClkInitStructure;

    __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟

    //下面这个设置用来设置调压器的输出电压级别,以便器件未以最大频率工作
    //时钟性能与功耗实现平衡,此功能只有STM32F42xx和STM32F43xx器件有
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1

    RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;    //时钟源为HSE
    RCC_OscInitStructure.HSEState=RCC_HSE_ON;                      //打开HSE
    RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLL
    RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;/PLL时钟源选择HSE
    RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63
    RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432
    RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这四个值!)
    RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15
    ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化
       
    while(ret!=HAL_OK);         //会在这里卡住

    ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能
    while(ret!=HAL_OK);         //debug跳过上一个卡住的地方后这里也会卡

    //选中PLL作为系统时钟源并且配置HCLK、PCLK1和PCLK2
    RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
    RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL
    RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1
    RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4
    RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2
    ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期
               
    while(ret!=HAL_OK);    //这里也会卡住
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
KarlinTarvile
1楼-- · 2019-07-20 02:55
昨天晚上去实验室更换了一个晶振,然后立刻就好了。目前知道了原因是劣质晶振,问题已经解决。感谢原子哥帮顶!
KarlinTarvile
2楼-- · 2019-07-20 06:25
/* Wait till HSE is ready */  
        while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET)
        {
          if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE)
          {
            return HAL_TIMEOUT;
          }
        }

再次debug之后程序卡在这里,我现在要重新修补一下25MHz的晶振,然后看结果
正点原子
3楼-- · 2019-07-20 11:23
 精彩回答 2  元偷偷看……
皇者~景帝
4楼-- · 2019-07-20 12:54
我也出现这个问题
MouseSun
5楼-- · 2019-07-20 18:09
 精彩回答 2  元偷偷看……
董想
6楼-- · 2019-07-20 23:34
 精彩回答 2  元偷偷看……

一周热门 更多>