MSP430的汇编程序设计之一:ACLK和SMCLK时钟输出

一、背景介绍

用惯了ARM-CM的MCU后,玩玩MSP430真的是很有体验。最近接触了一个项目,用的是MSP430系列的。买了个测试板玩玩。

本来想买个MSP430F437的,但是不小心采购给买成了MSP430F6438的测试板。437的测试器叫MSP-TS430PZ100,而这个6438的是MSP-TS430PZ100C。就多了个C而已,然后就是很大的区别。
在这里插入图片描述

阴差阳错的,我发现,MSP430F6438是个非常好的MCU。

就软件开发而言,我的工具是这样的。

工具名称
IDECode Composite Studio v12
DebugerMSP-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

内部时钟

时钟说明可用源
ACLKAuxiliary Clock,辅助时钟XT1CLK、REFOCLK、VLOCLK、DCOCLK、DCOCLKDIV、XT2CLK
MCLKMaster Clock,主时钟XT1CLK、REFOCLK、VLOCLK、DCOCLK、DCOCLKDIV、XT2CLK
SMCLKSubsystem 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/nP1.034所有模式
SMCLKP3.446Active、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波形
第一个是ACLK的波形。第二个是SMCLK波形。可以看出,晶振起振,始终频率为32.6kHz左右;FLL工作正常,SMCLK正常输出,频率为2MHz左右。实际测量是会发现DCO的频率有抖动,这个目前怀疑是和调制有关,有待研究。

六、总结

通过简单的配置,MSP430F6438可以输出ACLK和SMCLK的波形。有以下4点注意。

  1. MSP430的汇编可以直接使用C的宏
  2. SMCLK必须在LPM1、LPM0和Active的模式下才能工作。其他的模式不能工作
  3. 如果要测试寄存器在其他的设置下的运行状态,不需要反复修改代码编译下载执行,可以在调试界面直接修改运行
  4. 操作sr寄存器的指令前后都要有nop,包括mov、运算指令、eint等。之前如果没有nop会有warning;之后的nop,可以在进入LPM之后调试器停留的位置,防止调试器卡死。

利用汇编,实现底层函数,方便地操作寄存器实现配置。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值