MSP432学习03--设立MSP432时钟

传送门:

第一篇入门创建工程:MSP432学习01--新建keil空工程_Kindred。的博客-CSDN博客https://blog.csdn.net/qq_51644084/article/details/127855690

第二篇建立自己的函数库:MSP432学习02--建立自己的oled硬件库_msp432iic_Kindred。的博客-CSDN博客这篇文章旨在分享对于一个陌生的模块,如何创建一个属于自己的硬件库的过程,以典型的oled模块SSD1306为例。https://blog.csdn.net/qq_51644084/article/details/127984866?spm=1001.2014.3001.5501        懈怠了很长时间(其实是开学考的折磨),前段时间折腾这个时钟折腾了好久,甚至怀疑是买的MSP432是盗版货,但是最后还是折腾出来了(还是存在一点问题,希望高手能指点一下)目前打算写一篇blog复习一下时钟配置,之后可能还会有其他内容(终于重视到学习笔记的重要性,之前搞比赛学的无刷电机差不多全忘了,打算再开一个栏目复习一下)

        再次声明一下:本文仅供参考,实质是我的学习笔记!!希望与大家一起学习进步!

        首先先来了解一下MSP432的时钟树,如下图:

        MSP432学习03--设立MSP432时钟_第1张图片

        首先是两个外部时钟源:HFXT和LFXT,他们是由外围电路的晶振提供时钟参考的, HFXT是高速外部时钟源,LFXT是低速外部时钟源。HFXT可达48MHz,可以到128分频,LFXT一般做低频时钟源,也可达128分频。DCO是一个内部逻辑时钟源,默认值是3MHz,可以配置成不同的频率值,甚至可以超频至96MHz(不建议),一般精度不高,但是可以外接高精度电阻改善精度,也可达128分频。内部还有几个时钟源:VLO(超低功耗低频时钟,一般不用,降低功耗使用)、REFO(低频时钟源)、MODOSC(模块振荡器)、SYSOSC(系统振荡器)。

        由连线可知,ACLK(辅助时钟)可由(VLO,REFO、LFXT)得到,主要给外设提供时钟,最大值128kHz;MCLK(主时钟)可由任何时钟源获得,主要是CPU和滴答定时器使用,也可给外设使用;HSMCLK(子系统时钟),SMCLK(低速子系统时钟)都可由任何时钟源获得,主要给外设使用;BCLK(低速备用时钟)由(LFXT和REFO)获得,最大32768Hz,一般不使用;LFXTCLK,VLOCLK(典型值9.4kHz),REFOCLK(典型32768Hz,128kHz),MCOCLK(典型值25MHz,可做ADC时钟),SYSCLK(典型值5MHz,也可做ADC时钟)都直接有对应时钟源不分频获得。

        再谈谈MSP432默认的时钟状态,方便我们之后配置时钟。

        系统重启后,MSP432会进入LDO模式(本质是低功耗模式即core voltage level 0),在这个模式下CPU最大频率会被限制在24MHz以内,要想更高需要先退出这个模式。默认的时钟配置过程如下:

1、LFXT为LFXTCLK提供时钟;

2、ACLK选中LFXTCLK,ACLK默认不分频;

3、BCLK选中LFXTCLK;

4、LFXT被禁用(原因是LFXT是外部晶振,需要两个IO引脚输出频率,但是LFXT的这两个引脚与general-purpose IO共用,在这两个IO设定为LFXT模式之前,LFXT被禁用),这会导致2、3步发生错误,系统默认逻辑会使ACLK,BCLK自动选定REFOCLK(默认32768Hz);

5、HFXT被禁用(同样的原因);

6、MCLK, HSMCLK, SMCLK默认选定DCOCLK(默认3MHz),都默认不分频。

       我的目标是配置timer32,timerA,和systick timer,timer32默认时钟MCLK,timerA选用SMCLK,systick timer默认使用SYSCLK,这里为了方便我配置成MCLK=SMCLK=HSMCLK=SYSCLK=48MHz,aCLK=bCLK=32768Hz(默认)。

      先给出具体函数,但是建议不要参考,由于我这块MSP432的外部晶振好像有问题,配置老是失败,就算用MSP432官方的driver_lib中的例程都不行。希望有大佬指点一下是哪里出现了问题。

        配置步骤如下(我只配置了HFXT):        

        1、数据手册找到HFXIN和HFXOUT(PJ.3,PJ.2),LFXIN和LFXOUT(PJ.0,PJ.1)共用的IO口,将它们配置为晶振输入模式(primary mode);

        2、设置晶振频率值;

        3、退出VCORE0模式,进入VCORE1模式;

        4、开启HFXT和LFXT;

        4、设定MCLK,SMCLK,HSMCLK.

/* Halting the Watchdog */
    MAP_WDT_A_holdTimer();
    
    /* Configuring pins for peripheral/crystal usage and LED for output */
    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ,
            GPIO_PIN3 | GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION);
		CS_setExternalClockSourceFrequency(32768,48000000);

    /* Starting HFXT in non-bypass mode without a timeout. Before we start
     * we have to change VCORE to 1 to support the 48MHz frequency */
    MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);
    MAP_FlashCtl_setWaitState(FLASH_BANK0, 2);
    MAP_FlashCtl_setWaitState(FLASH_BANK1, 2);
    CS_startHFXT(false);

    /* Initializing MCLK to HFXT (effectively 48MHz) */
    MAP_CS_initClockSignal(CS_MCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);
		MAP_CS_initClockSignal(CS_SMCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);
		MAP_CS_initClockSignal(CS_HSMCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);

        

         我真正使用的是另外一种较为不精确的方法,在system_msp432.c文件将DCO默认时钟改为48MHz(外未接精密电阻,所以较为不准确,实属下策)。MCLK,SMCLK, HSMCLK默认接DCO,所以都配置为48MHz。

MSP432学习03--设立MSP432时钟_第2张图片

        最后配置定时器即可,举例配置timer32_0

void Tim32_0_Int_Init(uint32_t aar, uint8_t psc)
{
    MAP_Timer32_initModule(TIMER32_0_BASE, psc, TIMER32_32BIT, TIMER32_PERIODIC_MODE);
    MAP_Timer32_setCount(TIMER32_0_BASE, aar);
    MAP_Timer32_enableInterrupt(TIMER32_0_BASE);
    MAP_Timer32_startTimer(TIMER32_0_BASE, false); //连续计数模式 false
    MAP_Interrupt_enableInterrupt(INT_T32_INT1);
}

        定时时间计算:T = (arr + 1) * (psc + 1) / 48MHz,到达定时时间会触发一个中断,在中断处理函数中做相应的事即可。

      

/* Timer32 ISR */
void T32_INT1_IRQHandler(void)
{
    MAP_Timer32_clearInterruptFlag(TIMER32_0_BASE);

    /*开始填充用户代码*/
		LED_RED_Tog();
    /*结束填充用户代码*/
}

        

仍然在此鸣谢b站@m-RNA,我的工程文件大部分参考于他,他在b站有MSP432的快速入门视频和相应资料:MSP432P4电赛入门速成/Keil/CCS/VScode_哔哩哔哩_bilibili

还有前文的参考资料也已经标明出处。

限于本人水平,肯定有很多疏漏,希望大家多多指教!
 

你可能感兴趣的:(学习,单片机,嵌入式硬件)