历史上的今天
今天是:2025年08月19日(星期二)
2018年08月19日 | STM32在外部32Mhz晶振下的时钟配置方法
2018-08-19 来源:eefocus
1. 硬件平台
本例程使用的是 STM32F302RDT6 芯片,其时钟配置方法在其它ST单片机中也类似。
2. 实验目的
使用外部 32Mhz 晶振配置系统时钟为 72Mhz。
3. 配置原理
根据STM32F302RD芯片的参考手册,可以查看该芯片的时钟树结构,这里我们配置系统时钟 SYSCLK 为72Mhz,所以这里只需要修改 PREDIV 的分频值为4分频,其它 PLL 倍频等配置和使用8Mhz外部晶振时配置相同。
4. 修改配置
(1)打开工程里的 system_stm32f30x.c 文件,找到 SetSysClock() 函数,进行时钟配置修改。这里我们只需要将外部时钟四分频后得到8Mhz的时钟,所示我们只需要添加 RCC->CFGR2 |= (uint32_t)RCC_CFGR2_PREDIV1_DIV4;来实现时钟的分频。
static void SetSysClock(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/******************************************************************************/
/* PLL (clocked by HSE) used as System clock source */
/******************************************************************************/
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------*/
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
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)
{
/* Enable Prefetch Buffer and set Flash Latency */
FLASH->ACR = FLASH_ACR_PRFTBE | (uint32_t)FLASH_ACR_LATENCY_1;
/* HCLK = SYSCLK / 1 */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK / 1 */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK / 2 */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
/* PLL configuration */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL9);
/*!< PREDIV1 input clock divided by 4 */
RCC->CFGR2 |= (uint32_t)RCC_CFGR2_PREDIV1_DIV4; // add. by zhixiaoxing
/* Enable PLL */
RCC->CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
{
}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
}
}
(2)全局搜索 HSE_VALUE 空定义,在 stm32f30x.h 文件中,这里我们将外部晶振时钟修改为 32000000 Hz
#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)32000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
5. 查看总线时钟
在对STM32时钟进行配置后,为了进一步验证配置的正确性,我们可以使用仿真来查看系统各总线的时钟频率。首先在主函数中添加如下代码:
int main(void)
{
RCC_ClocksTypeDef get_rcc_clock;
RCC_GetClocksFreq(&get_rcc_clock); // 获取系统时钟配置
}
通过仿真可以查看各总线时钟的配置频率,如下图所示:
Note:注意一定要修改宏 #define HSE_VALUE ((uint32_t)32000000) /!< Value of the External oscillator in Hz /的值,因为时钟使用该宏定义进行计算。
5. 慎入此坑
在时钟配置时,需要注意的一些问题:
(1)在时钟树任何一个倍频的环节都不能超频,即使后面分频系数较大,还是会导致时钟配置失败;
(2)在配置外部晶振四分频时,发现了一个诡异的问题,CFGR2寄存器一定要在CFGR寄存器之后,否则会导致CGFR2寄存器的值与配置的不符,至今不明其诡异之处?
/* PLL configuration */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL9);
/*!< PREDIV1 input clock divided by 4 */
RCC->CFGR2 |= (uint32_t)RCC_CFGR2_PREDIV1_DIV4; // add. by zhixiaoxing
下一篇:STOP状态下通过串口唤醒MCU
史海拾趣
|
本人想知道 nokia 内置camera的生产厂商,比如 型号为nokia 3220的内置camera型号是什么?生产厂商,以及如何获得这些成熟产品零部件的详细datasheet,除了拆装,还有什么其它方法, 还有一款是索爱的外置camera,MCA_25,我在网上找它的camera型号及资 ...… 查看全部问答> |
|
通过制成的实物验证CPLD 与单片机接口设计完全正确。单片机和 CPLD 具有很强的互补性:在逻辑运算、智能控制方面,单片机具有不可替代的优越性;而在高速稳定等方面,CPLD 无疑是首选。因此,在目前的电子设计中,充分利用单片机+CPLD 结构将起到 ...… 查看全部问答> |
|
如果用单片机上电配置FPGA~~1,我用Quartus II 8.1 (32-Bit)编译生成.POF文件,接下来怎样转换为可用于单片机配置的文件A,用什么工具转换? 2,转换后的文件A是不是直接烧进单片机就可以? 本人初学FPGA,关于单片机怎样配置FPGA文件,在网上找 ...… 查看全部问答> |
|
我想请问。当我点击F1 返回上一个窗口。或者是销毁现在的窗口。去显示别的窗口。这样的代码应该怎么写啊。 if(pMsg->message == WM_KEYDOWN) { &n ...… 查看全部问答> |
|
1.关于驱动分层与过滤驱动的关系。我一直搞不清驱动分层与过滤驱动的分别,我现在自己的理解是:对于过滤驱动来说,它处理完截获的IRP后直接调用IoCallDriver发送给下一层设备,而对于分层驱动来说某一层的驱动完成IRP后使用IoCompleteRequest向IO ...… 查看全部问答> |
|
小弟想学嵌入式,大牛能不能推荐几本书啊?(模拟电子,数电方面) 小弟想学嵌入式,大牛能不能推荐几本书啊? 小弟想学嵌入式,大牛能不能推荐几本书啊? 主要是做ARM方向的,也可能搞SOC 用VERILOG 硬件描述语言 模电,数电基础不是很好,(不是学这个专业的),大牛能不能推荐几本比较好的书啊? 另外还要看什么相 ...… 查看全部问答> |
|
MSP430学习小记~~~~关于在IAR环境下使用MSP的中断。 前段时间一直用CCS,但是机器太差(06 年的笔记本),启动一次CCS的调试需要近2分钟。。。。。:funk: 于是换IAR5.10,速度确实提升不少。。。。。 今天使用IAR新建的工程调试MSP430的IO中断程序。整个中断程序如下: ...… 查看全部问答> |
|
ST微控制器,真的很不错,不仅仅是因为他的产品性能,还有它的后续服务;至今为止,可以说没有任何一家芯片厂商能做到像ST这样将芯片推广得如此深入人心。 完善的程序库,让客户在很短的时间内就能做产品开发; 丰富的应用案例,让不同的客 ...… 查看全部问答> |




