应该先设置IO口,再初始化CCR0和CCR1。我这有一段程序,供你参考。我自己是用TI公司免费的板子MSP-EXP430G2。
/
说明:P12口输出矩阵波
/
#include<msp430g2553h>
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //停止看门狗
P1DIR |=0x42; //设P12和P13为输出
P1SEL |=0x42; //设P12和P13为模块功能
CCR0=512-1; //装入PWM周期值
CCTL1=OUTMOD_7; //设CCR1输出单元为复位/置位输出模式
CCR1=348; //装入CCR1PWM的占空值
TACTL=TASSEL_1+MC_1; //时钟源选择ACLK定时器A增计数模式
_BIS_SR(LPM3_bits); //进入LPM3低功耗模式
}
1CACTL2 = P2CA4; // CA1/P11 = +comp
这一句已经激活了P11的功能了
2在这个程序中根本就用不到delay这个程序
是别人后加的 就算有 也不是系统编好的 需要自己编写
3那句低功耗的程序没有错 应该是仿真 *** 作问题 我也遇到过 我自己瞎整 有个方法 我也不知道原理 你在中断程序第一句设个切换断点再试试
至于程序的意义 我认为:P11是输入的不是输出的。全置零 进入低功耗 等计时周期 唤醒cpu,把P11输入的电压值和025Vcc比较,进入低功耗,等计时周期 唤醒cpu P11与05Vcc比较 进入低功耗 等计时周期~~~~~~~
个人意见 不能肯定是对的 你参考一下吧~~~~
设置IAR , options-> FET Debugger->Download:
在Flash erase 栏目中,有三个选项,分别是
1 只擦除主存储区
2 擦除主存储区和信息区
3 保留未改变的存储区。
选择第一项
然后只烧写写入Flash程序,单步调试,调出FLASH窗口,可以看到写入后的数据;
如果写入数据不对,请试试在写入之前配置好FNx(分频,257K~476K)或关其它中断
看起来数组应该是音乐数据,其中包括四种数据,就是休止符(每个100毫秒)、歌曲结束符、音阶(给出的是蜂鸣器的震荡周期)、一个音阶持续的时间长度。如果你的晶振是12MHz,按照定时器中断给Count加一来看,音阶持续的时间应该是以10毫秒为单位。 Play_Song函数要求给出参数i我的看法是这个i是指要播放第几段乐曲,i*217表示每段乐曲都是217个字节。本例中95数组只给出217个字节,所以只有一段乐曲,播放时需要给出参数i=0. if ( Temp1 == 0xFF ) &#47;&#47;休止符 { TR0 = 0; Delay_xMs(100); } 所以休止符每个固定是100毫秒。 如果读到第一个不是休止符或者结束符的字节那就是音阶,而下一个字节就是这个音阶的长度或者说节拍 while(1) { FMQ = ~FMQ; Delay_xMs(Temp1); if ( Temp2 == Count ) { Count = 0; break; } } 这一段是说,如果当前音阶的时间(Temp2次定时器中断,由Count计时)还没完,就每隔Temp1毫秒震动一次蜂鸣器,就形成一个震动频率,这段时间就发出一定音调的乐音不过我也有疑惑,震荡周期如果以毫秒为单位恐怕只能发出次声波,所以以上对有关Delay_xMs函数时间的估算都可能有问题907还得看Delay_xMs函数的具体定义才行。
#include <msp430g2553h>
#include "12864h"
float temp;
float voltage;
void main(void)
{
unsigned char s1[] ={"宝鸡文理学院"};
unsigned char s2[] ={"MSP430GLAUNCHPAD"};
unsigned char s3[] ={"测得当前峰峰值:"};
unsigned char s4[] ={"V"};
WDTCTL = WDTPW+WDTHOLD; // 停止看门狗定时器
P2SEL=0x00;//p26和p27管教默认的第一功能是外部晶体振荡器的接口,设置第二功能-通用IO口
P2DIR |= BIT6+BIT7;//设置P26,P27位输出
P1SEL = 0x01;//将IO选择为AD输入
P1DIR = 0;
/将内部DCO校准至1MHz/
BCSCTL1 |= CALBC1_1MHZ;
DCOCTL |= CALDCO_1MHZ;
BCSCTL2 |= SELM_0;//MCLK采用1M的内部DCO
BCSCTL2 |= DIVS_2;//SMCLK采用250K的时钟
init_lcd();
delay_ms(10);
wr_string(1,0,s1);//写参数格式:wr_string(uchar x,uchar y,uchar p);
wr_string(0,1,s2);
wr_string(0,2,s3);
ADC10CTL0 |= SREF_1+REF2_5V+REFON+ADC10IE;//将AD10基准设置为25V 开启AD允许中断
ADC10CTL0 |= ADC10SHT_0+MSC;//打开AD转换,过采样率设置为4个采样周期
ADC10CTL1 |= ADC10SSEL_3+SHS_0;//选择250K的采样时钟,用ADC10SC触发采集
ADC10CTL1 |= CONSEQ_2+INCH_0;//采样模式,通道0
ADC10CTL0 |= ADC10ON;
ADC10AE0 |= 0xFF;
ADC10CTL0 |= ADC10SC+ENC;
_EINT();//允许中断
while(1)
{
float max[10];
float ma=0;
float dave=0;
uint i,j;
delay_ms(50);
ADC10CTL0 |= ENC+ADC10SC;
for(j=0;j<10;j++)
{
for(i=0;i<500;i++)
{
temp = ADC10MEM;
voltage = temp25/10230;//计算采集到的电压
if(ma<=voltage)
{
ma = voltage;//取峰值电压
}
max[j] = ma;
}
dave += max[j]/10;//求平均值
}
wr_float(1,3,dave);
wr_string(5,3,s4);
}
}
//AD中断服务程序
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
__bic_SR_register_on_exit(LPM0_bits);//将SR里的CPUOFF位置0
}
//定时器输出单元
#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL = 0;
__bic_SR_register_on_exit(LPM0_bits);//将SR里的CPUOFF位置0
}
以上就是关于MSP430g2553为什么下面的程序不能产生PWM波全部的内容,包括:MSP430g2553为什么下面的程序不能产生PWM波、新手关于430单片机g2553的问题、需要用msp430g2553 flash掉电保存数据,flash能读能写,就是不能掉电后保存数据,请高手解决!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)