您的位置 首页 芯闻

单片机MSP430学习笔记

通过430一年的学习遇到的很多问题,也收获了很多,以下是学习中遇到的一些问题,和解决方法,还有很多没有整理出来,慢慢整理中。。。。一…

经过430一年的学习遇到的许多问题,也收成了许多,以下是学习中遇到的一些问题,和解决办法,还有许多没有收拾出来,渐渐收拾中。。。。

一、多源中止问题
#pragma vector = PORT2_VECTOR
__interrupt void port2(void)
{
switch(P2IV)
{
case P2IV_P2IFG6:
P2IFG &=~BIT6;
P1OUT ^= BIT0;break; //LED1 亮灭
case P2IV_P2IFG7:
P2IFG &=~BIT7;
P1OUT ^= BIT1;break; //LED2 亮灭
default :break;
}

}

#pragma vector = PORT2_VECTOR
__interrupt void port2(void)
{
if(P1IFG&BIT6){
P2IFG &=~BIT6;
}
if(P1IFG&BIT7){
P2IFG &=~BIT7;
}

}

这两种办法有阐明不同吗?上面一种是经过向量中止号进行判别,下面是用中止标志进行判别,在上面的判别中是否需求用软件把中止标志清0

二、关于flash的块擦除
void Seg_Erase(void){
_DINT();
WDTCTL = WDTPW + WDTHOLD;
char *flase_erase;
flase_erase = (char *)0x8000; //指向要檫写的段地址
while(FCTL3&BUSY);
FCTL3 = FWKEY; //铲除LOCK
FCTL1 = FWKEY +ERASE; //段檫除
*flase_erase = 0; //空写将0写为1
FCTL3 = FWKEY + LOCK; //LOCK置1
_EINT();
}
请问在进行FLASH段擦除的时分,调用这个函数是只擦除一个字节?要进行整段擦除的时分是用for语句调这个函数128次。
仍是调用一次这个函数把128个字节一同擦除。

三、_root问题
当编译器碰到该条指令的时分就把它进行编译。

四、关于MSP430的中止嵌套,和优先级问题?

五、msp430没有自带的EEPROM,可是information ABCD四个块相当于EEPROM在5系列中他们的地址别离是
A:001800H~00187fH
B:001880H~0018FFH
C: 001900H~00197FH
D: 001980H~0019FFH

六、硬件乘法器
MPY = 125;
OP2 = 125;
result = RESHI;
result = (result<<16)|RESLO;

result=125*125;

这两个编译的功率哪个愈加高一点,result=125*125编译器会不会直接把它编译成
MPY = 125;
OP2 = 125;
result = RESHI;
result = (result<<16)|RESLO;
运用硬件乘法器去算这个值。

七、关于内存的问题
我在用MSP5438片子求1024点FFT的时分,界说
float dataR[1024]={0};
float dataI[1024]={0};在RAN区

界说正余弦表在flash程序存储器
const float sin_tab[1024]={…..};
const float cos_tab[1024]={…..};
做软仿的时分可以核算,用JTAG往片子里下的时分就不可,调查RAM区时分发现,是界说的const float sin_tab[1024]
const float cos_tab[1024]本应该在flash区的数据,怎么会出现在RAM区里?导致不能进行仿真。
编译今后这儿看所耗费的资源应该是可以的接受的。
892 bytes of CODE memory
8194 bytes of CONST memory
8194 bytes of DATA memory
我是第一次用430的片子,有些问题不太理解,望各位大虾不吝赐教。谢了。

int __low_level_init(void)
{
float dataR[1024]={0};
float dataI[1024]={0};
const float sin_tab[1024]={…..};
const float cos_tab[1024]={…..};
return (1);
}
然后在
__low_level_init();
void main(void)
…..
这样用吗? 讨教!
解决办法:
//避免在编译的时分狗复位
__low_level_init(){
WDTCTL = WDTPW + WDTHOLD;
}
八、CCP捕获问题

void Init_Ta0(void){
P11DIR |= BIT0 + BIT1 + BIT2; // ACLK ,MCLK ,sMCLK 输出方向
P11SEL |= BIT0 + BIT1 + BIT2;
P1DIR |= BIT0;
P2DIR &= ~BIT1;
P2SEL |= BIT1; //装备输入脚的第二功用ccr0捕获
TA0CCTL0 &=~(CCIS0+CCIS1); //CCIXA捕获
TA0CCTL0 |= CM_3 + SCS + CAP; //在上升沿和下降沿都进行捕获 ,同步信号捕获,捕获形式

TA0CTL = TASSEL_2; //SMCLK,
//TA0CTL |= ID_3; //输入信号分频
TA0CTL |= MC_2; //定时器开端计数(接连计数模式0~0xFFFF)
TA0CTL |= TACLR; //计数器铲除
TA0CCTL0 |= CCIE;
_EINT();
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0(void){
if(TA0CCTL0 & CM1) //捕获到下降沿
{
TA0CTL |= TACLR; //清定时器
TA0CCTL0=(TA0CCTL0&(~CM1))| CM0; //改为上升沿捕获:CM1置零,CM0置一

}
else if(TA0CCTL0 & CM_0) //捕获到上升沿
{
width = TA0CCR0; //记录下完毕时刻
TA0CCTL0=(TA0CCTL0&(~CM0))| CM1; //改为下降沿捕获:CM0置零,CM1置一
}

}

void main(void){
WDTCTL = WDTPW + WDTHOLD; //关看门狗
P7SEL |= 0x03; // XT1 开端振动
UCSCTL1 |= DCORSEL_2; // 挑选DCO频率规模
UCSCTL3 |= SELREF__REFOCLK; // 挑选 Fll 参阅频率 REFO
UCSCTL4 = SELM__DCOCLK + SELA__XT1CLK + SELS__DCOCLKDIV; // 装备 MCLK = DCOC,SMCLK =DCODIV,ACLK=XT1
while (SFRIFG1 & OFIFG) //铲除 OFIFG,and XT1OFFG ,DCOFFG
{
UCSCTL7 &= ~(XT1LFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG;
}
while(1){
P1OUT ^= BIT0; //LED 闪耀,阐明没有晶体失效
for(unsigned int i=60000;i>0;i–); // 推迟
}
}

我用MSP5438的P2.1口做捕获实验,我觉得程序没问题,输入8HZ的方波,可是程序便是不进中止,很古怪,请我们帮我看看是上面问题?
答案:设置过错。

九、关于中止
因为项目需求第一次运用MSP430单片机,经过半个月的学习,在各位朋友的协助下小有心得,今日来谈谈中止,期望能和我们评论,有说错的也请我们指证。
MSP430的中止和51,PIC16系列的比较
MSP430:
当一起有多个中止来的时分才有优先级的考虑(优先级次序可查看向量表)在头文件中现已界说
有中止呼应今后主动封闭总中止,这个时分即便来更高优先级的中止都不会呼应
要中止嵌套的话,就有必要在中止中翻开总中止
msp430的指令中,DINT和EINT别离指关和开一切中止。

完成中止嵌套需求留意以下几点:
1、430默许的是封闭中止嵌套的,除非你在一个中止程序中再次开总中止EINT,当然各个恳求答应标志位要置起来;
2、当进入中止程序时,只需不在中止中再次开中止,则总中止是封闭的,此刻来中止不论是比当时中止的优先级高仍是低都不履行;
3、若在中止A中开了总中止,则可以呼应后来的中止B(不论B的优先级比A高仍是低),B履行完再持续履行A。留意:进入中止B后总中止相同也会封闭,
假如B中止程序履行时需呼应中止C,则此刻也要开总中止,若不需呼应中止,则不必开中止,B履行完后跳出中止程序进入A程序时,总中止会主动翻开;
4、若在中止中开了总中止,后来的中止一起有多个,则会按优先级来履行,即中止优先级只需在多个中止一起到来时才起做用!中止服务不履行抢先准则。
5、关于单源中止,只需呼应中止,体系硬件主动清中止标志位,关于TA/TB定时器的比较/捕获中止,只需拜访TAIV/TBIV,标志位被主动铲除;
关于多源中止要手动清标志位,比方P1/P2口中止,要手艺铲除相应的标志,假如在这种中止用”EINT();”开中止,而在翻开中止前没有清标志,就会有相同的中
断不断嵌入,而导致仓库溢出引起复位,所以在这类中止中有必要先清标志再翻开中止开关.
可是关于多源中止用向量办法这一点我不太理解,在例程里有这么一个比如
例1:#pragma vector = PORT2_VECTOR
__interrupt void port2(void)
{
switch(P2IV)
{
case P2IV_P2IFG6:
P1OUT ^= BIT0;break; //LED1 亮灭
case P2IV_P2IFG7:
P1OUT ^= BIT1;break; //LED2 亮灭
default :break;
}

}
例2:#pragma vector = PORT2_VECTOR
__interrupt void port2(void)
{
if(P1IFG&BIT6){
P2IFG &=~BIT6;
}
if(P1IFG&BIT7){
P2IFG &=~BIT7;
}

}
当运用向量办法的时分在例1中没有用软件铲除中止标志,莫非是运用向量办法硬件把它铲除了?在这个里边开总中止会影响程序仓库溢出吗?这个我没有验证过。
而在例2中清楚了,可以知道可以在里边翻开中段嵌套。

PIC
PIC的中低档单片机的中止进口地址只需一个,0004H,在有多个中止源来的时分,从0004H这个进口地址进入,然后软件判别优先级,PIC16的各个可屏蔽
中止的有先级是相同的,在中止中只需经过软件来判别有先级,进入中止的时分跟430相同把中止封闭(这一步是硬件来封闭的),当这个时分有其他中止

源来的时分,把标志置1,等完毕完当时服务程序今后,在呼应新的中止恳求。
51:
51于430相同支撑中止嵌套,可以经过专门的寄存器设置中止的优先级,只需仓库不溢出可以一向嵌套。和430的区别是430在中止优先级上,430可以被低优先等级
的中止嵌套,而51不能被比自己低的优先等级的中止所嵌套。51有必要软件把标志位铲除。

此贴只表明个人观点,我提出的问题也期望可以得到回答,在此仍是期望多得到各位大虾的点拨。

十,bootload问题解决
在程序中完成地址跳转运用函数指针,运用嵌套汇编的跳转的办法会出现问题
typedef void (*pfunction)(void);
pfunction pMyreset=(pfunction) 0x453d2;
pMyreset();

十一、fft的疑问
讨教圈圈,我在用软件模仿fft改换的时分这样做,可是分析出来的数据放到Re中,成果是Re[0]=1299,Re[1]=0,
在Re[8]=199,基波重量怎么会跑到Re[8],硬件做出来的成果也往数组的高位跑。不是很懂,为什么单周期是号的
换到多周期的时分会位子会发生变化。在做硬件的时分接连8周期的采样应该是没有问题的,下面的中心代码用的
是圈圈写的,我自己写的那段做出的成果也是这样,昨日还以为是我的程序出错了。
for(uint16 j=0;j<1024;j++){
dataR[j]=200*cos(6.28/128*j)+1300;
}
FftInput(dataR); //位倒序
FftExe(dataR,Re,Im); //做FFT运算
Re[0]=(LEN_TYPE )Re[0]/1024;
for (i=1;i<1024;i++){
Re[i]=(LEN_TYPE )(sqrt((Re[i]>>9)*(Re[i]>>9)+(Im[i]>>9)*(Im[i]>>9)));

//////////////////////////////////版权一切,如需转载注明出处 鱼香茄子///////////////////////////////////////////
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/273093.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部