找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 8774|回复: 1

【单片机】把STM32F103超频到128 MHz

[复制链接]
发表于 2018-11-2 09:37:56 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
虽说单片机这种玩意儿本身就不是为了做什么大事儿而设计的,ROM和RAM加起来的大小连一般计算机内存大小的零头都不到,这玩意儿超频意义何在?

然而很好玩!我用这个STM32F103驱动一块ILI9341屏幕的时候,我发现超频到128 MHz后,它甚至能到达接近60 Hz的刷新率。
而且这也给我带来了一种可能性,那就是我有可能可以使用这个玩意儿去读取100 MHz的RCA视频信号,然后进行处理了。

我是在这篇文章里发现的代码:
http://www.stupid-projects.com/d ... rclocked-stm32f103/
他把源码上传到了这里:
https://bitbucket.org/dimtass/st ... r=file-view-default
得感谢原作者。

我把他的代码改了一下,他的uint32_t overclock_stm32f103()会返回一个数值:128000000,然后调用的时候把这个数值赋值给SystemCoreClock。这很麻烦,不如直接改成void overclock_stm32f103(),并且把return 128000000改成SystemCoreClock = 128000000;
修改后的代码如下:
  1. #include<stm32f10x.h>
  2. #include<system_stm32f10x.h>

  3. void overclock_stm32f103(void)
  4. {
  5.         /* RCC system reset(for debug purpose) */
  6.         RCC_DeInit();

  7.         /* Enable HSE */
  8.         RCC_HSEConfig(RCC_HSE_ON);

  9.         /* Wait till HSE is ready */
  10.         ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp();

  11.         if(HSEStartUpStatus == SUCCESS)
  12.         {
  13.                 /* Enable Prefetch Buffer */
  14.                 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  15.                 /* Flash 2 wait state */
  16.                 FLASH_SetLatency(FLASH_Latency_2);

  17.                 /* HCLK = SYSCLK */
  18.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);

  19.                 /* PCLK2 = HCLK */
  20.                 RCC_PCLK2Config(RCC_HCLK_Div1);

  21.                 /* PCLK1 = HCLK/2 */
  22.                 RCC_PCLK1Config(RCC_HCLK_Div2);

  23.                 /* PLLCLK = 8MHz * 9 = 72 MHz */
  24.                 //RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  25.                 /* PLLCLK = 8MHz * 16 = 128 MHz */
  26.                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_16);
  27.                 // The frequency has also been changed in system_stm32f10x

  28.                 /* Enable PLL */
  29.                 RCC_PLLCmd(ENABLE);

  30.                 /* Wait till PLL is ready */
  31.                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

  32.                 /* Select PLL as system clock source */
  33.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  34.                 /* Wait till PLL is used as system clock source */
  35.                 while(RCC_GetSYSCLKSource() != 0x08);
  36.         }
  37.        
  38.         SystemCoreClock = 128000000;
  39. }
复制代码
实测有效,不会出大问题,它也不怎么发热(摸起来和平常一样),长时间运行也没问题,而且各外设的频率也提高了。只不过要注意:SPI、I2C、UART等的频率如果过高,对应的设备可能会无法正常通讯。我发现ILI9341的“RAMRD”命令并不能正常工作,除非SPI频率被降低到24 MHz以内。此外就是耗电量变大了。要注意动态调整频率,以及合理使用它的休眠模式等各种电源管理类功能。
此外各种钦定循环次数的延时代码也会因为超频而降低延时的时长。不过我这还好,我的延时代码都是用SystemCoreClock来计算循环次数的,而且循环节也是钦定ASM的两条指令循环:asm volatile( "0:" "SUBS %[count], 1;" "BNE 0b;" :[count]"+r"(n) );
正考虑使用DWT来编写新的延时和时长测量。

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2018-11-2 11:59:49 | 显示全部楼层
这学期上了电工课,但是感觉对这个硬件还是一窍不通,orz
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-21 20:46 , Processed in 0.035429 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表