一、设置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. python魔法方法__reduce__()的妙用

    一.__reduce__()介绍 当定义扩展类型时(也就是使用Python的C语言API实现的类型),如果你想pickle它们,你必须告诉Python如何pickle它们. __reduce__ 被定 ...

  2. Apache + Tomcat 集群的配置

    公司最近新接了一个项目,客户要求WEB SERVER 必须是APACHE,,由于之前的项目一直都是NGINX,,无奈啊,,由于对方的IT又是在三哥的过度,经过一番的争执只能顺应三哥三姐的要求..

  3. mongodb在linux 上要注意的一些东西

    没有配成开机启动服务,在bin目录下还要使用./mongod去启动,暂时先这样,另外要说的是, child process failed, exited with error number 1说明配置 ...

  4. idea中以maven工程的方式运行tomcat源码

    0. 准备环境 idea+jdk8+tomcat源码 1.下载tomcat源码: http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/ ...

  5. jQuery的toggle事件

    $(function () {    //默认隐藏   $("#SelTime").hide();  $("#SeniorSel").toggle(      ...

  6. PAT甲级【2019年3月考题】——A1159 Structure_of_a_BinaryTree【30】

    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...

  7. javaIO流(五)--对象序列化

    一.序列化概念 几乎只要是我们的java开发,就一定会存在有序列化的概念,而正是有序列化的概念逐步发展,慢慢也有了更多的系列化的标准.--所谓的对象序列化指的是将内存中保存的对象,以二进制数据流的形式 ...

  8. 常用开发类库支持--UUID及空值处理Optional

    一.java常用类库--UUID --UUID类库的使用非常简单,只需要使用静态方法UUID.randomUUID(就可以正常使用) public class MyUUID { public stat ...

  9. ftrace 使用方法

    1. 追蹤Kernel function (以schedule()示範) 先至 /sys/kernel/debug/tracing# cat available_tracers 確定有無 函式追蹤器( ...

  10. [FW]使用kprobes查看内核内部信息

    使用printk打印变量等方法,是调试内核的有效方法之一,但是这种方法必须重新构建并用新内核启动,调试效率比较低.以内核模块的方式使用kprobes.jprobes,就可以在任意地址插入侦测器,执行包 ...