📄 main.cpp
字号:
#include <msp430x14x.h>
void Init_ADC(void);
void Init_TimerB(void);
void Init_UTR(void);
void Init_CLK(void);
int ADC12buf = 0;
int sign = 0; /* Current adpcm sign bit */
unsigned int delta = 0; /* Current adpcm output value */
int diff = 0; /* Difference between val and valprev */
int step = 0; /* Stepsize */
long valpred = 0 ; /* Predicted output value */
long vpdiff = 0; /* Current change to valpred */
int index = 0; /* Current step change index */
unsigned int outputbuffer = 0; /* place to keep previous 4-bit value */
int bufferstep = 1; /* toggle between outputbuffer/output */
// int j = 0;
// static short test[10] = {0,0,1,2,4,6,9,12,16,20};
static short test = 0;
static int myi = -1;
static int ll = 0;
static int indexTable[16] = {
-1, -1, -1, -1, 2, 4, 6, 8,
-1, -1, -1, -1, 2, 4, 6, 8,
};
static char wavarray[906]={
0x80,0x85,0x96,0xA8,0xB6,0xB7,0xA8,0x8D,0x7E,0x7B,0x88,0x9C,0xA0,0x90,0x6C,0x54,
0x4D,0x56,0x62,0x5C,0x4C,0x2E,0x1D,0x24,0x3B,0x4F,0x4E,0x4B,0x45,0x4B,0x61,0x8C,
0xC0,0xE0,0xEA,0xDA,0xC9,0xC4,0xD3,0xF2,0xFF,0xF3,0xC8,0x93,0x77,0x73,0x88,0x8F,
0x7B,0x56,0x28,0x18,0x20,0x38,0x45,0x3C,0x2E,0x1E,0x29,0x47,0x7B,0xB0,0xCC,0xCD,
0xB3,0xA5,0xAA,0xC4,0xEB,0xF4,0xDC,0xA2,0x70,0x5D,0x64,0x7D,0x7F,0x6A,0x3F,0x20,
0x22,0x3A,0x55,0x57,0x4F,0x3B,0x2F,0x3F,0x64,0x9E,0xC8,0xDC,0xCF,0xB5,0xB2,0xC0,
0xE4,0xFF,0xFA,0xCE,0x8E,0x66,0x5D,0x78,0x8B,0x81,0x5F,0x2E,0x1A,0x24,0x45,0x5C,
0x5A,0x4B,0x32,0x2D,0x3E,0x68,0x9B,0xB6,0xB8,0x9E,0x8C,0x8F,0xAD,0xDB,0xF0,0xE0,
0xAD,0x7B,0x63,0x6B,0x8B,0x95,0x83,0x5B,0x38,0x36,0x4C,0x6D,0x77,0x6F,0x57,0x42,
0x46,0x5E,0x8B,0xB0,0xC0,0xB2,0x97,0x8D,0x95,0xB6,0xD5,0xD8,0xB9,0x85,0x62,0x5A,
0x72,0x8B,0x8B,0x73,0x49,0x35,0x3E,0x59,0x72,0x75,0x67,0x4C,0x3F,0x4A,0x6D,0x9A,
0xB4,0xB2,0x9B,0x94,0xA6,0xC9,0xD9,0xC8,0xAD,0x98,0x89,0x78,0x60,0x52,0x57,0x65,
0x61,0x47,0x32,0x32,0x4E,0x79,0x9A,0x9F,0x91,0x89,0x95,0xB6,0xD1,0xC6,0x99,0x73,
0x67,0x69,0x63,0x4D,0x37,0x3D,0x51,0x54,0x4A,0x49,0x57,0x79,0xA1,0xB9,0xB9,0xAF,
0xB3,0xCE,0xF4,0xFF,0xDC,0xA9,0x8D,0x8C,0x8C,0x71,0x44,0x24,0x28,0x39,0x39,0x2E,
0x27,0x31,0x52,0x7B,0x91,0x8F,0x8A,0x99,0xC0,0xE9,0xEA,0xC3,0x9F,0x9B,0xA6,0xA1,
0x7D,0x50,0x41,0x54,0x64,0x5A,0x47,0x38,0x40,0x62,0x86,0x90,0x85,0x7C,0x92,0xC2,
0xE6,0xD9,0xAC,0x92,0x9A,0xAA,0x9D,0x72,0x4A,0x48,0x5F,0x6B,0x5F,0x4C,0x41,0x4F,
0x72,0x8E,0x8E,0x7D,0x78,0x8E,0xBA,0xCD,0xB1,0x86,0x79,0x89,0x92,0x7C,0x52,0x39,
0x4A,0x69,0x75,0x6B,0x5A,0x55,0x6E,0x98,0xAF,0xA9,0x98,0x96,0xAE,0xD1,0xD3,0xAF,
0x8C,0x87,0x8F,0x8A,0x69,0x42,0x35,0x4A,0x60,0x5F,0x51,0x41,0x48,0x6A,0x90,0x9D,
0x93,0x88,0x90,0xB1,0xCF,0xC8,0xA8,0x92,0x92,0x95,0x87,0x6B,0x52,0x52,0x64,0x6B,
0x61,0x51,0x4A,0x5B,0x7D,0x8F,0x8E,0x9E,0xB6,0xB5,0xB6,0xC9,0xC1,0x94,0x75,0x6D,
0x58,0x42,0x4A,0x5E,0x69,0x7D,0xA2,0xBF,0xBE,0xAF,0xA8,0x92,0x62,0x3C,0x26,0x0A,
0x00,0x21,0x4E,0x67,0x81,0xB0,0xDB,0xE5,0xDE,0xD9,0xC1,0x92,0x71,0x62,0x49,0x37,
0x45,0x65,0x7D,0x8E,0xAE,0xD0,0xD6,0xCD,0xCC,0xB8,0x8A,0x68,0x53,0x34,0x20,0x31,
0x50,0x64,0x73,0x96,0xBE,0xC9,0xBE,0xB7,0x9D,0x6D,0x4A,0x37,0x1F,0x10,0x25,0x50,
0x73,0x90,0xBA,0xE1,0xE8,0xDE,0xD6,0xBB,0x88,0x61,0x4A,0x31,0x28,0x3E,0x63,0x81,
0x98,0xB9,0xDB,0xDE,0xCF,0xBD,0x9D,0x71,0x4F,0x3B,0x21,0x18,0x31,0x58,0x79,0x94,
0xB5,0xD2,0xD8,0xCF,0xC3,0xA1,0x70,0x49,0x32,0x1E,0x1B,0x31,0x52,0x71,0x8F,0xB5,
0xD5,0xD8,0xCD,0xC2,0xA5,0x7B,0x5B,0x44,0x30,0x30,0x49,0x6A,0x86,0x9D,0xBB,0xD6,
0xDB,0xCE,0xBB,0x97,0x6F,0x54,0x41,0x2B,0x27,0x3A,0x57,0x73,0x8D,0xAA,0xC2,0xC7,
0xC2,0xB7,0x9B,0x77,0x60,0x4E,0x3B,0x37,0x46,0x5D,0x74,0x8D,0xA9,0xBD,0xBF,0xB8,
0xB0,0x97,0x77,0x62,0x52,0x43,0x43,0x56,0x70,0x89,0xA0,0xB8,0xC9,0xC7,0xB9,0x9D,
0x7E,0x77,0x7A,0x67,0x58,0x5C,0x50,0x3E,0x47,0x59,0x6A,0x7B,0x88,0x92,0x98,0x9B,
0x9F,0x9F,0x9A,0x99,0x97,0x8F,0x8D,0x90,0x93,0x96,0x95,0x94,0x93,0x89,0x78,0x6C,
0x61,0x55,0x52,0x57,0x5C,0x65,0x71,0x7B,0x80,0x7A,0x72,0x6D,0x67,0x61,0x62,0x68,
0x6E,0x76,0x81,0x8B,0x94,0x9D,0xA7,0xAE,0xAE,0xAB,0xA9,0xA3,0x9C,0x98,0x96,0x8F,
0x85,0x80,0x7D,0x7C,0x7F,0x82,0x85,0x84,0x80,0x7E,0x79,0x71,0x6C,0x69,0x64,0x61,
0x63,0x67,0x6B,0x71,0x78,0x80,0x84,0x83,0x82,0x83,0x82,0x80,0x7C,0x77,0x77,0x79,
0x7E,0x81,0x83,0x87,0x8F,0x95,0x98,0x9A,0x9B,0x9C,0x9D,0x9A,0x95,0x8E,0x86,0x80,
0x7D,0x7B,0x76,0x73,0x71,0x71,0x75,0x79,0x7B,0x7B,0x7A,0x78,0x75,0x73,0x6F,0x6F,
0x71,0x73,0x77,0x7B,0x7E,0x83,0x88,0x8D,0x8E,0x8A,0x86,0x84,0x85,0x85,0x86,0x85,
0x83,0x83,0x87,0x8A,0x8C,0x8D,0x8E,0x8F,0x8E,0x8B,0x87,0x82,0x7C,0x79,0x77,0x72,
0x6E,0x6F,0x74,0x7B,0x80,0x82,0x84,0x85,0x85,0x86,0x85,0x80,0x7A,0x78,0x78,0x79,
0x7C,0x7F,0x82,0x83,0x84,0x87,0x88,0x84,0x82,0x80,0x80,0x7D,0x7B,0x7A,0x79,0x7D,
0x83,0x88,0x8B,0x8E,0x92,0x96,0x94,0x8F,0x8A,0x82,0x7B,0x75,0x71,0x6D,0x69,0x6A,
0x70,0x76,0x7B,0x81,0x86,0x87,0x87,0x88,0x86,0x81,0x7C,0x7A,0x78,0x75,0x75,0x7A,
0x7F,0x82,0x87,0x8B,0x8B,0x88,0x87,0x85,0x80,0x7B,0x78,0x75,0x74,0x79,0x81,0x86,
0x89,0x8E,0x95,0x95,0x91,0x8E,0x89,0x80,0x78,0x73,0x6E,0x69,0x69,0x6E,0x73,0x78,
0x7F,0x86,0x89,0x8A,0x8D,0x8D,0x89,0x82,0x7E,0x7A,0x77,0x78,0x7D,0x7F,0x7F,0x83,
0x87,0x89,0x88,0x88,0x86,0x80,0x7A,0x78,0x76,0x75,0x78,0x7E,0x83,0x85,0x8A,0x91,
0x94,0x95,0x95,0x90,0x86,0x7D,0x78,0x74,0x6E,0x6B,0x6D,0x6E,0x71,0x78,0x81,0x86,
0x89,0x8C,0x8B,0x86,0x81,0x80,0x7E,0x7B,0x7A,0x7C,0x7C,0x7C,0x80,0x86,0x89,0x89,
0x89,0x87,0x84,0x81,0x81,0x80,0x7D,0x7C,0x7E,0x7F,0x80,0x84,0x89,0x8B,0x8B,0x8A,
0x89,0x85,0x80,0x7D,0x7A,0x76,0x74,0x75,0x77,0x79,0x7F,0x85,0x8A,0x8B,0x8D,0x8D,
0x8A,0x85,0x81,0x7E,0x79,0x76,0x76,0x77,0x76,0x75
};
static int stepsizeTable[89] = {
7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
};
int main()
{
// 关闭看门狗
WDTCTL = WDTPW + WDTHOLD;
// 关闭中断
_DINT();
Init_ADC();
Init_TimerB();
Init_CLK();
Init_UTR();
// 打开中断
_EINT();
//中断处理完成后就关闭CPU,进入低功耗状态
for(;;)
{
// Enter LPM0 w/ interrupt
_BIS_SR(CPUOFF + GIE);
}
}
//选择MCLK,SMCLK的时钟源为XT2
void Init_CLK(void)
{
unsigned int i;
//启动XT2震荡器
BCSCTL1 &= ~XT2OFF;
// 清除OSCFault标志
do
{
IFG1 &= ~OFIFG;
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG);
//MCLK 的时钟源为XT2,分频因子为1 , DIVM0
//SMCLK的时钟源为XT2,分频因子为1, DIVS0
//XT2的频率范围是450KHz到8MHz,
//XT2的频率是7.3728MHz,所以SMLK也是7.3728MHz
BCSCTL2 = SELM_2 + SELS ;
}
//TimerB 是ADC的采样时钟
void Init_TimerB(void)
{
// 选择SMCLK,清除TAR
//modified,可能没有分频,等于SMCLK
TBCTL = TBSSEL_2 + TBCLR;
//TB输出频率为:8192HZ=7.3728MHz/900
// TBCCR0 = 900;
//TBCCR1 = 450;
TBCCR0 = 450;
TBCCR1 = 225;
//CCR1 Compare mode
//TBCL0-TBCL1等于方波的1宽,TBCL1等于0宽,周期还是TBCL0
TBCCTL1 = OUTMOD_3 ;
// 增记数模式
//TBCTL |= MC0;
TBCTL |= MC1;//MODIFIED
}
void Init_ADC(void)
{
//P6.0 ADC option select
P6SEL = 0x08;
//设置ENC为0,从而修改ADC12寄存器的值
ADC12CTL0 &= ~(ENC);
//单通道通道重复模式
//转换内核时钟SMCLK
//转换时钟8分频:7.3728MHz/8=921.6KHz,近1M,
//而转换频率是:921.6KHz/13=70.892kHz
//采样输入时钟信号 :SHS_3是TimerB_1
ADC12CTL1 = CONSEQ_2 + ADC12SSEL_3 + ADC12DIV_7 + SHS_3 + SHP;
//转换的起始地址为:ADCMEM0
//ADC12CTL1 |= CSTARTADD_0;
ADC12CTL1 |= CSTARTADD_3;
// Enable ADCIFG15 interrupt
//转换完成中断使能
ADC12IE = 0x0001;
//设置参考电压分别为AVSS和AVCC,输入通道为A3
ADC12MCTL0 = INCH_3 + EOS + SREF_1;
//采样周期=SAMPCON, SHT00
//ADC12CTL0 |= ADC12ON + SHT00 + SHT01 + SHT02 + REFON;
//MODIFIED
//SHT00表示ADCMEM0采样周期是采样时钟周期的4倍
//那采样频率为:(TimerB时钟)8192HZ/4=2048HZ
//可以看出转换频率是采样频率的35倍,所以时间可以忽略不计
ADC12CTL0 |= ADC12ON + SHT00 + REFON;
//ADC12CTL0 |= MSC;//to modify
//使能ADC转换
ADC12CTL0 |= ENC;
return;
}
// 定时器中断,完成 ADC 转换
#pragma vector=ADC_VECTOR
__interrupt void ADC12_ISR (void)
{
// ADC12buf = ADC12MEM0;
ADC12buf = ADC12MEM3;
test = ADC12buf;
/*myi=myi+1;
// if(myi>10) {myi=1; }
// test = (myi*myi);
if(myi>905) {myi=0;}
test = wavarray[myi];
//test = test*8;
//test = 0x12;
// while (!(IFG2 & UTXIFG1)); // USART0 TX buffer ready?
// TXBUF1 = test & 0xff;*/
test = test*8;
step = stepsizeTable[index];
diff = test - valpred;
sign = (diff < 0) ? 8 : 0;
if ( sign ) diff = (-diff);
// Step 2 - Divide and clamp
delta = 0;
vpdiff = (step >> 3);
if ( diff >= step )
{
delta = 4;
diff -= step;
vpdiff += step;
}
step >>= 1;
if ( diff >= step )
{
delta |= 2;
diff -= step;
vpdiff += step;
}
step >>= 1;
if ( diff >= step )
{
delta |= 1;
vpdiff += step;
}
// Step 3 - Update previous value
if ( sign )
valpred -= vpdiff;
else
valpred += vpdiff;
// Step 4 - Clamp previous value to 16 bits
if ( valpred > 32767 )
valpred = 32767;
else if ( valpred < -32768 )
valpred = -32768;
// Step 5 - Assemble value, update index and step values
delta |= sign;
index += indexTable[delta];
if ( index < 0 ) index = 0;
if ( index > 88 ) index = 88;
step = stepsizeTable[index];
if ( bufferstep ) {
//TXBUF1=0;
outputbuffer = (delta << 4) & 0xf0;
} else {
outputbuffer |= (delta & 0x0f) ;
//缓冲区为空时写入下一个值
while (!(IFG2 & UTXIFG1)); // USART0 TX buffer ready?
TXBUF1 = outputbuffer & 0xff;
}
bufferstep = !bufferstep;
// Clear CPUOFF bit from 0(SR)
_BIC_SR_IRQ(CPUOFF);
}
void Init_UTR(void)//设串口一控制寄存
{
//串口baud rate:?
//当采样,转换,压缩完成后,往串口发送缓冲区中发送一个值;当缓冲区满时,产生一个中断,发送
//数据发完,中断标志清0
//必须保证采样的速度小于发送的速度,不然当标志没有清0的时候,中断中写了while语句,会等待
//允许软件复位
UCTL1 |= SWRST;
P3SEL |= 0xC0;
//串口发送和接收使能
ME2 |= UTXE1 + URXE1;
//停止位1位
UCTL1 &= ~SPB;
//奇偶校验位无
UCTL1 &= ~PENA;
//数据位长度:8位
UCTL1 |= CHAR;
//串口发送时钟源选择:ACLK=32,768 Hz
// UTCTL1 |= SSEL1 ;
//MODIFIED
//串口发送时钟源选择:SMCLK=7.3728MHz, 则N=7.3728MHz/115200=64
UTCTL1 |= 0x30 ;
//波特率=115200,N=7.3728MHz/115200=64
UBR01 = 0x40;
//UBR01 = 0xC0;//38400
UBR11 = 0x00;
UMCTL1 = 0x00;
//不允许软件复位
UCTL1 &= ~SWRST;
//接收中断使能
IE2 |= URXIE1;
TXBUF1 = 0;//modified by daniel
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -