- UID
- 1
- 精华
- 积分
- 76361
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
虽说单片机这种玩意儿本身就不是为了做什么大事儿而设计的,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;
修改后的代码如下:- #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 %[count], 1;" "BNE 0b;" :[count]"+r"(n) );
正考虑使用DWT来编写新的延时和时长测量。 |
|