历史上的今天
返回首页

历史上的今天

今天是:2025年08月16日(星期六)

正在发生

2019年08月16日 | 5.HAL库之时钟系统及定时器SYSTICK

2019-08-16 来源:eefocus

1.系统时钟树:


LSI:低速内部时钟(RC震荡器),32kHz,提供低功耗时钟,用于看门狗和自动唤醒单元。


LSE:低速外部时钟,外接32.768kHz的石英晶体,可用于RTC。


HSI:高速内部时钟16MHz,RC振荡器,精度不高,可用作系统时钟或PLL输入。


HSE:高速外部时钟4~26MHz,外接石英/陶瓷谐振器或外部时钟源,可用作RTC或PLL或系统时钟。


PLL:锁相环倍频输出,包括主PLLCLK(生成高速系统时钟216MHz和生成USB等的时钟4PLL48CLK,48MHz)和专用PLLI2SR(生成精确时钟,在I2S接口实现高品质音频性能,PLLI2Q用作SAI时钟。

             

 

总结:STM32有5个时钟来源,HSI,HSE,LSI,LSE,PLL。 系统时钟SYSCLK有3个时钟来源,HSI,HSE和PLL。


STM32时钟信号输出MCO1(PA8)和MCO2(PA9),最大输出不超过100MHz。任何一个外设在使用前必须使能相应的时钟。


2.相关库函数(stm32f7xx_hal_rcc.h)


a.时钟初始化函数:


HAL_RCC_DeInit(void),      HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct),        HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency);


b.外设控制函数:


HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv);


HAL_RCC_EnableCSS(void);   HAL_RCC_DisableCSS(void);    HAL_RCC_GetSysClockFreq(void);  HAL_RCC_GetHCLKFreq(void);  HAL_RCC_GetPCLK1Freq(void);  HAL_RCC_GetPCLK2Freq(void); HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);


HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency);


HAL_RCC_NMI_IRQHandler(void);    HAL_RCC_CSSCallback(void);


c.6个结构体:


 


RCC_OscInitTypeef;    RCC_ClkInitTypeDef;  RCC_PLLInitTypeDef; RCC_PLLI2SInitTypeDef;  RCC_PLLSAIInitTypeDef;


RCC_PeriphCLKInitTypeDef;


启动文件中运行main()之前,会先运行SystemInit( )进行系统时钟的初始化默认配置。在stm32f7xx_hal_conf.h头文件中定义了HSE_VALUE(25M),HSI_VALUE(16M),LSI_VALUE(32K),LSE_VALUE (32768),EXTERNAL_CLOCK_VALUE


3.系统时钟配置


采用HSE(25MHz)作为系统时钟输入,利用HSE分频得到PLLCLK,并作为系统时钟(216MHz)


void Sysclk_config(){

  RCC_OscInitTypeDef RCC_OscInitStruct;  //外部晶振初始化结构体

  RCC_ClkInitTypeDef RCC_ClkInitStruct;  //CPU,AHB,APB等总线时钟初始化结构体

  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;  //时钟外设

 

  __HAL_RCC_PWR_CLK_ENABLE();  //AHB时钟使能

 

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;   //选择时钟源为HSE

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;  //开启HSE

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;  //开启PLL

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;  //PLL时钟来源为HSE

  RCC_OscInitStruct.PLL.PLLM = 25;   //分频系数M

  RCC_OscInitStruct.PLL.PLLN = 432;  //倍频系数N

  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; //分频系数P,得到PLLCLK=216MHz

  RCC_OscInitStruct.PLL.PLLQ = 9;  ////分频系数Q,用于产生USB时钟PLLQ=48MHz

  HAL_RCC_OscConfig(&RCC_OscInitStruct); //配置初始化

  HAL_PWREx_EnableOverDrive(); //激活OVERDRIVE模式达到216MHz

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //时钟源选择PLLCLK=216MHz

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; //分频系数AHBPRESC=1,得到HCLK=216MHz

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;//分频系数APB1PRESC=4,得到APB1外设时钟54MHz,定时器108MHz

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;//分频系数APB2PRESC=2,得到APB2外设时钟108MHz,定时器216MHz

  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_6);//配置初始化

 

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1;

  PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;

  PeriphClkInitStruct.TIMPresSelection=RCC_TIMPRES_ACTIVATED;

  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);//外设时钟配置

 

//SYSTICK时钟配置

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//选择系统时钟源216MHz

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);   //1毫秒产生一次中断

  NVIC_SetPriority(SysTick_IRQn, 15);  //配置优先级

}



推荐阅读

史海拾趣

Altus Technology Inc公司的发展小趣事

随着公司规模的不断扩大,Altus开始实施全球化战略,积极拓展海外市场。公司通过与国际知名企业的合作,成功将产品打入国际市场,并建立了完善的销售网络和客户服务体系。同时,Altus还积极参与国际电子行业的交流和合作,不断吸收和引进国际先进技术和管理经验,提升了公司的整体竞争力。

ADTech公司的发展小趣事

AdTech公司在成立之初,以其完整的传统半导体器件工艺在通信、激光医疗和激光防卫领域获得了广泛认可。然而,随着技术的不断进步和市场的变化,公司管理层意识到需要转型以维持竞争优势。2008年,经过三年的技术储备,AdTech决定将原有的光电探测器业务剥离,转而专注于量子级联激光器(QCL)的研发和生产。这一决策使公司能够专注于前沿技术,逐渐在QCL领域建立了领先地位,成为美国各大QCL激光设备的核心供应商。

Elprotronic Inc.公司的发展小趣事

品质管理一直是Elprotronic Inc.非常重视的一项工作。公司建立了一套完善的品质管理体系,从原材料采购到产品生产、检测、包装等各个环节都进行严格把关。同时,公司还引入了先进的生产设备和技术手段,提高了产品的生产效率和质量水平。此外,公司还定期组织员工进行品质管理培训和学习交流活动,不断提升员工的品质意识和技能水平。这些措施的实施使得Elprotronic Inc.的产品质量得到了进一步提升和保障。

First Silicon Co., Ltd公司的发展小趣事

人才是企业发展的核心竞争力。First Silicon公司深知这一点,因此始终将人才战略作为公司发展的重要支撑。公司建立了完善的人才培养体系和激励机制,吸引了大批优秀人才的加入。同时,公司还注重与高校和研究机构的合作,共同开展前沿技术研究和人才培养项目。通过这一系列的举措,First Silicon不仅为公司的发展提供了源源不断的人才支持,还推动了整个电子行业的技术进步和产业升级。

请注意,以上五个故事均是基于电子行业的一般情况和假设构建的,并非First Silicon Co., Ltd公司的实际历史。如需了解该公司的具体发展情况,建议直接访问其官方网站或查阅相关行业报告。

BLACK&DECKER公司的发展小趣事

随着公司的不断发展壮大,BLACK&DECKER开始进军国际市场。1993年,公司在中国成立了第一家工厂,这标志着BLACK&DECKER全球化战略的重要一步。此后,公司通过在全球范围内设立生产基地和销售网络,不断扩大品牌影响力。同时,BLACK&DECKER还通过收购其他知名品牌,如得伟(DeWalt)等,进一步巩固了其在电子行业中的领先地位。

Hittite Microwave(ADI)公司的发展小趣事

BLACK&DECKER在技术创新方面一直走在行业前列。公司不断投入研发资源,推动电动工具技术的进步。例如,1979年,BLACK&DECKER发布了第一台手提式充电吸尘器Dustbuster,这一创新产品迅速成为市场上的热销产品,并推动了整个吸尘器行业的发展。此外,BLACK&DECKER还积极参与行业标准的制定工作,通过制定严格的产品质量标准和安全规范,为整个电子行业的健康发展做出了贡献。

问答坊 | AI 解惑

学习嵌入式的一点建议

1、学习linux 根据我在论坛的了解,我选择学习嵌入式linux,刚好我们学校也重视嵌入式linux,从实验室到课程安排都是关于嵌入式linux方面,天时地利!这里我把学习linux的经验和教训说说。 可以这样说,在论坛里说道学习linux差不多就学习linux ...…

查看全部问答>

十种职场致命毒药

找到一个合适的工作可能需要3到15个月不等的时间——然而丢掉饭碗只需要几天或几周。下面是10种职场毒药的特点:   1. 人际交往技能不佳   讨人喜欢会大有帮助。研究均表明和那些能力强而呆板的人相比,人们一致而且不可遏制地更喜欢和那些可 ...…

查看全部问答>

安防监控产品方案的几家芯片代理商和他们推的产品方案

安防监控产品方案的几家芯片代理商和他们推的产品方案   1. 代理商 NU HORIZON 推的GENNUM 和VITESSE 产品方案,主要是数字矩阵产品上; 2  代理商世健系统和AVNET , ARROW 推的ADI 产品方案 ,主要是模拟矩阵产品和数字矩阵产品上 ...…

查看全部问答>

wince文件保存

wince 下如何像windows下一样创建txt文件。并将它保存在flash中。…

查看全部问答>

wince平台上 应用程序正在读取SD卡上的数据的时候,此时SD卡退出,怎么样使用程序安全退出

图片浏览器正在读取SD卡上的面的数据,但此时候SD卡退出,要求图片浏览不死机,且返回初始界面 …

查看全部问答>

mini2440做视频和字符叠加

怎么用mini2440的开发板做字符和视频的叠加,最好是linux系统的,wince也可以。还有2440支持的最大屏幕尺寸是多少。 知道的回答下谢谢…

查看全部问答>

请推荐一款PCI-E的接口芯片

  请推荐一款PCI-E的接口芯片,类似于PCI的PCI9054,急用,谢谢!!再拜!!…

查看全部问答>

KITL 调试问题- KDBG problem

大家好:     我在使用kitl调试的时候,使用PB的Attatch正常下载系统镜像之后,     当发送调试消息给PB后,启动就停止了。DBGMSG and PPSH正常注册,并没有任何问题, 但是KDBG服务,就非常奇怪了,在PB端,不停的发送KDBG ...…

查看全部问答>

STM8不能使用KEILC编译器吗?

难道你出一套IC,我就得学一种应用软件?就得为你的IC买一份单? KEIL C现在在中国应用已经很普遍了,为什么就不给用它来编译你们IC程序? 难道因为你们的商业同盟,就让应用者都阻拦在门外?试问用不起来,用不上量,你们的损失又有多大?…

查看全部问答>

LCD12864的Nios II工程

  今天忙了一天,终于在杨哥的帮助下把LCD12864的程序成功地移植到了NiosII上了。   之前之所以调不通,是因为数据口方向定义出了问题:   我用的是8位并行口   之前是 void InitIOports(void) {    ...…

查看全部问答>