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

本文详述了使用MSP430F6438微控制器进行TIMER0_A5中断和PWM输出的汇编程序设计。通过配置时钟源、定时器模式和中断向量,实现了在低功耗模式下PWM波形的输出,并展示了中断服务程序的执行情况和输出的PWM波形图。
摘要由CSDN通过智能技术生成

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

一、任务介绍

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

平台简介:

名称型号
测试板MSP-TS430PZ100C
MCUMSP430F6438
调试器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

最后是各个中断向量的链接源文件,注意这个不是链接脚本。

			.ref	RESET
			.ref	tmA_int_func
;-------------------------------------------------------------------------------
; Interrupt Vectors
;-------------------------------------------------------------------------------
            .sect   ".reset"                ; MSP430 RESET Vector
            .short  RESET
			.sect	".int52"				; MPS430 Timer_A Interrupt Vector
			.short	tmA_int_func
			

这里就是把我做的定时器的中断服务函数的入口地址放到中断向量的.int52的位置上。

这样,这个测试程序就完成了。

三、输出

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

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

四、总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值