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的时钟树,如下图:

        

        首先是两个外部时钟源: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。

        最后配置定时器即可,举例配置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

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

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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MSP432 低功耗高性能并存10.1 Digital I/O Introduction The digital I/O features include: • Independently programmable individual I/Os • Any combination of input or output • Individually configurable interrupts for ports (available for certain ports only) • Independent input and output data registers • Individually configurable pullup or pulldown resistors • Wake-up capability from ultra-low power modes (available for certain ports only) • Individually configurable high drive I/Os (available for certain I/Os only) Devices within the family may have up to eleven digital I/O ports implemented (P1 to P10 and PJ). Most ports contain eight I/O lines; however, some ports may contain less (see the device-specific data sheet for ports available). Each I/O line is individually configurable for input or output direction, and each can be individually read or written. Each I/O line is individually configurable for pullup or pulldown resistors. Certain ports have interrupt and wake-up capability from ultra-low power modes (see device specific data sheet for ports with interrupt and wake-up capability). Each interrupt can be individually enabled and configured to provide an interrupt on a rising or falling edge of an input signal. All interrupts are fed into an encoded Interrupt Vector register, allowing the application to determine which sub-pin of a port has generated the event. Individual ports can be accessed as byte-wide ports or can be combined into half-word-wide ports. Port pairs P1 and P2, P3 and P4, P5 and P6, P7 and P8, and so on, are associated with the names PA, PB, PC, PD, and so on, respectively. All port registers are handled in this manner with this naming convention. The main exception are the interrupt vector registers, for example, interrupts for ports P1 and P2 must be handled through P1IV and P2IV, PAIV does not exist. When writing to port PA with half-word operations, all 16 bits are written to the port. When writing to the lower byte of port PA using byte operations,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值