一、任务介绍
- 测试MSP430F6438的Timer0_A5的中断函数执行
- 输出PWM
平台简介:
名称 | 型号 |
---|---|
测试板 | MSP-TS430PZ100C |
MCU | MSP430F6438 |
调试器 | MSP-FET |
示波器 | HDO9404-MS |
二、程序实现
TIMER0_A5的时钟配置
该模块的时钟配置如下图所示(来自手册)
配置Timer0_A5的要做的有以下三件事,
- 利用TA0CTL寄存器,设置输入时钟、分频(ID)工作模式(MC)。
- 给TA0CCR0写个数字。
- 使能TAIE。
配置TA0.1输出PWM有以下三件事:
- 将P1.2/TA0.1设置为外设功能输出,即,P0SEL和P0DIR的BIT2设置为1。
- 使能定时器的TIMER模块。注意,有人说必须是continuous/up模式才行。这个是不对的。其实是所有的那三个模式都可以作为PWM的基波。
- 设置TA0CCTL1的OUTPUT为某个模式。
- 将TA0CCR1的值设定。
这里有个细节要注意。如果函数返回以后就是整个程序的结束,那么必须要垫上nop,否则会出现掉入_TRAP_的那个问题。
程序设计思路:
- 初始化系统时钟。 主时钟(MCLK)和子系统时钟(SMCLK)使用DCO,辅助时钟(ACLK)使用晶振32.768kHz。
- 配置Timer0_A5。使用ACLK为输入时钟。这样系统进入LPM3以后该时钟依旧有效。定时器采用up模式,启动中断,该中断为52号中断(别问我是怎么知道的,问就是肝就一个字)。PWM输出为TA0.1,也就是第36Pin,P1.2。
- PWM模式为模式三,初始状态是低电平,计数到TACCR1的时候输出高电平,计数到TACCR0的时候回到低电平。如下图所示。
- 完成设置后,主程序进入低功耗模式。外设自动工作,定时器中断函数定期唤醒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输出和定时器中断。