RCC初始化学习
一、设置RCC时钟
- //#define SYSCLK_HSE
- #define SYSCLK_FREQ_20MHz
- //#define SYSCLK_FREQ_36MHz
- //#define SYSCLK_FREQ_48MHz
- //#define SYSCLK_FREQ_72MHz
- /*******************************************************************************
- * Function Name : SetSysClock
- * Description : Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void SetSysClock(void)
- {
- #if defined SYSCLK_HSE
- SetSysClockToHSE();
- #elif defined SYSCLK_FREQ_20MHz
- SetSysClockTo20();
- #elif defined SYSCLK_FREQ_36MHz
- SetSysClockTo36();
- #elif defined SYSCLK_FREQ_48MHz
- SetSysClockTo48();
- #elif defined SYSCLK_FREQ_72MHz
- SetSysClockTo72();
- #endif
- }
SetSysClockToHSE:
- ErrorStatus HSEStartUpStatus;
- /*******************************************************************************
- * Function Name : SetSysClockToHSE
- * Description : Selects HSE as System clock source and configure HCLK,PCLK2 and PCLK1 prescalers.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void SetSysClockToHSE(void)
- {
- /* Deinitialize the RCC registers */
- RCC_DeInit();
- /* Enable the HSE */
- RCC_HSEConfig(RCC_HSE_ON);
- /* Wait till HSE is ready and if Time out is reached exit */
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if(HSEStartUpStatus == SUCCESS)
- {
- /* Add here PLL ans system clock config */
- /* Enable The Prefetch Buffer */
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
- /* Configure Tthe Latency cycle: Set 0 Latency cycles */
- FLASH_SetLatency(FLASH_Latency_0);
- /* Configure HCLK such as HCLK = SYSCLK */
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- /* PCLK2 = HCLK*/
- RCC_PCLK2Config(RCC_HCLK_Div1);
- /* PCLK1 = HCLK*/
- RCC_PCLK1Config(RCC_HCLK_Div1);
- /* Select HSE as system clock source*/
- RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
- /* Wait till HSE is used as system clock source */
- if(RCC_GetSYSCLKSource() != 0x04)
- {
- }
- else
- {
- }
- }
- else
- {
- /* If HSE fails to start-up. */
- while(1)
- {
- }
- }
- }
SetSysClockTo20:
- /*******************************************************************************
- * Function Name : SetSysClockTo20
- * Description : Sets System clock frequency to 20MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void SetSysClockTo20(void)
- {
- /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
- /* RCC system reset(for debug purpose) */
- RCC_DeInit();
- /* Enable HSE */
- RCC_HSEConfig(RCC_HSE_ON);
- /* Wait till HSE is ready */
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if(HSEStartUpStatus == SUCCESS)
- {
- /* Enable Prefetch Buffer */
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
- /* Flash 0 wait state */
- FLASH_SetLatency(FLASH_Latency_0);
- /* HCLK = SYSCLK */
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- /* PCLK2 = HCLK */
- RCC_PCLK2Config(RCC_HCLK_Div1);
- /* PCLK1 = HCLK */
- RCC_PCLK1Config(RCC_HCLK_Div1);
- /* PLLCLK = (8MHz / 2) * 5 = 20 MHz */
- RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_5);
- /* Enable PLL */
- RCC_PLLCmd(ENABLE);
- /* Wait till PLL is ready */
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
- {
- }
- /* Select PLL as system clock source */
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- /* Wait till PLL is used as system clock source */
- if(RCC_GetSYSCLKSource() != 0x80)
- {
- }
- else
- {
- }
- }
- else
- {
- /* If HSE fails to start-up. */
- while(1)
- {
- }
- }
SetSysClockTo36:
- /*******************************************************************************
- * Function Name : SetSysClockTo36
- * Description : Sets System clock frequency to 36MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void SetSysClockTo36(void)
- {
- /* RCC system reset */
- RCC_DeInit();
- /* Enable HSE */
- RCC_HSEConfig(RCC_HSE_ON);
- /* Wait till HSE is ready */
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if(HSEStartUpStatus == SUCCESS)
- {
- /* Enable Prefetch Buffer*/
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
- /* Flash 1 wait state */
- FLASH_SetLatency(FLASH_Latency_1);
- /* HCLK = SYSCLK */
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- /* PCLK2 = HCLK */
- RCC_PCLK2Config(RCC_HCLK_Div1);
- /* PCLK1 = HCLK */
- RCC_PCLK1Config(RCC_HCLK_Div1);
- /* PLLCLK = (8MHz / 2) * 9 = 36MHz */
- RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);
- /* Enable PLL */
- RCC_PLLCmd(ENABLE);
- /* Wait till PLL is ready */
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
- /* Select PLL as system clock source */
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- /* Wait till PLL is used as system clock source */
- if(RCC_GetSYSCLKSource() == 0x08)
- {
- }
- else
- {
- }
- }
- else
- {
- /* If HSE fails to start-up. */
- while(1)
- {
- }
- }
- }
SetSysClockTo48:
- /*******************************************************************************
- * Function Name : SetSysClockTo48
- * Description : Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void SetSysClockTo48(void)
- {
- /* RCC system reset */
- RCC_DeInit();
- /* Enable HSE */
- RCC_HSEConfig(RCC_HSE_ON);
- /* Wait till HSE is ready */
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if(HSEStartUpStatus == SUCCESS)
- {
- /* Enable Prefetch Buffer*/
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
- /* Flash 1 wait state */
- FLASH_SetLatency(FLASH_Latency_1);
- /* HCLK = SYSCLK */
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- /* PCLK2 = HCLK */
- RCC_PCLK2Config(RCC_HCLK_Div1);
- /* PCLK1 = HCLK/2 */
- RCC_PCLK1Config(RCC_HCLK_Div2);
- /* PLLCLK = 8MHz * 6 = 48MHz */
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);
- /* Enable PLL */
- RCC_PLLCmd(ENABLE);
- /* Wait till PLL is ready */
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
- /* Select PLL as system clock source */
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- /* Wait till PLL is used as system clock source */
- if(RCC_GetSYSCLKSource() == 0x08)
- {
- }
- else
- {
- }
- }
- else
- {
- /* If HSE fails to start-up. */
- while(1)
- {
- }
- }
- }
SetSysClockTo72:
- /*******************************************************************************
- * Function Name : SetSysClockTo72
- * Description : Sets System clock frequency to 72MHz and configure HCLK, PCLK2
- * and PCLK1 prescalers.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void SetSysClockTo72(void)
- {
- /* RCC system reset */
- RCC_DeInit();
- /* Enable HSE */
- RCC_HSEConfig(RCC_HSE_ON);
- /* Wait till HSE is ready */
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if(HSEStartUpStatus == SUCCESS)
- {
- /* Enable Prefetch Buffer*/
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
- /* Flash 1 wait state */
- FLASH_SetLatency(FLASH_Latency_2);
- /* HCLK = SYSCLK */
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- /* PCLK2 = HCLK */
- RCC_PCLK2Config(RCC_HCLK_Div1);
- /* PCLK1 = HCLK/2 */
- RCC_PCLK1Config(RCC_HCLK_Div2);
- /* PLLCLK = 8MHz * 6 = 48MHz */
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
- /* Enable PLL */
- RCC_PLLCmd(ENABLE);
- /* Wait till PLL is ready */
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
- /* Select PLL as system clock source */
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- /* Wait till PLL is used as system clock source */
- if(RCC_GetSYSCLKSource() == 0x08)
- {
- }
- else
- {
- }
- }
- else
- {
- /* If HSE fails to start-up. */
- while(1)
- {
- }
- }
- }
二、中断初始化
- /****************************************************************************
- * Function Name : NVIC_Configuration
- * Description : Configures Vector Table base location.
- * Input : None
- * Output : None
- * Return : None
- ****************************************************************************/
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- #ifdef VET_TAB_RAM
- /* Set the Vector Table base location at 0x2000 0000 */
- NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
- #else
- /* Set the Vector Table base location at 0x8000 0000 */
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
- #endif
- /* Enable and configure RCC global IRQ channel */
- NVIC_InitStructure.NVIC_IRQChannel = RCC_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
三、GPIO口初始化
- /****************************************************************************
- * Function Name : LED_Init
- * Description : Configures GPIOB
- * Input : None
- * Output : None
- * Return : None
- ****************************************************************************/
- void LED_Init()
- {
- /* Configure all the GPIOB in Output Push-Pull */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- /* Enable GPIOB clock */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- /* Initialize GPIOB*/
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
四、main函数
- /****************************************************************************
- * Function Name : main
- * Description : Main program.
- * Input : None
- * Output : None
- * Return : None
- ****************************************************************************/
- int main(void)
- {
- /* Set system clock HCLK PCLK2 PCLK1 and PLLCLK */
- SetSysClock();
- /* Get current frequency and fill in RCC_ClockFreq */
- RCC_GetClocksFreq(&RCC_ClockFreq);
- /* Enable Clock Security System(CSS), this will generate an NMI exception (Non-Maskable Interrupt)
- when HSE clock fails*/
- RCC_ClockSecuritySystemCmd(ENABLE);
- /* NVIC configuration */
- NVIC_Configuration();
- /* LED configuration */
- LED_Init();
- /* Set the GPIOB prot pin 15 and pin 14*/
- GPIO_SetBits(GPIOB, GPIO_Pin_15 | GPIO_Pin_14);
- /* Output HSE clock on MCO pin */
- RCC_MCOConfig(RCC_MCO_HSE);
- while(1)
- {
- GPIO_Write(GPIOB, (u16)~GPIO_ReadOutputData(GPIOB));
- Delay(DELAY_COUNT);
- }
- }
RCC初始化学习的更多相关文章
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...
- uC/OS-III学习2::uC/OS-III LED闪烁实验
1 前言: 看完了uC/OS-III的基本介绍之后,大致对这个操作系统有了点了解,但真正的理解还是要通过不断的去使用,在使用中体验uC/OS-III的乐趣和更深的理解其工作原理是非常重要的.因此,我在 ...
- stm32学习笔记之串口通信
在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...
- paper 53 :深度学习(转载)
转载来源:http://blog.csdn.net/fengbingchun/article/details/50087005 这篇文章主要是为了对深度学习(DeepLearning)有个初步了解,算 ...
- Arduino入门学习
一直听到许多做物联网.智能家居的控制器使用的是Arduino,从师兄那里拿到了一块Arduino开发板,进行了一下午的学习,感觉这个适合小孩子们玩:) 废话少说,总结一下,便于以后可能会用得到.我主要 ...
- 学习ASP.NET Core Razor 编程系列八——并发处理
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列九——增加查询功能
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十——添加新字段
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
随机推荐
- Java并发与多线程与锁优化
前言 目前CPU的运算速度已经达到了百亿次每秒,所以为了提高生产率和高效地完成任务,基本上都采用多线程和并发的运作方式. 并发(Concurrency):是指在某个时间段内,多任务交替处理的能力.CP ...
- DOS基础使用专题(强烈推荐)2
DOS下硬件设备的使用与设置 由于电脑的普及和应用的日益深入,为了满足人们的需要,电脑的功能随着它的发展变得越来越强大,硬件设备也越来越多,如从原来的ISA及PCI声卡.调制解调器等到现在的USB硬盘 ...
- php addcslashes()函数 语法
php addcslashes()函数 语法 作用:返回在指定字符前添加反斜杠的字符串 语法:addcslashes(string,characters) 参数: 参数 描述 string 必须,规 ...
- PHPSTORM破解版激活方式方法
方法一. 通过Licence Server 激活PHPStorm(快速) 方法原理是通过搭建服务器激活,不过网上有许多搭建好的. http://idea.goxz.gq http://v2mc.net ...
- 用DELPHI中实现RAR文件解压到指定一目录
一个RAR压缩文件,用DELPHI编的程序打开它并解压到某一目录,怎么实现的?自己搞定了例子:winrar.exe e -y C:\WINDOWS\Desktop\ghost.rar d:\ 但新的问 ...
- 处理警告:编码 GBK 的不可映射字符
怎么处理警告:编码 GBK 的不可映射字符:javac -encoding UTF-8 XX.java使用-encoding参数指明编码方式: 或者 用记事本打开文件,然后另存为,选择ANSI编码,覆 ...
- selenium问题之定位不到元素(NoSuchElementException)
在使用selenium+爬虫的时候,经常会遇到一个问题,就是NoSuchElementException,定位不到元素的问题 一,打开了新页面,一般selenium点击新链接跳转打开了一个新页面,那么 ...
- JPA project Change Event Handler问题解决
eclipse使用的是有经常会出现JPA project Change Event Handler(watering)很卡 网上的解决办法是 [Help > Installation Detai ...
- DB:目录
ylbtech-DB:目录 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylbtech.cn ...
- linux超级块和inode 详解 和 df 、du 命令详解与环境变量
一.inode块,Unix文件的核心. 首先需要明白的是,在Unix操作系统中的任何资源都被当作文件来管理.如目录.光驱.终端设备等等,都被当作是一种文件.从这方面来说,Unix操作系统中的所有的目录 ...