硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1479|回复: 9
收起左侧

[Cache] 调用void Cache_Enable(void)程序死机

[复制链接]

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2021-10-4 11:24:19 | 显示全部楼层 |阅读模式
手里有两块STM32H7核心板 ,都是0.8mm 旧版跑一样的程序功能正常,新板调用void Cache_Enable(void)程序死机,我main函数第一句就是这个函数,去掉该函数后,时钟可以正常初始化了,不知道什么问题,之前也将新核心板返厂过,也没查出什么问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2021-10-4 14:08:02 | 显示全部楼层
下载的什么程序,上传到百度云分享下链接。

另外你的核心板接是怎么供电的,怎么和底板你做的底板接线的,方便的话,发个实物图。然后我根据你的情况测试下。
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2021-10-4 15:15:36 | 显示全部楼层
现在好了,RGB硬件那边有点问题,现在是QFALSH烧写按照手册方式字库烧不进去
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2021-10-4 15:19:07 | 显示全部楼层
现在好了,现在是QFLASH按照手册上(参考SPI FLASH)的方式烧写字库不成功
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2021-10-4 15:54:56 | 显示全部楼层
我在找找原因吧
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2021-10-6 14:20:16 | 显示全部楼层
                while(1)
                {
                        retry=(RCC->CFGR&RCC_CFGR_SWS)>>3;                                            /*获取SWS[2:0]的状态,判断是否切换成功                  */
                        if(retry==RCC_CFGR_SW_PLL1)break;                                                    /*成功将系统时钟源切换为pll1_p_ck                      */
                }
新的核心板,程序最简化后只有点灯程序了,单步调试程序死在while循环里,单步Debug调试时钟可以初始化成功,全速运行就卡在while循环里了
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2021-10-6 14:24:22 | 显示全部楼层
/*
**************************************************************************************************************************************
*        函 数 名: SystemClock_Config
*        功能说明: 初始化系统时钟
*                    System Clock source            = PLL (HSE)
*                    SYSCLK(Hz)                     = 400000000 (CPU Clock)
*                   HCLK(Hz)                       = 200000000 (AXI and AHBs Clock)
*                    AHB Prescaler                  = 2
*                    D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
*                    D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
*                    D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
*                    D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)
*                    HSE Frequency(Hz)              = 25000000
*                   PLL_M                          = 5
*                    PLL_N                          = 160
*                    PLL_P                          = 2
*                    PLL_Q                          = 4
*                    PLL_R                          = 2
*                    VDD(V)                         = 3.3
*                    Flash Latency(WS)              = 4
*        形    参: 无
*        返 回 值: 无
**************************************************************************************************************************************
*/
void SystemClock_Config(void)                                                 /*系统时钟配置                                         */
{
        uint16_t retry=0;                                                           /*晶振为25M,推荐值:plln=160,pllm=5,pllp=2,pllq=4.      */
  
  uint32_t PLLM = 5;                                                          /*PLL1分频系数初始化                                   */
        uint32_t PLLN = 160;                                                        /*PLL1倍频系数初始化                                   */
        uint32_t PLLP = 2;                                                          /*PLL1外设时钟初始化给内核                             */
        uint32_t PLLR = 2;                                                          /*PLL1实际没有用到                                     */
        uint32_t PLLQ = 4;                                                                      /*PLL1分频给FMC使用                                    */

  PWR->CR3  &= ~PWR_CR3_SCUEN;                                                                        /*SCUEN=0,锁定LDOEN和BYPASS位的设置                    */
        PWR->D3CR |=  PWR_D3CR_VOS;                                                                          /*VOS=3,Scale1,1.15~1.26V内核电压,                     */
        while((PWR->D3CR&PWR_D3CR_VOSRDY)==0){};                                          /*等待电压稳定                                         */
       

  RCC->CR   |=RCC_CR_HSEON;                                                                                  /*HSEON=1,开启HSE                                      */
        while(((RCC->CR&RCC_CR_HSERDY)==0)&&(retry<0X7FFF))                         /*等待HSE RDY                                          */
  {
    retry++;                                                                  /*计算HSE稳定时间                                      */
  }  

        if(retry!=0X7FFF)
  {
    RCC->PLLCKSELR  |=  RCC_PLLCKSELR_PLLSRC_HSE;                                          /*PLLSRC[1:0]=10,选择HSE作为PLL的输入时钟源            */
    RCC->PLLCKSELR  |=  PLLM<<RCC_PLLCKSELR_DIVM1_Pos;                              /*DIVM1[5:0]=pllm,设置PLL1的预分频系数                 */
    RCC->PLL1DIVR   |=  (PLLN-1)<<RCC_PLL1DIVR_N1_Pos;                              /*DIVN1[8:0]=plln-1,设置PLL1的倍频系数,设置值需减1     */
    RCC->PLL1DIVR   |=  (PLLP-1)<<RCC_PLL1DIVR_P1_Pos;                              /*DIVP1[6:0]=pllp-1,设置PLL1的p分频系数,设置值需减1    */
    RCC->PLL1DIVR   |=  (PLLQ-1)<<RCC_PLL1DIVR_Q1_Pos;                        /*DIVQ1[6:0]=pllq-1,设置PLL1的q分频系数,设置值需减1    */
    RCC->PLL1DIVR   |=  (PLLR-1)<<RCC_PLL1DIVR_R1_Pos;                                    /*DIVR1[6:0]=pllr-1,设置PLL1的r分频系数,设置值需减1,   */
   
    RCC->PLLCFGR    |=  RCC_PLLCFGR_PLL1FRACEN ;                                                /*PLL1小数锁存使能                                     */
    RCC->PLLCFGR    |=  RCC_PLLCFGR_PLL1RGE_2;                                                  /*PLL1RGE[1:0]=2,PLL1输入频率在4~8Mhz之间(25/5=5Mhz)   */
    RCC->PLLCFGR    &= ~RCC_PLLCFGR_PLL1VCOSEL;                                                  /*PLL1VCOSEL=0,PLL1宽的VCO范围,192~836Mhz              */
    RCC->PLLCFGR    |=  RCC_PLLCFGR_DIVP1EN;                                              /*DIVP1EN=1,使能pll1_p_ck                              */
    RCC->PLLCFGR    |=  RCC_PLLCFGR_DIVQ1EN;                                              /*DIVQ1EN=1,使能pll1_q_ck                              */
    RCC->PLLCFGR    |=  RCC_PLLCFGR_DIVR1EN;                                              /*DIVR1EN=1,使能pll1_r_ck                              */
    RCC->CR         |=  RCC_CR_PLL1ON;                                                                /*PLL1ON=1,使能PLL1                                    */
    while((RCC->CR&RCC_CR_PLL1RDY)==0);                                       /*PLL1RDY=1,等待PLL1准备好                             */
   
    RCC->CFGR    |= RCC_CFGR_SW_PLL1<<0;                                                        /*SW[2:0]=3,系统时钟(sys_clk)选择来自pll1_p_ck,即400Mhz*/
    RCC->D1CFGR  &=~RCC_D1CFGR_D1CPRE;                                                          /*D1CPRE[2:0]=0,sys_d1cpre_ck=sys_clk/1=400Mhz,        */
    RCC->D1CFGR  |= RCC_D1CFGR_HPRE_DIV2;                                                        /*HREF[3:0]=8,AHB1/2/3/4=sys_d1cpre_ck/2=200Mhz,       */

                while(1)
                {
      retry=(RCC->CFGR&RCC_CFGR_SWS)>>3;                                            /*获取SWS[2:0]的状态,判断是否切换成功                  */
                        if(retry==RCC_CFGR_SW_PLL1)break;                                                    /*成功将系统时钟源切换为pll1_p_ck                      */
                }
                       
                FLASH->ACR  &=~FLASH_ACR_LATENCY;                                         /*寄存器清零                                           */
    FLASH->ACR  |= FLASH_ACR_LATENCY_4WS;                                                        /*LATENCY[2:0]=4个等待周期(@VOS1 Level,maxclock=210Mhz)*/
                FLASH->ACR  |= FLASH_ACR_WRHIGHFREQ_3;                                                      /*WRHIGHFREQ[1:0]=2,flash访问频率<385Mhz               */
               
                RCC->D1CFGR |= RCC_D1CFGR_D1PPRE_2;                                                          /*D1PPRE[2:0]=4,rcc_pclk3=hclk3/2=100Mhz,APB3=100Mhz   */
                RCC->D2CFGR |= RCC_D2CFGR_D2PPRE1_2;                                                        /*D2PPRE1[2:0]=4,rcc_pclk1=hclk1/2=100Mhz,APB1=100Mhz  */
                RCC->D2CFGR |= RCC_D2CFGR_D2PPRE2_2;                                                        /*D2PPRE2[2:0]=4,rcc_pclk2=hclk1/2=100Mhz,即APB2=100Mhz*/
                RCC->D3CFGR |= RCC_D3CFGR_D3PPRE_2;                                                          /*D3PPRE[2:0]=4,rcc_pclk4=hclk4/2=100Mhz,即APB4=100Mhz */

    /*使用IO的高速模式,要使能IO补偿 */
    RCC->CR       |=  RCC_CR_CSION ;                                          /*使能CSI clock                                        */
    RCC->APB4ENR  |=  RCC_APB4ENR_SYSCFGEN;                                   /*使能SYSCFG clock                                     */
    SYSCFG->CCCSR |=  SYSCFG_CCCSR_EN;                                                    /*EN=1,使能IO补偿单元                                  */

    /*AXI SRAM的时钟自动使能,而D2域的SRAM要单独使能 */       
    RCC->AHB2ENR  |=  RCC_AHB2ENR_D2SRAM1EN;                                  /*D2域的SRAM1使能                                      */
    RCC->AHB2ENR  |=  RCC_AHB2ENR_D2SRAM2EN;                                  /*D2域的SRAM1使能                                      */
    RCC->AHB2ENR  |=  RCC_AHB2ENR_D2SRAM3EN;                                  /*D2域的SRAM1使能                                      */
  }
}
这是完整的时钟初始化程序,供电是DC-DC 12V到5V给核心板供电,有一款同样是0.8m V版核心板是刚换代时候买的测试没有任何问题,新买的核心板是九月买的,发现有这问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2021-10-6 15:00:14 | 显示全部楼层
zhufengzi428 发表于 2021-10-6 14:24
/*
************************************************************************************************ ...

你费这劲干啥,方便的话,能用HAL库配置下不,这种寄存器配置完全没法交流问题。

发个HAL库的RCC配置,然后发个完整的测试工程,你的核心板接是怎么供电的,怎么和底板你做的底板接线的,方便的话,发个实物图我给你看看。

不行就加我QQ:512464265解决下,否则问题解决效率太低
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2021-10-6 15:39:03 | 显示全部楼层
我不使用HAL库,问题暂时解决,原因未找到,时钟初始化中while(1)前加了18个__NOP();优化等级默认或O2,IROM1:0X8000000 0X100000 STARTUP选上 IROM2:0X8100000 0X100000 STARTUP不选,原来为了省事IROM1:0X8000000 0X200000 STARTUP选上
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2021-10-7 08:36:24 | 显示全部楼层
更改SW切换顺序问题解决
    RCC->D1CFGR  |= RCC_D1CFGR_HPRE_DIV2;                                                        /*HREF[3:0]=8,AHB1/2/3/4=sys_d1cpre_ck/2=200Mhz,       */
    RCC->D1CFGR  &=~RCC_D1CFGR_D1CPRE;                                                          /*D1CPRE[2:0]=0,sys_d1cpre_ck=sys_clk/1=400Mhz,        */
    RCC->CFGR    |= RCC_CFGR_SW_PLL1<<0;                                                        /*SW[2:0]=3,系统时钟(sys_clk)选择来自pll1_p_ck,即400Mhz*/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 00:43 , Processed in 0.325110 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表