历史上的今天
返回首页

历史上的今天

今天是:2024年12月13日(星期五)

正在发生

2021年12月13日 | STM32RBT6时钟问题总结

2021-12-13 来源:eefocus

这两天碰到关于CAN总线的问题,当检查配置与CAN分析仪都没问题的时候,陷入了迷茫期,之后在程序中找到对于CAN总线时钟的理解,想到了APB1的时钟可能有问题,对于在这里就对时钟再一次的进行总结。


关于时钟的文件主要有两个:1.system_stm32f10x.c ,2.stm32f10x.h


1.首先在启动文件中我们找到SystemInit()函数

在这里插入图片描述

我们可以看到关于时钟的配置是在main函数之前的,接下来就看system_stm32f10x.c文件内:


void SystemInit (void)

{

  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */

  /* Set HSION bit */

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


  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */

#ifndef STM32F10X_CL

  RCC->CFGR &= (uint32_t)0xF8FF0000;

#else

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

#endif /* STM32F10X_CL */   

  

  /* Reset HSEON, CSSON and PLLON bits */

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


  /* Reset HSEBYP bit */

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


  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */

  RCC->CFGR &= (uint32_t)0xFF80FFFF;


#ifdef STM32F10X_CL

  /* Reset PLL2ON and PLL3ON bits */

  RCC->CR &= (uint32_t)0xEBFFFFFF;


  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x00FF0000;


  /* Reset CFGR2 register */

  RCC->CFGR2 = 0x00000000;

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x009F0000;


  /* Reset CFGR2 register */

  RCC->CFGR2 = 0x00000000;      

#else

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x009F0000;

#endif /* STM32F10X_CL */

    

#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)

  #ifdef DATA_IN_ExtSRAM

    SystemInit_ExtMemCtl(); 

  #endif /* DATA_IN_ExtSRAM */

#endif 


  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */

  /* Configure the Flash Latency cycles and enable prefetch buffer */

  SetSysClock();


#ifdef VECT_TAB_SRAM

  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */

#else

  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */

#endif 

}


然后我们回忆一下在STM32中外设主要用到的时钟是APB1:


     RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,


     RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,


     RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,


     RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 


     RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,


     RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,


     RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,


     RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14


void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));

  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)

  {

    RCC->APB1ENR |= RCC_APB1Periph;

  }

  else

  {

    RCC->APB1ENR &= ~RCC_APB1Periph;

  }

}


以及APB2:


     RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,


     RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,


     RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,


     RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,


     RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,


     RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,


     RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11     


void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));

  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)

  {

    RCC->APB2ENR |= RCC_APB2Periph;

  }

  else

  {

    RCC->APB2ENR &= ~RCC_APB2Periph;

  }

}


AHB:


@arg RCC_AHBPeriph_DMA1


@arg RCC_AHBPeriph_DMA2


@arg RCC_AHBPeriph_SRAM


@arg RCC_AHBPeriph_FLITF


@arg RCC_AHBPeriph_CRC


@arg RCC_AHBPeriph_OTG_FS    


@arg RCC_AHBPeriph_ETH_MAC   


@arg RCC_AHBPeriph_ETH_MAC_Tx


@arg RCC_AHBPeriph_ETH_MAC_Rx


@arg RCC_AHBPeriph_DMA1


@arg RCC_AHBPeriph_DMA2


@arg RCC_AHBPeriph_SRAM


@arg RCC_AHBPeriph_FLITF


@arg RCC_AHBPeriph_CRC


@arg RCC_AHBPeriph_FSMC


@arg RCC_AHBPeriph_SDIO


void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));

  assert_param(IS_FUNCTIONAL_STATE(NewState));


  if (NewState != DISABLE)

  {

    RCC->AHBENR |= RCC_AHBPeriph;

  }

  else

  {

    RCC->AHBENR &= ~RCC_AHBPeriph;

  }

}


STM32F103主要就是这两大时钟,高速和低速,很明显我们可以看到CAN1属于APB1的低速时钟,但是是多少呢?我们在每换一个板的时候都应该检查一下。因为我们有一个不确定的外部时钟。


2.接下来就看stm32f10x.h文件的了

关于外部时钟配置的很重要的一个参数是HSE_VALUE了,所以外部时钟晶振我们选用12M的

在这里插入图片描述

接下来我们就可以返回SystemInit()函数看看APB1的配置过程了:

1.找到SetSysClock()函数,跟着进入:SetSysClockTo72()函数。

在这里插入图片描述

之后我们就来到了这里,一个充满期待的地方"#else"之后我们配置的外部晶振是12M要得到72M的PLL所以我们要给的倍频系数是6而之前我给的是9所以当时的时钟是错的,但是程序还是能跑所以在当时没检查出来,所以通过这件事就可以看出,有时候不是问题有多难,而是你的方法有没有效果,解决问题的能力就是这样一步一步的成长起来的。

推荐阅读

史海拾趣

FLEX LTD公司的发展小趣事

Flex Ltd.(伟创力国际有限公司),作为全球知名的电子制造服务(EMS)供应商,自1969年在美国硅谷成立以来,经历了多个关键的发展阶段和故事。以下是五个与其发展紧密相关的事实性故事:

1. 全球布局的开端:新加坡建厂

1981年,Flex Ltd.在新加坡建立了其第一个海外工厂,这一举措标志着公司正式走出美国,开启了全球化布局的序幕。新加坡工厂的建立不仅为Flex带来了更低的制造成本,还使其能够更贴近亚洲市场,为客户提供更快捷的服务。这一战略性的地理选择为Flex后续在全球范围内的扩张奠定了坚实基础。

2. 纳入纳斯达克上市

随着业务的不断扩展和实力的增强,Flex Ltd.于某年成功在纳斯达克(NASDAQ)上市。这一里程碑事件不仅为公司筹集了更多的发展资金,还极大地提升了其在国际市场上的知名度和影响力。上市后的Flex更加注重财务透明度和公司治理,为股东创造了长期价值。

3. 与华为的合作与风波

Flex与华为的合作曾是业内的佳话。特别是在2018年,Flex承接了华为价值高达25亿美元的代工订单,这一合作极大地推动了Flex的业务增长。然而,随着2019年美国商务部将华为列入“实体清单”,Flex被迫在全球范围内停止与华为的合作,并扣押了华为的物资和设备。这一事件引发了广泛争议,对Flex的声誉和客户关系造成了一定影响。尽管后续双方进行了多轮谈判,但这一风波仍成为了Flex发展历程中一个不可忽视的章节。

4. 供应链的数字化转型

Flex一直致力于通过数字化转型来提高供应链的效率和透明度。公司发起了一项全球计划,旨在通过EDI(电子数据交换)等先进技术实现采购及付款交易的完全自动化。这一举措不仅降低了成本、减少了错误,还提高了供应链的响应能力和可见性。例如,Flex与D公司的EDI项目合作就是其数字化转型的一个成功案例,展示了Flex在推动供应链自动化方面的决心和实力。

5. 环保与社会责任

Flex在快速发展的同时,也积极履行其环保和社会责任。公司遵循欧盟的RoHS和WEEE等环保指令,致力于在电子产品设计和制造过程中减少有害物质的使用,并推动电子废弃物的回收和处理。此外,Flex还通过专项拨款、财务捐助、自愿者行动等多种形式加大对全球社会的支援和投入力度,关注灾难赈济、医疗援助、教育、环保等领域。这些举措不仅提升了Flex的企业形象,也为其可持续发展奠定了坚实的基础。

Deltron / DEM Manufacturing公司的发展小趣事

随着公司实力的不断增强,DEM Manufacturing开始积极拓展国际市场。公司凭借优质的产品和专业的服务,成功打入欧洲、北美等多个地区的市场,并建立了稳定的销售网络。同时,公司还积极参与国际展览和论坛,与国际同行进行交流和合作,不断提升自身的国际影响力。

Endicott Research Group Inc (ERG)公司的发展小趣事

随着医疗、工业和军事市场对电源设备的需求不断增长,ERG凭借其深厚的技术积累和创新能力,逐渐在这些领域获得了广泛的认可。他们的产品以其高性能和稳定性赢得了众多客户的信赖。特别是在医疗设备领域,ERG的电源产品为诊断和治疗设备提供了可靠的动力支持,为医疗行业的发展做出了重要贡献。

FINTEK公司的发展小趣事

FINTEK公司深知技术创新是企业持续发展的核心动力。因此,公司不断加大研发投入,建立了完善的研发体系和激励机制。通过与国内外知名高校和研究机构的合作,FINTEK在人工智能、物联网、5G通信等前沿领域取得了多项重要技术突破。这些创新成果不仅提升了公司的核心竞争力,也为电子行业的未来发展贡献了重要力量。

Cal Crystal Lab Inc / Comclok Inc公司的发展小趣事

随着电子行业的快速发展,技术创新和合作成为了企业发展的重要驱动力。Cal Crystal Lab Inc深知这一点,积极寻求与其他企业的技术合作。通过与国内外知名高校和研究机构的深入合作,公司不断引进新技术、新工艺,提升了产品的技术含量和附加值。同时,Cal Crystal Lab Inc还与其他企业建立了战略合作关系,共同开发新产品、拓展新市场,实现了共赢发展。

BROTHER公司的发展小趣事

随着全球市场的不断扩大,BROTHER意识到要实现持续发展,必须走国际化道路。因此,公司在上世纪五十年代开始积极实施国际化战略。首先,BROTHER在美国纽约建立了销售总部,以更好地服务北美市场。随后,公司又在欧洲等地建立生产基地和销售网络,进一步拓展国际市场。通过国际化战略的实施,BROTHER不仅提升了品牌知名度和市场份额,还积累了丰富的跨国经营经验。

问答坊 | AI 解惑

二种差分探头技术参数比较

这是二种目前顶级的100M,1300V高压差分探头,如果你用这此类探头,从参数上来分析,你认为哪款要好点,探头分为标号1和标号2,点评时不要把标号搞错了,凡是参加的人员,我将把国内市埸上的同一等级(P5205为参照点)共六款在不同频率下所测出的波形与参数提 ...…

查看全部问答>

反馈环路的稳定

这是从哪本书里专门讲环路稳定的,看了不错,和大家一起分享! 本书目录:   详细目录: 第一篇 开关电源的优化设计 第一章 绪论 第一节 电源 第二节 负载 第三节 安全 第二章 电路拓朴的实用选择 第一节 概述 第二节 一般性考 ...…

查看全部问答>

本人有全套车载导航程序,有需要的请 联系我。VC开发,无需控件。QQ:626149468

本人有全套车载导航程序,有需要的请 联系我。底层开发,无需控件。QQ:626149468  能用于WINCE平台。…

查看全部问答>

变频器节电率计算

最近在一泥浆搅拌机上安装一台变频器11kw !工频电流14.7A,电压390V.变频50HZ输入电流6A,电压390V.变频正常工作在25HZ,输入电流1.5A,电压390V:以上数据均用万用表测得!用这些数据可否计算出节电率?最好的办法就是加电表,但没有条件!…

查看全部问答>

奇怪STM32复位问题?

                                 我用STM32f101c6t6和STM32f103vbt6各做20台仪表,复位电路10K电阻和1UF电容组成复位电路,发现103VBT6有时不能顺利 ...…

查看全部问答>

头文件中#ifndef 的作用是什么啊

本帖最后由 dontium 于 2015-1-23 13:36 编辑 #ifndef _AD_func #define _AD_func     void main(); void SystemInit(void); void AdInit(void); #endif 一个头文件  但是不知道什么意思 …

查看全部问答>

关于差分运放时发生的小问题

谁能告诉我对于一个差分运放来说,其中一个输入电压是怎样线性操作的?…

查看全部问答>

近距智能巡航直升机

近距智能巡航直升机 飞行器:遥控直升机。 处理器:arduino单片机或avr单片机。 模块:gps定位模块,gsm短信模块,陀螺仪模块,电源模块,摄像头模块等。 难点:续航能力,障碍识别及规避,升降和盘旋控制,内存卡读写。 功能简介:飞行器由起 ...…

查看全部问答>

收集的一些学习DSP不错的资料,有需要的拿去喽!

收集的一些学习DSP的资料,同志们看看有没有需要的,有需要的就拿去吧~…

查看全部问答>

多个pio的中断可以不可以写在一起,这样

多个pio的中断可以不可以写在一起,这样 IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_BRK_BASE | PIO_FR_BASE | PIO_QS_BASE | PIO_EN_BASE, 1); 一个pio写一句?这样是不是很麻烦…

查看全部问答>