历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2020年02月22日 | STM32F4设置系统时钟源为内部HSI

2020-02-22 来源:eefocus

最近项目需要在调试STM32时遇到外部晶振时钟不稳定,查看RCC_CR寄存器的第17位始终处于0,表示外部晶振始终处于不稳定状态:

当HSE开启时,如果HSERDY一直处于0时,则芯片会启动内部16Mhz晶振,但是此时PLL分频无效,整个系统降到了16Mhz,无法忍受,立刻启动内部时钟源HSI为系统时钟, 同时通过配置PLL,将系统时钟配置到168Mhz,


由于系统设置时钟源是在系统起来厚,main函数之前设置的,在SetSysClock(),首先需要自己设置HSI为系统时钟源,代码如下:


/**

  * @brief  Configures HSI as the System clock source

  **/  

void HSI_SetSysClock()

{

  __IO uint32_t HSIStartUpStatus = 0;

  

  RCC_DeInit();

 

  //set HSI

  RCC_HSICmd(ENABLE);

 

  HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;

 

  if (HSIStartUpStatus == RCC_CR_HSIRDY)

  {    

    /* Select regulator voltage output Scale 1 mode */

     RCC->APB1ENR |= RCC_APB1ENR_PWREN;

     PWR->CR |= PWR_CR_VOS;

 

     // HCLK = SYSCLK / 1

     RCC_HCLKConfig(RCC_SYSCLK_Div1);

 

    /* HCLK = SYSCLK / 1*/

    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;

 

#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) ||  defined(STM32F412xG) || defined(STM32F446xx) || defined(STM32F469_479xx)    

    /* PCLK2 = HCLK / 2*/

    RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;

    

    /* PCLK1 = HCLK / 4*/

    RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;

#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx  || STM32F412xG || STM32F446xx || STM32F469_479xx */

 

#if defined(STM32F401xx) || defined(STM32F413_423xx)

    /* PCLK2 = HCLK / 1*/

    RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;

    

    /* PCLK1 = HCLK / 2*/

    RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;

#endif /* STM32F401xx || STM32F413_423xx */

 

    #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx)    

    /* Configure the main PLL */

    RCC->PLLCFGR = HSI_PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |

                   (RCC_PLLCFGR_PLLSRC_HSI) | (PLL_Q << 24);

#endif /* STM32F40_41xxx || STM32F401xx || STM32F427_437x || STM32F429_439xx || STM32F469_479xx */

 

#if  defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx)

    /* Configure the main PLL */

    RCC->PLLCFGR = HSI_PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |

                   (RCC_PLLCFGR_PLLSRC_HSI) | (PLL_Q << 24) | (PLL_R << 28);

#endif /* STM32F412xG || STM32F413_423xx || STM32F446xx */

    

    /* Enable the main PLL */

    RCC->CR |= RCC_CR_PLLON;

    /* Wait till the main PLL is ready */

    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {

    }

 

    #if defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx) || defined(STM32F469_479xx)

    /* Enable the Over-drive to extend the clock frequency to 180 Mhz */

    PWR->CR |= PWR_CR_ODEN;

    while((PWR->CSR & PWR_CSR_ODRDY) == 0)

    {

    }

    PWR->CR |= PWR_CR_ODSWEN;

    while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)

    {

    }      

    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */

    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;

#endif /* STM32F427_437x || STM32F429_439xx || STM32F446xx || STM32F469_479xx */

 

#if defined(STM32F40_41xxx)  || defined(STM32F412xG)  

    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */

    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;

#endif /* STM32F40_41xxx  || STM32F412xG */

 

#if defined(STM32F413_423xx)  

    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */

    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_3WS;

#endif /* STM32F413_423xx */

 

#if defined(STM32F401xx)

    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */

    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;

#endif /* STM32F401xx */

 

    /* Select the main PLL as system clock source */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

    RCC->CFGR |= RCC_CFGR_SW_PLL;

 

    /* Wait till the main PLL is used as system clock source */

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);

    {

    }

  }

}

将上述代码添加到,设置外部时钟源失败异常处理流程SetSysClock()函数中:

系统恢复如初,系统时钟源恢复到168Mhz,很happy 

推荐阅读

史海拾趣

DUCATI公司的发展小趣事

在电子行业中,DUCATI公司(杜卡迪摩托控股公司)的发展历程尤为独特,它从一个无线电通信技术的研究和生产公司,逐渐发展成为享誉全球的摩托车生产商。以下是五个与DUCATI公司电子行业起源及其后来摩托车业务发展起来的相关故事:

  1. 无线电通信技术的奠基

1926年,DUCATI家族工程师Antonio Cavalieri Ducati与意大利波隆那地区的绅士合作,成立了杜卡迪无线电器材制造公司。公司专注于无线电通信技术的研究和生产,为后来的发展奠定了坚实的基础。尽管当时并未涉足摩托车行业,但这一技术积累为公司带来了重要的经验和资金储备。

  1. 战火中的坚持与转型

第二次世界大战期间,杜卡迪的工厂不幸毁于战火。然而,在战后的废墟中,公司看到了对车辆需求的逐渐增加。不久后,杜卡迪开始踏入其他工业领域,为后来的摩托车业务探索了新的道路。这种逆境中求生存、转型谋发展的精神,是杜卡迪文化中不可或缺的一部分。

  1. Cucciolo引擎的突破

1946年,杜卡迪推出了企业史上的第一具单汽缸引擎Cucciolo。这款引擎由当时的意大利工业振兴协会管理,设计者为都灵的SIATA公司。虽然最初只是装置在脚踏车上的小型引擎,但这一突破性的技术为杜卡迪进入机车制造领域打开了大门。Cucciolo引擎的成功研发,为杜卡迪摩托车部门的成立奠定了基础。

  1. Cruiser机车的问世

1952年,杜卡迪推出了第一部配备电动启动马达和自动变速系统、排气量175cc的机车Cruiser。这款机车标志着杜卡迪正式成为机车制造厂,并为其在摩托车行业的地位奠定了基础。Cruiser的成功问世,进一步巩固了杜卡迪在摩托车市场的地位。

  1. Monster与916的辉煌

进入90年代后,杜卡迪在摩托车设计和技术上取得了重大突破。1993年,阿根廷设计师Miguel Galluzzi设计的Monster为杜卡迪在财务危机的愁云惨雾中找到了曙光。而1994年推出的916更是杜卡迪划时代的革命性作品,这款车型获得了世界经典名车的殊荣。Monster和916的成功设计不仅展现了杜卡迪在摩托车设计上的独特魅力,也为其在全球市场上赢得了广泛的赞誉。

以上五个故事展示了DUCATI公司在电子行业中的起源以及后来摩托车业务的发展过程。这些故事不仅体现了公司的创新精神和技术实力,也展现了其在逆境中求生存、转型谋发展的坚定信念。

Dynachip Corp公司的发展小趣事

Dynachip Corp深知品质对于电子产品的重要性,因此他们建立了严格的质量管理体系,从原材料采购到生产过程再到成品检测,每一个环节都严格把控。他们还引进了先进的生产设备和技术,确保产品的稳定性和可靠性。这种对品质的坚持使Dynachip Corp的产品在市场上获得了广泛认可,客户群逐渐扩大。

Bellnix Co Ltd公司的发展小趣事

在电子行业竞争日益激烈的背景下,Bellnix意识到成本控制的重要性。公司开始着手优化供应链,通过与供应商建立长期合作关系、实行集中采购等方式,降低采购成本。同时,公司还引入先进的生产管理系统,提高生产效率,减少浪费。这些措施有效地降低了产品成本,使Bellnix在市场上更具竞争力。

Genisco Electronics公司的发展小趣事
如电压传感器、频率检测器等,用于实时监测电网电源和自备发电电源的状态。
EREM公司的发展小趣事

随着全球市场的不断融合,EREM公司开始寻求国际合作机会。通过与国外知名企业的合作,EREM不仅将产品销售到了全球各地,还学到了许多先进的管理经验和技术。同时,EREM也积极参与国际展览和交流活动,提升了品牌知名度和影响力。这些努力使得EREM在国际市场上逐渐崭露头角。

宜源科技(ETERNAL)公司的发展小趣事

在电子行业的激烈竞争中,宜源科技公司始终将技术创新作为公司发展的核心驱动力。公司投入大量研发资源,成功开发出一系列具有自主知识产权的电子产品和解决方案。其中,其独特的智能芯片技术,不仅大幅提升了产品的性能,还降低了生产成本,使得宜源科技在市场中迅速脱颖而出。

问答坊 | AI 解惑

晶体管的置换(代换)原则

我们在维修、设计和实验或试制中,常常会碰到晶体管的置换(代换)问题。如果掌握了晶体管的置换(代换)原则,就能使工作初有成效。其置换(代换)原则可划分为三种:即类型相同、特性相近、外形相似。 开关电源,变压器,电源模块,脉宽调制,发 ...…

查看全部问答>

风电词汇中英文对照表4

sprocket 链轮齿 spur gear正齿轮 spur wheel gear正齿轮 square 平方;方块;【修】矩形[SQ],正方形的, 四方的, 直角的, 正直的, 公平的, 结清的, 平方的, 彻底的 square nut 四方螺母, 螺帽 square thread矩形螺纹 square-head bo ...…

查看全部问答>

KITL的问题

以太网的KITL已连通,加载了一些东西就停了。用的优龙2440a开发板, PB中显示: 294772034 PID:c3d93bfa TID:c3d934aa 0x83d93000: [dm9: Chip signature is 90000A46 4294772041 PID:c3d93bfa TID:c3d934aa 0x83d93000: ***NDIS*** (a, 534) ...…

查看全部问答>

关于altera与actel芯片通信的问题

我现在在做毕业设计,我在altera的开发板上进行了简单SPI口的设计,通信正常,能用四根线进行十位二进制的串行传输,并能将传来的数据显示在四位数码管上,也就是用同一块altera的芯片做主片和从片的任务,试验是对的。然后我再将从片的程序烧在ACT ...…

查看全部问答>

EVE下移位的奇怪问题

请问: 1 如果我的CPU是32的,byte a=16; a…

查看全部问答>

51是很流行,很强大,但不适合未来硬件系统的发展.

51是很流行,很强大,但不适合未来硬件系统的发展. 虽然勉强有许多厂商提供带扩展的接口、单周期的片子,51的速度也太落后了,首先指令位长这点就是命门。 流行的东东不一定是好的,关键是要技术能进步的。 执行一个程序周期太长是致命伤。 现在 ...…

查看全部问答>

STM32DSPLib数字滤波FIR没例子啊!

STM32 DSPLib 数字滤波FIR没例子啊!不知到如何使用。;void fir_16by16_stm32(void *a, void *x, COEFS *c, u32 N) 哪位大虾指教一下。谢谢!…

查看全部问答>

TPS61059 可为作为相机闪光灯或电影照明灯的白光 LED 供电

使用白光 LED 的一个难题在于如何使用输入电压宽泛的电池为其供电。 德州仪器 (TI) 便携式电源 DC/DC 应用部工程师Scot Lester为您答疑解惑。…

查看全部问答>

cpld内程序问题?请高手解答

我在CPLD内写了如下程序:always@(posedge CLK1)begin     if(reset==0)    OE373 = 1; else if(ADDR[6:0]==7\'h19&&STRB==1\'b0)                OE37 ...…

查看全部问答>