一、设置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. 别人的双11 & 程序员的双11~

    双11,致敬所有的程序员欧巴! 愿代码的世界,只有爱,没有伤害!! ​ 点此参加阿里云双十一拼团活动:https://m.aliyun.com/act/team1111/ 阅读原文

  2. centos6.8下安装nginx

    我用的阿里云上的镜像,make的时候总是出错,后来说是gcc安装不完整,要重新用下面命令安装 下: yum install gcc gcc-c++ gcc-g77 接下来下载nginx用到的一些库 w ...

  3. vue开发微信公众号--地图

    在最近开发的微信公众号中,要实现一个打卡功能: 由于个人感觉微信SDK里面的地图不太好用,所以使用了腾讯地图. 在项目中引入腾讯地图 1,需要登录腾讯地图网站,注册一个账户,获得一个key. 2,然后 ...

  4. mac使用相关笔记

    1.软件提示已损坏,需要移到废纸篓的解决方法 -> sudo spctl --master-disable xattr -r -d com.apple.quarantine <path&g ...

  5. linux系统中查看日志及系统信息

    cat tail -f 日 志 文 件说 明 /var/log/message系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure与安全相关的日志 ...

  6. 信息安全-攻击-XSS:XSS/CSS 攻击

    ylbtech-信息安全-攻击-XSS:XSS/CSS 攻击 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序.这些恶意 ...

  7. 测开之路三十九:js基础

    js的两种使用方式 第一种使用方式:单独写js文件 在static下新建一个js文件并写入内容 alert('这是一个弹窗'); 在html文件里面,用script标签引入 <script sr ...

  8. JS获取url多个参数及解决中文乱码问题

    function GetQueryString(name) {      var reg = new RegExp("(^|&)"+ name +"=([^&am ...

  9. SeaJs与RequireJs执行差异

    seajs与requirejs在模块的加载方面是没有差异的,无论是requirejs在定义模块时定义的依赖模块,还是seajs在factory函数中require的依赖模块,在会在加载当前模块时被载入 ...

  10. bitset归结,一个实例

    我是蒟蒻一名,请大佬勿喷. 绝大部分来自https://www.cnblogs.com/magisk/p/8809922.html   ,  可以去大佬博客逛一逛 bitset是C++中类似数组的一种 ...