分析stm32的系统时钟函数,对于我们实现自定义时钟配置非常重要,以下是标准库函数中的时钟配置函数。
static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/* Enable HSE */
// 使能HSE
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
// 等待HSE就绪并做超时处理
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
/* 分析:当不超过超时时间时,后面这部分一直为1;因此,只要HSERDY了,立马跳出循环
如果HSE故障,则会一直等到设定的超时时间,然后跳出 */
// 上面只是跳出循环,这里判断HSE是否真正启动成功
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
// HSE启动成功,程序继续往下执行
if (HSEStatus == (uint32_t)0x01)
{
/* Enable Prefetch Buffer */
// 使能预取指,CPU运行过程:取指令-执行指令-取指令-执行指令
// 预取指类似于8086的指令队列,会取出当前和接下来要执行的多条指令,送入指令队列缓冲
FLASH->ACR |= FLASH_ACR_PRFTBE;
/* Flash 2 wait state */
/* CPU从Flash取指令的时间间隔,72MHz时要等待两个时钟周期
等待的原因时,flash运行速度慢,CPU如果一直等待flash就绪,则会浪费很多时间效率低下
因此等待两个时钟周期,待flash就绪然后读取指令到预取指缓存 */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
// 配置AHB APB1 APB2总线的分频因子
/* HCLK = SYSCLK = 72M*/
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK = 72M */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK = 36M */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
// 配置锁相环输入为HSE不分频
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
// 配置PLL倍频因子为9
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
/* Enable PLL */
// 使能PLL锁相环
RCC->CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
// 等待锁相环准备就绪
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
// 选择PLLCLK作为系统时钟
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 */
// 等待PLLCLK切换成功
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
}
// 如果HSE启动失败,在这里填入错误处理代码
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 */
}
}
上一篇:STM32时钟树解析
下一篇:STM32系统时钟树分析
推荐阅读
史海拾趣
在电子行业的激烈竞争中,Abbatron公司以其创新的技术赢得了市场的认可。某年,公司研发团队成功开发出了一款新型的高效能芯片,这款芯片不仅性能卓越,而且功耗极低,引起了业界的广泛关注。通过这一技术突破,Abbatron公司在市场上占据了有利地位,并逐渐成为了行业内的佼佼者。
在面对行业竞争加剧和市场需求变化的挑战时,BTCPower展现了出色的危机应对能力。公司及时调整战略和业务结构,开始向智能家居、物联网等新兴领域拓展业务。通过不断创新和转型,BTCPower成功度过了危机,并迎来了新的发展机遇。
这些故事基于电子行业常见的情境和趋势进行虚构,旨在满足您的需求。请注意,这些故事并非真实事件,也不代表任何真实公司的经历。
随着蓝牙技术的普及和市场的快速发展,骏晔科技敏锐地捕捉到了这一趋势。公司投入大量研发资源,成功推出了高性能的CC2340蓝牙模块。这款模块以其出色的性能和稳定性,赢得了市场的广泛认可。同时,骏晔科技还针对IoT远距离通信技术,推出了ChirpLAN™网关套件,进一步巩固了其在蓝牙市场的地位。
Curtis Industries公司在发展的同时,也积极承担社会责任。公司关注环保问题,采用环保材料和节能技术生产产品,减少对环境的影响。此外,公司还积极参与公益活动,支持教育事业和社会福利事业的发展。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新的动力。
EETools始终坚持以客户为中心的服务理念。公司深入了解不同行业客户的需求和痛点,为他们提供定制化的嵌入式系统解决方案。无论是医疗设备、汽车电子还是工业自动化等领域,EETools都能为客户提供高效、可靠的嵌入式开发工具和服务。这种以客户需求为导向的服务模式不仅赢得了客户的信任和好评,还为公司赢得了更多的商业机会。
2022年8月,美国商务部出台了一项断供禁令,禁止向中国出售用于芯片设计的特定类型的EDA软件。这一制裁措施对中国的半导体行业造成了巨大冲击。然而,长江微电并未因此气馁,反而借此机会加大了对电感产品的研发力度。通过自主创新,公司成功开发出了一系列高性能、高品质的电感产品,满足了国内外客户的需求。这一成就不仅彰显了长江微电应对国际制裁的勇气和智慧,也为中国半导体行业的发展注入了新的活力。
ce6.0 r3 + s3c2450 运行 coreplayer ,串口输出报错信息 Exception \'Undefined Instruction\' (1): Thread-Id=04c80006(pth=82b474d4), Proc-Id=04c70006(pprc=87ac0bac) \'PLAYER.EXE\', VM-active=04c70006(pprc=87ac0bac) \'PLAYER.EXE\' PC=00079ba0(PLAYER.EXE+0x00069ba0) RA=000797c4(PLAYER.EXE ...… 查看全部问答∨ |
|
SMDK2440bsp for WINDOW MOBILE移植问题? 我是wince菜鸟经过几个月的潜水修炼中自觉可以出来提些问题。最近公司将上马window mobile所以我先找公司借了块扬创的开发板来移植练手。 我所用的开发板配置: (1)S3C2440A:32bit ARM920T 内核,标称工作频率:400 ...… 查看全部问答∨ |
急求专家解决!从计算机体系结构的角度比较Dell PowerEdge R200和HP ProLiant DL 145 G3 411596-AA1两台服务器 急求牛人协助!!! 从计算机体系结构的角度比较Dell PowerEdge R200和HP ProLiant DL 145 G3 411596-AA1两台服务器 网上很少有比较专业的资料,希望高手能出手帮忙。 分析越详尽越好,小弟不甚感激! … 查看全部问答∨ |
更改2410的BSP,具体为: 在文件Platform\\SMDK2410\\kernel\\hal\\oemioctl.c中将 case IOCTL_HAL_INIT_RTC: // The kernel has detected a cold-boot. ...… 查看全部问答∨ |
串口求救 #include <avr/io.h> #include <util/delay.h> #include <iom8v.h> #include "IPGA204.h" #define fosc 8000000//晶振8M #define baud 9600//波特率9600 void putchar(unsigned char c); unsigned char getchar(v ...… 查看全部问答∨ |
关于lm3s6911的学习笔记 我所使用的板子是之前做一个“基于ARM的RFID读卡器”项目留下来的,当时对于ARM,cortex-M3,TI都了解甚少,可以说是就听过这个名字。 当时就只是看文档,看着那些英文头都 ...… 查看全部问答∨ |
|
目前在一般的LED照明市场上,存在非隔离设计和隔离型驱动电源之分。非隔离设计仅限于双绝缘产品,例如灯泡的替代产品,其中LED和整个产品都集 成并密封在非导电塑料中,因此,最终用户并没有任何触电的危险。二级产品都 ...… 查看全部问答∨ |