历史上的今天
今天是: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); //配置优先级
}
上一篇:3.STM32F4蜂鸣器
下一篇:6.中断优先级分组NVIC
史海拾趣
|
1、学习linux 根据我在论坛的了解,我选择学习嵌入式linux,刚好我们学校也重视嵌入式linux,从实验室到课程安排都是关于嵌入式linux方面,天时地利!这里我把学习linux的经验和教训说说。 可以这样说,在论坛里说道学习linux差不多就学习linux ...… 查看全部问答> |
|
安防监控产品方案的几家芯片代理商和他们推的产品方案 1. 代理商 NU HORIZON 推的GENNUM 和VITESSE 产品方案,主要是数字矩阵产品上; 2 代理商世健系统和AVNET , ARROW 推的ADI 产品方案 ,主要是模拟矩阵产品和数字矩阵产品上 ...… 查看全部问答> |
|
wince平台上 应用程序正在读取SD卡上的数据的时候,此时SD卡退出,怎么样使用程序安全退出 图片浏览器正在读取SD卡上的面的数据,但此时候SD卡退出,要求图片浏览不死机,且返回初始界面 … 查看全部问答> |
|
怎么用mini2440的开发板做字符和视频的叠加,最好是linux系统的,wince也可以。还有2440支持的最大屏幕尺寸是多少。 知道的回答下谢谢… 查看全部问答> |
|
大家好: 我在使用kitl调试的时候,使用PB的Attatch正常下载系统镜像之后, 当发送调试消息给PB后,启动就停止了。DBGMSG and PPSH正常注册,并没有任何问题, 但是KDBG服务,就非常奇怪了,在PB端,不停的发送KDBG ...… 查看全部问答> |
|
难道你出一套IC,我就得学一种应用软件?就得为你的IC买一份单? KEIL C现在在中国应用已经很普遍了,为什么就不给用它来编译你们IC程序? 难道因为你们的商业同盟,就让应用者都阻拦在门外?试问用不起来,用不上量,你们的损失又有多大?… 查看全部问答> |
|
今天忙了一天,终于在杨哥的帮助下把LCD12864的程序成功地移植到了NiosII上了。 之前之所以调不通,是因为数据口方向定义出了问题: 我用的是8位并行口 之前是 void InitIOports(void) {   ...… 查看全部问答> |




