历史上的今天
今天是:2024年09月01日(星期日)
2018年09月01日 | STM32使用外部16MHZ晶振总结
2018-09-01 来源:eefocus
做小封装产品设计的朋友或许知道3225-4PIN的晶振,为何8MHZ晶振批量价格要到2元一片,而16MHZ晶振只需要0.4元甚至更少。究其原因是因为3225封装的晶振目前全球最低频率一般为8MHZ,而国内8MHZ达不到精度指标,所以市场上的8MHZ晶振一般为进口晶振,因此成本被垄断。

图1 3225封装晶振
STM32单片机学习者一开始用的晶振一般是2PIN的8MHZ晶振,一旦正真做产品研发的时候,使用到3225的8MHZ晶振的话,成本是个不小的挑战。笔者现针对这个问题,提出使用16MHZ晶振代替的方法。

图2 STM32时钟树状图
由上图可以看出,如果想兼容8MHZ晶振,必须在时钟倍频前2分频。程序设计如下,在system_stm32f10x.c文件下修改系统时钟配置,配置为72MHZ。

图3 系统时钟配置
修改SetSysClockTo72(void)文件如下:
static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus =0;
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
do
{
HSEStatus =RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) &&(StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CR & RCC_CR_HSERDY) !=RESET)
{
HSEStatus =(uint32_t)0x01;
}
else
{
HSEStatus =(uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
FLASH->ACR |= FLASH_ACR_PRFTBE;
FLASH->ACR &=(uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |=(uint32_t)FLASH_ACR_LATENCY_2;
RCC->CFGR|= (uint32_t)RCC_CFGR_HPRE_DIV1;
RCC->CFGR|= (uint32_t)RCC_CFGR_PPRE2_DIV1;
RCC->CFGR|= (uint32_t)RCC_CFGR_PPRE1_DIV2;
#ifdef STM32F10X_CL
RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 |RCC_CFGR2_PLL2MUL |
RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 |RCC_CFGR2_PLL2MUL8 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
RCC->CR|= RCC_CR_PLL2ON;
while((RCC->CR & RCC_CR_PLL2RDY) == 0)
{
}
RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC| RCC_CFGR_PLLMULL);
RCC->CFGR|= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1|
RCC_CFGR_PLLMULL9);
#else
//16MHZ2分频如下改动,添加RCC_CFGR_PLLXTPRE_HSE_Div2
RCC->CFGR&= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE|
RCC_CFGR_PLLXTPRE_HSE_Div2|RCC_CFGR_PLLMULL));
RCC->CFGR|= (uint32_t)(RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLSRC_HSE |RCC_CFGR_PLLMULL9);
#endif
RCC->CR|= RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
RCC->CFGR&= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR|=(uint32_t)RCC_CFGR_SW_PLL;
while((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) !=(uint32_t)0x08)
{
}
}
else
{
}
}
到此,很多读者认为设计已经完毕,这个系统也如愿地倍频至72MHZ了,但忽略了一个小细节。我们需要修改stm32f10x.h文件里面的外部时钟宏定义,有一些外设的时钟是直接使用外部时钟配置的,比如串口等。
#if !defined HSE_VALUE
#ifdefSTM32F10X_CL
#defineHSE_VALUE ((uint32_t)25000000)
#else
#defineHSE_VALUE ((uint32_t)16000000)
#endif
#endif
至此,程序修改完毕。整个系统围绕8MHZ倍频至72MHZ欢畅的运行
史海拾趣
|
需要一个北京地区的兼职linux编程人员,要求可以独立完成下列开发, 不符合条件请勿打扰,以免浪费你我时间 要求熟悉MINIGUI,具体编程内容: 从COM口读入数据,在14英寸以上显示器上显示如下图形界面: 屏幕正中间一个圆形,圆形里面显示从串 ...… 查看全部问答> |
|
LED照明发展中五个亟待解决的问题 ——色温范围、照明标准、亮度范围、照明总均匀度和眩光控制 最合适的LED照明灯具色温范围,应该是接近太阳自然白光的色温范围才是最科学的选择;较低照射强度的自然白光,就可以达到其他非自然 ...… 查看全部问答> |
|
我用的是CC2430模块,用了一个网关,一个路由,4个终端节点组网成功过后,重启网关或路由设备,怎样改写程序,才能让终端设备自动重新连接到网关呢?我是过NV_RESTORE这个编译选项,不过貌似没有什么用。用没有人已经解决这个问题,给一个指点。… 查看全部问答> |
|
我用得是AD6.9,在做板子的时候,需要做这么一个槽, 用快捷方式T-V-T,设置之后,用3D看没问题, 可是做GEBER文件的时候,这里没显示要钻孔,只显示是禁止布线层, 还用这种方式做了几个定位孔 ...… 查看全部问答> |
|
1、持续的DIY和原创激励在MSP430版块上建立EEworld MSP430月度最佳项目评选活动,该活动每月评选一次,选出一个月中最佳的DIY项目或者原创项目。基本的活动流程如下:每个月的28日为该月度参选项目的参评截止日期。凡是在上个月28日之后至本月28日 ...… 查看全部问答> |
|
这是代码: #include __CONFIG( FCMEN_OFF & IESO_OFF & CLKOUTEN_OFF & BOREN_OFF & CPD_OFF & CP_OFF & MCLRE_ON & PWRTE_OFF & WDTE_ON & FOSC_INTOSC); //__CONFIG( FCMEN_OFF & IESO_OFF & CLKOUTEN_OFF & BOREN_ON & CPD_OFF & CP_OFF & M ...… 查看全部问答> |




