2025/12/26 2:52:20
网站建设
项目流程
代理备案网站,做网站需要交印花税,丰台成都网站建设,腾讯企点多少钱一年每一家MCU厂家的SDK写法和寄存器功能都有所不同#xff0c;如果不熟悉的话就会配置错误#xff0c;导致MCU运行不稳定。
接下来就已APM32E030的手册和SDK#xff0c;解读下高速时钟的配置和相关注意事项。
实现了解MCU的高速时钟要先看下用户手册。
高速时钟源分内部时钟源和…每一家MCU厂家的SDK写法和寄存器功能都有所不同如果不熟悉的话就会配置错误导致MCU运行不稳定。接下来就已APM32E030的手册和SDK解读下高速时钟的配置和相关注意事项。实现了解MCU的高速时钟要先看下用户手册。高速时钟源分内部时钟源和外部时钟源内部时钟源内部时钟包含 HSICLK高速内部时钟信号和 LSICLK低速内部时钟信号。HSICLK 时钟信号由内部 8MHz 的 RC 振荡器产生。不同芯片的 RC 振荡器频率不同且同一颗芯片随着温度、电压的变化也会存在差异每个芯片的 HSICLK 时钟频率在出厂前已经被厂家校准到 1%25℃、VDDVDDA3.3V外部时钟源外部时钟信号包括 HSECLK高速外部时钟信号和 LSECLK低速外部时钟信号。外部的时钟源有两种⚫ 外部晶体/陶瓷谐振器常规的无源晶振⚫ 用户外部时钟有源晶振或者是其他芯片提供的时钟从E030的用户手册可以看出E030的最大主频也就是SYSCLK最大是72Mhz。系统时钟源可以从HSECLK外部时钟的时钟PLLCLK(PLL的时钟)、HSICLK(内部8M时钟)这三个中来选择。HSECLK的输入时钟范围是4~32Mhz,可通过PLL的分频器和倍频器配置成PLL最大72M主频。HSICLK的时钟频率是8M,并且需要固定2分频到PLL的倍频器最大16倍频所以最大主频只能配到64Mhz.系统时钟会再经过AHBPSC和APBPSC分频配置后到各外设。其中TMR的时钟需要注意所有 TMRxCLK定时器时钟频率分配由硬件按以下 2 种情况自动设置⚫如果相应的 APB 预分频系数是 1定时器的时钟频率与所在 APB 总线频率一致。⚫否则定时器的时钟频率被设为与其相连的 APB 总线频率的 2 倍具体的寄存器在用户手册中主要是时钟控制寄存器 1RCM_CTRL1和时钟配置寄存器 1RCM_CFG1具体功能可以查看用户手册。除了RCM相关的寄存器还有Flash的等待周期与预取使能与时钟相关需要注意。理论部分主要就这些更详细的建议查看用户手册接下来是代码的相关部分。芯片上电实现会运行到启动文件初始化完中断向量表后会进入到SystemInit()函数进行默认的时钟初始化。在SystemInit()函数中会复位时钟相关的寄存器然后进入SystemClockConfig();进行默认的时钟初始化。SystemClockConfig()会根据宏定义来进行时钟初始化。SDK默认配置的是8M外部无源晶振配置主频72M。如果需要配置更低的主频可以直接通过选择不同的宏定义来直接切换。如果使用的外部高速晶振是其他频率比如4M、12M、16M等就不能直接修改宏定义来配置主频还需要做如下修改。1、将HSE_VALUE改成实际的晶振频率例如使用12M晶振就修改成复制#define HSE_VALUE ((uint32_t)12000000)2、修改PLL倍频系数寄存器PLLMULCFG4对应数据手册可以看到是6倍频12M*672M如果产品应用对时钟精度要求不高想不接外部晶振使用内部晶振倍频到64M的操作。1、屏蔽默认的使用外部晶振的宏定义2、编写如下使用内部晶振的时钟初始化函数在main函数中调用复制voidSystemClock_HSI_PLL_Init(){RCM_Reset();/* Enable HSI */RCM_EnableHSI();/* Wait until HSI is ready */while(RCM-CTRL1_B.HSIRDY** RESET);FMC_EnablePrefetchBuffer();FMC_SetWS2();RCM_ConfigAHB(RCM_SYSCLK_DIV_1);RCM_ConfigAPB(RCM_HCLK_DIV_1);/* SYSCLKFreq (HSI * 16) / 2 */RCM_ConfigPLL(RCM_PLL_SEL_HSI_DIV2, RCM_PLLMF_16);/* Enable PLL */RCM_EnablePLL();while(RCM-CTRL1_B.PLLRDY** BIT_RESET);/* Selct PLL as Sysclk */RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_PLL);while(RCM-CFG1_B.SCLKSWSTS !0x02);}如果想要在程序运行中切换主频频率比如将外部晶振72M的配置切换到36M复制voidSystemClock_HSE_PLL_Init(){uint32_t i;/* Select HSI as System Clock at first */RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_HSI);/* Disable PLL */RCM_DisablePLL();/* Wait until Pll is ready */while(RCM-CTRL1_B.PLLRDY** SET);RCM_ConfigHSE(RCM_HSE_OPEN);for(i 0; i HSE_STARTUP_TIMEOUT; i){if(RCM-CTRL1_B.HSERDY**){break;}}if(RCM-CTRL1_B.HSERDY**){FMC_EnablePrefetchBuffer();FMC_SetWS2();RCM_ConfigAHB(RCM_SYSCLK_DIV_1);RCM_ConfigAPB(RCM_HCLK_DIV_1);/* Config PLL source and multiplication factorSYSCLKFreq (HSE * 6) / 4 */RCM_ConfigPLL(RCM_PLL_SEL_HSE, RCM_PLLMF_9);RCM_ConfigCLKDIV(RCM_CLK_DIV_2);/* Enable PLL */RCM_EnablePLL();while(RCM-CTRL1_B.PLLRDY** BIT_RESET);/* Selct PLL as Sysclk */RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_PLL);while(RCM-CFG1_B.SCLKSWSTS !0x02);}else{/*可增加HSE启动失败的处理程序*/}}如果要知道系统现在的时钟配置是多少可以参考SDK中的RCB--RCM_ClockSwitch 例程复制/* Initiatate the usart */APM_TINY_COMInit(COM1);printf(sysSource %s , RCM_SYSCLK_SEL_TAB[RCM_ReadSYSCLKSource()]);printf(sysClock %PRId32\r\n, RCM_ReadSYSCLKFreq());使用串口来打印当前时钟配置注意这个打印是基于HSE_VALUE与实际相符的情况才是准确的需要注意核对。复制intmain(void){APM_TINY_LEDInit(LED2);APM_TINY_LEDInit(LED3);APM_TINY_PBInit(BUTTON_KEY1, BUTTON_MODE_EINT);APM_TINY_PBInit(BUTTON_KEY2, BUTTON_MODE_EINT);APM_TINY_COMInit(COM1);ClockOutputInit();printf(sysSource %s , RCM_SYSCLK_SEL_TAB[RCM_ReadSYSCLKSource()]);printf(sysClock %PRId32\r\n, RCM_ReadSYSCLKFreq());SystemClock_HSE_PLL_Init();for(;;){Delay();APM_TINY_LEDToggle(LED2);}}这是启动文件不初始化时钟在main中配置64M主频的测试结果。---------------------作者Alden链接https://bbs.21ic.com/icview-3459364-1-1.html来源21ic.com此文章已获得原创/原创奖标签著作权归21ic所有任何人未经允许禁止转载。