【单片机】把STM32F103超频到128 MHz
虽说单片机这种玩意儿本身就不是为了做什么大事儿而设计的,ROM和RAM加起来的大小连一般计算机内存大小的零头都不到,这玩意儿超频意义何在?然而很好玩!我用这个STM32F103驱动一块ILI9341屏幕的时候,我发现超频到128 MHz后,它甚至能到达接近60 Hz的刷新率。
而且这也给我带来了一种可能性,那就是我有可能可以使用这个玩意儿去读取100 MHz的RCA视频信号,然后进行处理了。
我是在这篇文章里发现的代码:
http://www.stupid-projects.com/driving-an-ili9341-lcd-with-an-overclocked-stm32f103/
他把源码上传到了这里:
https://bitbucket.org/dimtass/stm32f103-ili9341-dma/src/14e81f0c98cddb89de23cff56a7e55a784791172/source/overclock_stm32f103.c?at=master&fileviewer=file-view-default
得感谢原作者。
我把他的代码改了一下,他的uint32_t overclock_stm32f103()会返回一个数值:128000000,然后调用的时候把这个数值赋值给SystemCoreClock。这很麻烦,不如直接改成void overclock_stm32f103(),并且把return 128000000改成SystemCoreClock = 128000000;
修改后的代码如下:#include<stm32f10x.h>
#include<system_stm32f10x.h>
void overclock_stm32f103(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 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 * 9 = 72 MHz */
//RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* PLLCLK = 8MHz * 16 = 128 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_16);
// The frequency has also been changed in system_stm32f10x
/* 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 */
while(RCC_GetSYSCLKSource() != 0x08);
}
SystemCoreClock = 128000000;
}实测有效,不会出大问题,它也不怎么发热(摸起来和平常一样),长时间运行也没问题,而且各外设的频率也提高了。只不过要注意:SPI、I2C、UART等的频率如果过高,对应的设备可能会无法正常通讯。我发现ILI9341的“RAMRD”命令并不能正常工作,除非SPI频率被降低到24 MHz以内。此外就是耗电量变大了。要注意动态调整频率,以及合理使用它的休眠模式等各种电源管理类功能。
此外各种钦定循环次数的延时代码也会因为超频而降低延时的时长。不过我这还好,我的延时代码都是用SystemCoreClock来计算循环次数的,而且循环节也是钦定ASM的两条指令循环:asm volatile( "0:" "SUBS %, 1;" "BNE 0b;" :"+r"(n) );
正考虑使用DWT来编写新的延时和时长测量。 这学期上了电工课,但是感觉对这个硬件还是一窍不通,orz
页:
[1]