一、设置RCC时钟

  1. //#define SYSCLK_HSE
  2. #define SYSCLK_FREQ_20MHz
  3. //#define SYSCLK_FREQ_36MHz
  4. //#define SYSCLK_FREQ_48MHz
  5. //#define SYSCLK_FREQ_72MHz
  6. /*******************************************************************************
  7. * Function Name : SetSysClock
  8. * Description : Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.
  9. * Input : None
  10. * Output : None
  11. * Return : None
  12. *******************************************************************************/
  13. void SetSysClock(void)
  14. {
  15. #if defined SYSCLK_HSE
  16. SetSysClockToHSE();
  17. #elif defined SYSCLK_FREQ_20MHz
  18. SetSysClockTo20();
  19. #elif defined SYSCLK_FREQ_36MHz
  20. SetSysClockTo36();
  21. #elif defined SYSCLK_FREQ_48MHz
  22. SetSysClockTo48();
  23. #elif defined SYSCLK_FREQ_72MHz
  24. SetSysClockTo72();
  25. #endif
  26. }

SetSysClockToHSE:

  1. ErrorStatus HSEStartUpStatus;
  2. /*******************************************************************************
  3. * Function Name : SetSysClockToHSE
  4. * Description : Selects HSE as System clock source and configure HCLK,PCLK2 and PCLK1 prescalers.
  5. * Input : None
  6. * Output : None
  7. * Return : None
  8. *******************************************************************************/
  9. void SetSysClockToHSE(void)
  10. {
  11. /* Deinitialize the RCC registers */
  12. RCC_DeInit();
  13. /* Enable the HSE */
  14. RCC_HSEConfig(RCC_HSE_ON);
  15. /* Wait till HSE is ready and if Time out is reached exit */
  16. HSEStartUpStatus = RCC_WaitForHSEStartUp();
  17. if(HSEStartUpStatus == SUCCESS)
  18. {
  19. /* Add here PLL ans system clock config */
  20. /* Enable The Prefetch Buffer */
  21. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  22. /* Configure Tthe Latency cycle: Set 0 Latency cycles */
  23. FLASH_SetLatency(FLASH_Latency_0);
  24. /* Configure HCLK such as HCLK = SYSCLK */
  25. RCC_HCLKConfig(RCC_SYSCLK_Div1);
  26. /* PCLK2 = HCLK*/
  27. RCC_PCLK2Config(RCC_HCLK_Div1);
  28. /* PCLK1 = HCLK*/
  29. RCC_PCLK1Config(RCC_HCLK_Div1);
  30. /* Select HSE as system clock source*/
  31. RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
  32. /* Wait till HSE is used as system clock source */
  33. if(RCC_GetSYSCLKSource() != 0x04)
  34. {
  35. }
  36. else
  37. {
  38. }
  39. }
  40. else
  41. {
  42. /* If HSE fails to start-up. */
  43. while(1)
  44. {
  45. }
  46. }
  47. }

SetSysClockTo20:

  1. /*******************************************************************************
  2. * Function Name : SetSysClockTo20
  3. * Description : Sets System clock frequency to 20MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
  4. * Input : None
  5. * Output : None
  6. * Return : None
  7. *******************************************************************************/
  8. void SetSysClockTo20(void)
  9. {
  10. /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
  11. /* RCC system reset(for debug purpose) */
  12. RCC_DeInit();
  13. /* Enable HSE */
  14. RCC_HSEConfig(RCC_HSE_ON);
  15. /* Wait till HSE is ready */
  16. HSEStartUpStatus = RCC_WaitForHSEStartUp();
  17. if(HSEStartUpStatus == SUCCESS)
  18. {
  19. /* Enable Prefetch Buffer */
  20. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  21. /* Flash 0 wait state */
  22. FLASH_SetLatency(FLASH_Latency_0);
  23. /* HCLK = SYSCLK */
  24. RCC_HCLKConfig(RCC_SYSCLK_Div1);
  25. /* PCLK2 = HCLK */
  26. RCC_PCLK2Config(RCC_HCLK_Div1);
  27. /* PCLK1 = HCLK */
  28. RCC_PCLK1Config(RCC_HCLK_Div1);
  29. /* PLLCLK = (8MHz / 2) * 5 = 20 MHz */
  30. RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_5);
  31. /* Enable PLL */
  32. RCC_PLLCmd(ENABLE);
  33. /* Wait till PLL is ready */
  34. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  35. {
  36. }
  37. /* Select PLL as system clock source */
  38. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  39. /* Wait till PLL is used as system clock source */
  40. if(RCC_GetSYSCLKSource() != 0x80)
  41. {
  42. }
  43. else
  44. {
  45. }
  46. }
  47. else
  48. {
  49. /* If HSE fails to start-up. */
  50. while(1)
  51. {
  52. }
  53. }

SetSysClockTo36:

  1. /*******************************************************************************
  2. * Function Name : SetSysClockTo36
  3. * Description : Sets System clock frequency to 36MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
  4. * Input : None
  5. * Output : None
  6. * Return : None
  7. *******************************************************************************/
  8. void SetSysClockTo36(void)
  9. {
  10. /* RCC system reset */
  11. RCC_DeInit();
  12. /* Enable HSE */
  13. RCC_HSEConfig(RCC_HSE_ON);
  14. /* Wait till HSE is ready */
  15. HSEStartUpStatus = RCC_WaitForHSEStartUp();
  16. if(HSEStartUpStatus == SUCCESS)
  17. {
  18. /* Enable Prefetch Buffer*/
  19. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  20. /* Flash 1 wait state */
  21. FLASH_SetLatency(FLASH_Latency_1);
  22. /* HCLK = SYSCLK */
  23. RCC_HCLKConfig(RCC_SYSCLK_Div1);
  24. /* PCLK2 = HCLK */
  25. RCC_PCLK2Config(RCC_HCLK_Div1);
  26. /* PCLK1 = HCLK */
  27. RCC_PCLK1Config(RCC_HCLK_Div1);
  28. /* PLLCLK = (8MHz / 2) * 9 = 36MHz */
  29. RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);
  30. /* Enable PLL */
  31. RCC_PLLCmd(ENABLE);
  32. /* Wait till PLL is ready */
  33. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  34. /* Select PLL as system clock source */
  35. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  36. /* Wait till PLL is used as system clock source */
  37. if(RCC_GetSYSCLKSource() == 0x08)
  38. {
  39. }
  40. else
  41. {
  42. }
  43. }
  44. else
  45. {
  46. /* If HSE fails to start-up. */
  47. while(1)
  48. {
  49. }
  50. }
  51. }

SetSysClockTo48:

  1. /*******************************************************************************
  2. * Function Name : SetSysClockTo48
  3. * Description : Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
  4. * Input : None
  5. * Output : None
  6. * Return : None
  7. *******************************************************************************/
  8. void SetSysClockTo48(void)
  9. {
  10. /* RCC system reset */
  11. RCC_DeInit();
  12. /* Enable HSE */
  13. RCC_HSEConfig(RCC_HSE_ON);
  14. /* Wait till HSE is ready */
  15. HSEStartUpStatus = RCC_WaitForHSEStartUp();
  16. if(HSEStartUpStatus == SUCCESS)
  17. {
  18. /* Enable Prefetch Buffer*/
  19. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  20. /* Flash 1 wait state */
  21. FLASH_SetLatency(FLASH_Latency_1);
  22. /* HCLK = SYSCLK */
  23. RCC_HCLKConfig(RCC_SYSCLK_Div1);
  24. /* PCLK2 = HCLK */
  25. RCC_PCLK2Config(RCC_HCLK_Div1);
  26. /* PCLK1 = HCLK/2 */
  27. RCC_PCLK1Config(RCC_HCLK_Div2);
  28. /* PLLCLK = 8MHz * 6 = 48MHz */
  29. RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);
  30. /* Enable PLL */
  31. RCC_PLLCmd(ENABLE);
  32. /* Wait till PLL is ready */
  33. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  34. /* Select PLL as system clock source */
  35. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  36. /* Wait till PLL is used as system clock source */
  37. if(RCC_GetSYSCLKSource() == 0x08)
  38. {
  39. }
  40. else
  41. {
  42. }
  43. }
  44. else
  45. {
  46. /* If HSE fails to start-up. */
  47. while(1)
  48. {
  49. }
  50. }
  51. }

SetSysClockTo72:

  1. /*******************************************************************************
  2. * Function Name : SetSysClockTo72
  3. * Description : Sets System clock frequency to 72MHz and configure HCLK, PCLK2
  4. * and PCLK1 prescalers.
  5. * Input : None
  6. * Output : None
  7. * Return : None
  8. *******************************************************************************/
  9. void SetSysClockTo72(void)
  10. {
  11. /* RCC system reset */
  12. RCC_DeInit();
  13. /* Enable HSE */
  14. RCC_HSEConfig(RCC_HSE_ON);
  15. /* Wait till HSE is ready */
  16. HSEStartUpStatus = RCC_WaitForHSEStartUp();
  17. if(HSEStartUpStatus == SUCCESS)
  18. {
  19. /* Enable Prefetch Buffer*/
  20. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  21. /* Flash 1 wait state */
  22. FLASH_SetLatency(FLASH_Latency_2);
  23. /* HCLK = SYSCLK */
  24. RCC_HCLKConfig(RCC_SYSCLK_Div1);
  25. /* PCLK2 = HCLK */
  26. RCC_PCLK2Config(RCC_HCLK_Div1);
  27. /* PCLK1 = HCLK/2 */
  28. RCC_PCLK1Config(RCC_HCLK_Div2);
  29. /* PLLCLK = 8MHz * 6 = 48MHz */
  30. RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  31. /* Enable PLL */
  32. RCC_PLLCmd(ENABLE);
  33. /* Wait till PLL is ready */
  34. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  35. /* Select PLL as system clock source */
  36. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  37. /* Wait till PLL is used as system clock source */
  38. if(RCC_GetSYSCLKSource() == 0x08)
  39. {
  40. }
  41. else
  42. {
  43. }
  44. }
  45. else
  46. {
  47. /* If HSE fails to start-up. */
  48. while(1)
  49. {
  50. }
  51. }
  52. }

二、中断初始化

  1. /****************************************************************************
  2. * Function Name : NVIC_Configuration
  3. * Description : Configures Vector Table base location.
  4. * Input : None
  5. * Output : None
  6. * Return : None
  7. ****************************************************************************/
  8. void NVIC_Configuration(void)
  9. {
  10. NVIC_InitTypeDef NVIC_InitStructure;
  11. #ifdef VET_TAB_RAM
  12. /* Set the Vector Table base location at 0x2000 0000 */
  13. NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  14. #else
  15. /* Set the Vector Table base location at 0x8000 0000 */
  16. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  17. #endif
  18. /* Enable and configure RCC global IRQ channel */
  19. NVIC_InitStructure.NVIC_IRQChannel = RCC_IRQn;
  20. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  21. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  22. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  23. NVIC_Init(&NVIC_InitStructure);
  24. }

三、GPIO口初始化

  1. /****************************************************************************
  2. * Function Name : LED_Init
  3. * Description : Configures GPIOB
  4. * Input : None
  5. * Output : None
  6. * Return : None
  7. ****************************************************************************/
  8. void LED_Init()
  9. {
  10. /* Configure all the GPIOB in Output Push-Pull */
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14;
  12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  14. /* Enable GPIOB clock */
  15. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  16. /* Initialize GPIOB*/
  17. GPIO_Init(GPIOB, &GPIO_InitStructure);
  18. }

四、main函数

  1. /****************************************************************************
  2. * Function Name : main
  3. * Description : Main program.
  4. * Input : None
  5. * Output : None
  6. * Return : None
  7. ****************************************************************************/
  8. int main(void)
  9. {
  10. /* Set system clock HCLK PCLK2 PCLK1 and PLLCLK */
  11. SetSysClock();
  12. /* Get current frequency and fill in RCC_ClockFreq */
  13. RCC_GetClocksFreq(&RCC_ClockFreq);
  14. /* Enable Clock Security System(CSS), this will generate an NMI exception (Non-Maskable Interrupt)
  15. when HSE clock fails*/
  16. RCC_ClockSecuritySystemCmd(ENABLE);
  17. /* NVIC configuration */
  18. NVIC_Configuration();
  19. /* LED configuration */
  20. LED_Init();
  21. /* Set the GPIOB prot pin 15 and pin 14*/
  22. GPIO_SetBits(GPIOB, GPIO_Pin_15 | GPIO_Pin_14);
  23. /* Output HSE clock on MCO pin */
  24. RCC_MCOConfig(RCC_MCO_HSE);
  25. while(1)
  26. {
  27. GPIO_Write(GPIOB, (u16)~GPIO_ReadOutputData(GPIOB));
  28. Delay(DELAY_COUNT);
  29. }
  30. }

RCC初始化学习的更多相关文章

  1. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  2. uC/OS-III学习2::uC/OS-III LED闪烁实验

    1 前言: 看完了uC/OS-III的基本介绍之后,大致对这个操作系统有了点了解,但真正的理解还是要通过不断的去使用,在使用中体验uC/OS-III的乐趣和更深的理解其工作原理是非常重要的.因此,我在 ...

  3. stm32学习笔记之串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...

  4. paper 53 :深度学习(转载)

    转载来源:http://blog.csdn.net/fengbingchun/article/details/50087005 这篇文章主要是为了对深度学习(DeepLearning)有个初步了解,算 ...

  5. Arduino入门学习

    一直听到许多做物联网.智能家居的控制器使用的是Arduino,从师兄那里拿到了一块Arduino开发板,进行了一下午的学习,感觉这个适合小孩子们玩:) 废话少说,总结一下,便于以后可能会用得到.我主要 ...

  6. 学习ASP.NET Core Razor 编程系列八——并发处理

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  7. 学习ASP.NET Core Razor 编程系列九——增加查询功能

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  8. 学习ASP.NET Core Razor 编程系列十——添加新字段

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. php ltrim()函数 语法

    php ltrim()函数 语法 ltrim()函数怎么用? php ltrim()函数用于删除字符串左边的空格或其他预定义字符,语法是ltrim(string,charlist),返回经过charl ...

  2. 【转】 Linux 命令解释(Linux基础二)

    前言 对服务器来讲,图形界面会占用更多的系统资源,而且会安装更多的服务.开放更多的端口,这对服务器的稳定性和安全性都有负面影响.其实,服务器是一个连显示器都没有的家伙,要图形界面干十么? 说到这里,有 ...

  3. 使用 jQuery 实现 radio 的选中与反选

    使用 jQuery 实现 radio 的选中与反选 我们知道在 Html 中当我们选中一个radio后,再次点击该 radio,那么该 radio 依然是一个选中的状态,但是有时我们需要实现这样的逻辑 ...

  4. java String 类特点

    String的设计是一个典型的单一模式 String str1="AAAA":String str2="AAAA": 这生成两个对象吗?不是.在内存中,这是同一 ...

  5. 解决让刷新页面时不提示 "重试或取消”对话框

    如果刷新一个已经提交过的页面时,系统总是会提示一个 "重试或取消”的对话框.,如果是一个普通的页面,好象也无所谓,有就有,大不了多点一下.但是当我们是在子窗体中刷新父窗体时,就显得有点多余了 ...

  6. drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件

    1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...

  7. exporter

    何为 Prometheus Exporter? Prometheus 监控基于一个很简单的模型: 主动抓取目标的指标接口(HTTP 协议)获取监控指标, 再存储到本地或远端的时序数据库. Promet ...

  8. js的几个特殊的运算符略解

    js运算符的一些特殊应用及使用技巧. 1. 是否包含指定字符: ~ ~"str1".indexOf("str2") 含义为:str1 被查找的字符串 str2 ...

  9. [Leetcode] 176.第二高薪水

    题目: 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 | ...

  10. [Fw]初探linux中断系统(1)

    1. 重要接口 LDD上说,“内核维护了一个中断信号线的注册表,该注册表类似于I/O端口的注册表.模块在使用中断前要先请求一个中断通道(或者中断请求IRQ),然后在使用后释放该通道.” 撇开系统如何遍 ...