用launchpad板子,定时器A写了一个P1.0口输出音乐的程序,只能演奏第一个音,请大家看看什么原因
#include "io430g2553.h"
void delay_1ms(void);
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);
unsigned int sb;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
CCTL0 = CCIE; // CCR0 interrupt enabled
sb=1908;
CCR0 = sb; //第一个音
TACTL = TASSEL_2 + MC_1; // SMCLK, contmode
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
delay_nms(200);
sb=1701;
CCR0 = sb;//第二个音
// TACTL = TASSEL_2 + MC_1; // SMCLK, contmode
//_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
delay_nms(200);
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= 0x01; // Toggle P1.0
CCR0= sb; // Add Offset to CCR0
//LPM0_ EXIT;
}
/*****************************************
* 1us延时函数
****************************************/
void delay_1us(void)
{
asm("nop");
}
/*****************************************
* N us延时函数
****************************************/
void delay_nus(unsigned int n)
{
unsigned int i;
for (i=0;i
delay_1us();
}
/*****************************************
* 1ms延时函数
****************************************/
void delay_1ms(void)
{
unsigned int i;
for (i=0;i<1140;i++);
}
/*****************************************
* N ms延时函数
****************************************/
void delay_nms(unsigned int n)
{
unsigned int i=0;
for (i=0;i
delay_1ms();
}
[ 本帖最后由 qingwen9668 于 2013-12-19 18:02 编辑 ]
连续模式?连续模式的CCRO中断的周期是一定的吧?除非改时钟
用up模式?
很是好奇,正好前几天某网站给寄来了一块launchpad。
昨晚在CCS中Bebug试了下,程序会卡在
“_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt”
这条后的“delay_nms(200);”处
查了一下,“_BIS_SR(LPM0_bits + GIE);“是用来进入低功耗模式的,程序第一次执行到_BIS_SR();SP++,指向“delay_nms(200);”,CPU关闭。而计数器A是可以进中断的,当执行完中断服务程序,退出中断后,又进入低功耗模式,CPU关闭。所以程序无法往下走,一直会卡在“delay_nms(200);”处。
不知道这样理解对不对
回复 5楼gs001588 的帖子
是这么回事好像
我开始那个回帖没仔细看,只看到您注释中写着连续模式
要想退出低功耗模式向下执行程序,得退出低功耗模式,一般是在一个中断中执行退出低功耗模式的设定,例如按键中断中,你按一下按键,播放另外一个音。用定时器中断也行,例如第一个播放了一定时间到了,定时器产生中断退出低功耗模式程序往下执行播放另外一个音
佛粽说的对,已经改好,实验已经成功了,谢谢各位网友的帮助