技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 100|回复: 1
收起左侧

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

[复制链接]

1007

主题

2232

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
199
威望
263 点
宅币
16684 个
贡献
33359 次
宅之契约
0 份
在线时间
1595 小时
注册时间
2014-1-26
发表于 2018-11-2 09:37:56 | 显示全部楼层 |阅读模式

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

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

x
虽说单片机这种玩意儿本身就不是为了做什么大事儿而设计的,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;
修改后的代码如下:
[C] 纯文本查看 复制代码
#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来编写新的延时和时长测量。

11

主题

100

帖子

738

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
16 点
宅币
557 个
贡献
44 次
宅之契约
0 份
在线时间
90 小时
注册时间
2018-5-6
发表于 2018-11-2 11:59:49 | 显示全部楼层
这学期上了电工课,但是感觉对这个硬件还是一窍不通,orz
菜鸟一枚,直接指正,不必留情

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-11-20 13:43 , Processed in 0.076308 second(s), 14 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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