MSP430的汇编程序设计之二:TIMER0_A5中断与PWM输出

发布于:2022-11-09 ⋅ 阅读:(7) ⋅ 点赞:(0) ⋅ 评论:(0)

MSP430的汇编程序设计之二:TIMER0_A5中断与PWM输出

一、任务介绍

  1. 测试MSP430F6438的Timer0_A5的中断函数执行
  2. 输出PWM

平台简介:

名称 型号
测试板 MSP-TS430PZ100C
MCU MSP430F6438
调试器 MSP-FET
示波器 HDO9404-MS

二、程序实现

TIMER0_A5的时钟配置

该模块的时钟配置如下图所示(来自手册)

在这里插入图片描述

配置Timer0_A5的要做的有以下三件事,

  1. 利用TA0CTL寄存器,设置输入时钟、分频(ID)工作模式(MC)。
  2. 给TA0CCR0写个数字。
  3. 使能TAIE。

配置TA0.1输出PWM有以下三件事:

  1. 将P1.2/TA0.1设置为外设功能输出,即,P0SEL和P0DIR的BIT2设置为1。
  2. 使能定时器的TIMER模块。注意,有人说必须是continuous/up模式才行。这个是不对的。其实是所有的那三个模式都可以作为PWM的基波。
  3. 设置TA0CCTL1的OUTPUT为某个模式。
  4. 将TA0CCR1的值设定。

这里有个细节要注意。如果函数返回以后就是整个程序的结束,那么必须要垫上nop,否则会出现掉入_TRAP_的那个问题。

程序设计思路:

  1. 初始化系统时钟。 主时钟(MCLK)和子系统时钟(SMCLK)使用DCO,辅助时钟(ACLK)使用晶振32.768kHz。
  2. 配置Timer0_A5。使用ACLK为输入时钟。这样系统进入LPM3以后该时钟依旧有效。定时器采用up模式,启动中断,该中断为52号中断(别问我是怎么知道的,问就是肝就一个字)。PWM输出为TA0.1,也就是第36Pin,P1.2。
  3. PWM模式为模式三,初始状态是低电平,计数到TACCR1的时候输出高电平,计数到TACCR0的时候回到低电平。如下图所示。
  4. 完成设置后,主程序进入低功耗模式。外设自动工作,定时器中断函数定期唤醒MCU执行中断服务程序。
    在这里插入图片描述

源代码

主函数文件:

;-------------------------------------------------------------------------------
; 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
;-------------------------------------------------------------------------------
; Main loop here
;-------------------------------------------------------------------------------
			call #bsp_init
			nop
			mov	 #GIE+LPM1,	sr

;-------------------------------------------------------------------------------
; Stack Pointer definition
;-------------------------------------------------------------------------------
            .global __STACK_END
            .sect   .stack

bsp.asm文件

	.cdecls C,LIST,"msp430.h"       ; Include device header file
	.global bsp_init
	.ref tmA_init

	.text
bsp_init:	.asmfunc
	call #ucs_setup
	call #tmA_init
	ret
	.endasmfunc

ucs_setup:	.asmfunc	; Setup the clocks of the MCU
	; Select DCOCLK as Main Clock and Subsystem Clock, XT1CLK as ACLK

	mov 	#SELM__DCOCLK | SELA__XT1CLK | SELS__DCOCLK, UCSCTL4

	; Output ACLK at P1.0, which is Pin 34
	bis.b	#BIT0, P1DIR
	bis.b	#BIT0, P1SEL
	; Output SMCLK at P3.4, which is Pin 46
	bis.b	#BIT4, P3DIR
	bis.b	#BIT4, P3SEL
	ret
	.endasmfunc
	

tmA.asm文件:

	.cdecls C,LIST,"msp430.h"       ; Include device header file

	.global tmA_int_func
	.global tmA_init

	.text
tmA_init: .asmfunc	; Setup the Timer0_A5

	bis.b #BIT5, P5DIR
	bis.b #BIT2, P1DIR
	bis.b #BIT2, P1SEL

	; Set TASSEL to use ACLK, the frequency of ACLK is 32.768kHz
	bic	#TASSEL1+TASSEL0+ID1+ID0+MC0+MC1, TA0CTL;
	bis #TASSEL__ACLK|ID__1|MC__UP, TA0CTL;
	bis #TAIE, TA0CTL;

	mov #32, TA0CCR0;
	mov	#24, TA0CCR1;
	bis #OUTMOD_3, TA0CCTL1;
	ret
	.endasmfunc

tmA_int_func:	.asmfunc
	bic #TAIFG, TA0CTL
	xor	#BIT5, P5OUT
	reti
	.endasmfunc

三、输出

设置TA0CCR0为32,TA0CCR1为24,ACLK的频率是32.768kHz。输出的PWM波形如下所示。

在这里插入图片描述
中断服务程序可以定期进入,通过DEBUG窗口可以看到,如下图所示。
在这里插入图片描述

总结

根据手册的提示,可以实现在低功耗模式下PWM输出和定时器中断。