- UID
- 1
- 精华
- 218
- 积分
- 60381
- 威望
- 294 点
- 宅币
- 18484 个
- 贡献
- 37876 次
- 宅之契约
- 0 份
- 最后登录
- 2019-12-15
- 在线时间
- 1761 小时
- QQ

用户组: 管理员
一只技术宅
- UID
- 1
- 精华
- 218
- 威望
- 294 点
- 宅币
- 18484 个
- 贡献
- 37876 次
- 宅之契约
- 0 份
- 在线时间
- 1761 小时
- 注册时间
- 2014-1-26
|
虽说单片机这种玩意儿本身就不是为了做什么大事儿而设计的,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;
修改后的代码如下:[mw_shl_code=c,true]#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;
}[/mw_shl_code]实测有效,不会出大问题,它也不怎么发热(摸起来和平常一样),长时间运行也没问题,而且各外设的频率也提高了。只不过要注意:SPI、I2C、UART等的频率如果过高,对应的设备可能会无法正常通讯。我发现ILI9341的“RAMRD”命令并不能正常工作,除非SPI频率被降低到24 MHz以内。此外就是耗电量变大了。要注意动态调整频率,以及合理使用它的休眠模式等各种电源管理类功能。
此外各种钦定循环次数的延时代码也会因为超频而降低延时的时长。不过我这还好,我的延时代码都是用SystemCoreClock来计算循环次数的,而且循环节也是钦定ASM的两条指令循环:asm volatile( "0:" "SUBS %[count], 1;" "BNE 0b;" :[count]"+r"(n) );
正考虑使用DWT来编写新的延时和时长测量。 |
|