一、背景介绍
用惯了ARM-CM的MCU后,玩玩MSP430真的是很有体验。最近接触了一个项目,用的是MSP430系列的。买了个测试板玩玩。
本来想买个MSP430F437的,但是不小心采购给买成了MSP430F6438的测试板。437的测试器叫MSP-TS430PZ100,而这个6438的是MSP-TS430PZ100C。就多了个C而已,然后就是很大的区别。
阴差阳错的,我发现,MSP430F6438是个非常好的MCU。
就软件开发而言,我的工具是这样的。
工具 | 名称 |
---|---|
IDE | Code Composite Studio v12 |
Debuger | MSP-FET |
芯片 | MSP430F6438 |
开发板 | MSP-TS430PZ100C,安装32,768Hz晶振 |
二、时钟简述
MSP430F6438内部时钟框图如下所示(MSP430x5xx and MSP430x6xx Family User’s Guide (Rev. Q)第161页)。
虽然很多帖子都说过,但是这里还是为了说明方便,简单说一下。时钟源由下表所述
MSP430F6438的时钟由UCS模块(Unified Clock System)产生。UCS一共有5个时钟源,有4个输出。
时钟源 | 说明 | 可用于PLL |
---|---|---|
XT1CLK | 低频或高频振荡器,可用晶振、振荡器或外部时钟源实现,4MHz ~ 32MHz | 是 |
VLOCLK | 内部甚低功耗低频振荡器,10kHz | 否 |
REFOCLK | 内部低频振荡器,32,768Hz | 是 |
DCOCLK | 内部数控振荡器,被FLL稳定 | 否(PLL输出) |
XT2CLK | (可选)高频振荡器,可用晶振、振荡器或外部时钟源实现,4MHz ~ 32MHz | 是 |
内部时钟
时钟 | 说明 | 可用源 |
---|---|---|
ACLK | Auxiliary Clock,辅助时钟 | XT1CLK、REFOCLK、VLOCLK、DCOCLK、DCOCLKDIV、XT2CLK |
MCLK | Master Clock,主时钟 | XT1CLK、REFOCLK、VLOCLK、DCOCLK、DCOCLKDIV、XT2CLK |
SMCLK | Subsystem Master Clock,子系统时钟 | XT1CLK、REFOCLK、VLOCLK、DCOCLK、DCOCLKDIV、XT2CLK |
三、MSP430F6438以及TI汇编简述
TI的汇编伪指令与GNU汇编是不完全一样的。在TI的汇编下,可以直接通过下面的办法将C头文件下的宏转换成汇编文件中的符号。详细的伪指令可以去查阅手册《TMS320C28x Assembly Language Tools
v22.6.0.LTS》
.cdecls C,LIST,"msp430.h" ;注意不能顶格
如果定义一个函数,可以使用.asmfunc和.endasmfunc伪指令控制。就定义了一个叫做user_func的函数。
.global user_func ;注意不能顶格
.text
user_func: .asmfunc ;注意这里必须顶格
...
ret或reti
.endasmfunc ;注意不能顶格
如果想定义一个在data段或在bss段的变量,可以用下面的语句。
.data
user_data_0: .short 0x1234 ;定义了一个在data段的变量,叫user_data_0,初始化为0x1234
.bss symbol, 5;在bss段定义一个叫做symbol的变量,大小为5个字节
在bss段上定义变量的格式是
.bss symbol, size in bytes[, alignment]
不过注意一点,我们如果去查阅初始的链接脚本,会发现data段的VMA和LMA是一样的。那么,我们就不像ARM-CM4那样,上电的时候需要把data段的变量的初始化数值从rodata段手动拷过去。换句话说,msp430系列的片上RAM是掉电不丢失的。data段的初始化数据不需要手动加载,但是bss段如果严格要求初始化为0的话,则需要手动清零。
四、程序编写
根据手册,只有ACLK/n和SMCLK可以被输出。
时钟名称 | IO口 | Pin | 输出模式 |
---|---|---|---|
ACLK/n | P1.0 | 34 | 所有模式 |
SMCLK | P3.4 | 46 | Active、LPM0和LPM1 |
简单配置一下,把这两个时钟信号输出。
四.1、 建立工程
打开CCS,建立工程文件。创建汇编项目Clock_Output。
主程序代码如下所示。
;-------------------------------------------------------------------------------
; MSP430 Assembler Code Template for use with TI Code Composer Studio
;
;
;-------------------------------------------------------------------------------
.cdecls C,LIST,"msp430.h" ; Include device header file
;-------------------------------------------------------------------------------
.def RESET ; Export program entry-point to
; make it known to linker.
.ref bsp_init
;-------------------------------------------------------------------------------
.text ; Assemble into program memory.
.retain ; Override ELF conditional linking
; and retain current section.
.retainrefs ; And retain any sections that have
; references to current section.
;-------------------------------------------------------------------------------
RESET mov.w #__STACK_END,SP ; Initialize stackpointer
StopWDT mov.w #WDTPW|WDTHOLD,&WDTCTL ; Stop watchdog timer
movx #0x1212, r4
mova RESET, r5
;-------------------------------------------------------------------------------
; Main loop here
;-------------------------------------------------------------------------------
call #bsp_init
bis #GIE+LPM1, sr
NOP
;-------------------------------------------------------------------------------
; Stack Pointer definition
;-------------------------------------------------------------------------------
.global __STACK_END
.sect .stack
;-------------------------------------------------------------------------------
; Interrupt Vectors
;-------------------------------------------------------------------------------
.sect ".reset" ; MSP430 RESET Vector
.short RESET
bsp_init函数所在的源文件如下所示。
.cdecls C,LIST,"msp430.h" ; Include device header file
.global bsp_init
.text
bsp_init: .asmfunc
call #ucs_setup
ret
.endasmfunc
ucs_setup: .asmfunc
;设置SMCLK的时钟源是DCO
bic.b #SELS_7, UCSCTL4
bis.b #SELS__DCOCLK, UCSCTL4
; 设置ACLK信号输出
bis.b #BIT0, P1DIR
bis.b #BIT0, P1SEL
; 设置SMCLK信号输出
bis.b #BIT4, P3DIR
bis.b #BIT4, P3SEL
ret
.endasmfunc
编译,下载,执行
五、测试结果
将ACLK(P1.0)和SMCLK(P3.4)的波形用示波器测量,如图所示
第一个是ACLK的波形。第二个是SMCLK波形。可以看出,晶振起振,始终频率为32.6kHz左右;FLL工作正常,SMCLK正常输出,频率为2MHz左右。实际测量是会发现DCO的频率有抖动,这个目前怀疑是和调制有关,有待研究。
六、总结
通过简单的配置,MSP430F6438可以输出ACLK和SMCLK的波形。有以下4点注意。
- MSP430的汇编可以直接使用C的宏
- SMCLK必须在LPM1、LPM0和Active的模式下才能工作。其他的模式不能工作
- 如果要测试寄存器在其他的设置下的运行状态,不需要反复修改代码编译下载执行,可以在调试界面直接修改运行
- 操作sr寄存器的指令前后都要有nop,包括mov、运算指令、eint等。之前如果没有nop会有warning;之后的nop,可以在进入LPM之后调试器停留的位置,防止调试器卡死。
利用汇编,实现底层函数,方便地操作寄存器实现配置。