专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
提问-菜鸟学MSP430的疑问[持续更新]
2019-03-24 11:52
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
14578
2
1509
本帖最后由 西芷何稻 于 2014-2-22 15:52 编辑
浅浅学过51,现在因为要做东西,学习MSP430,一边学一遍提高51. 我还是把所有疑问都写在一个帖子上来,菜鸟好多疑问。
【2014.2.21】【已解决】 学完了向导和实验手册的定时和中断部分,对定时器有了一个初步的认识。现在我找来TI的官方例程,继续学习定时器。现在遇到疑问。不理解下面的swith函数,2,4,10如何确定?自己找了资料,在仔细的看了看user guide, 明白了
中断优先级 中断源 缩写 TAIV的内容
最高 捕获/比较器1 CCIFG1 2
捕获/比较器2 CCIFG2 4
……
捕获/比较器x CCIFGx
最低 定时器溢出 TAIFG1 10
没有中断将挂起
#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
/*对于每一个定时器来说,它有两个中断,TIMERA0_VECTOR 和TIMERA1_VECTOR 。
* 这两个中断何时被触发呢?在MSP430中,TIMERA0_VECTOR在TACCR0寄存器溢出时被触发;
* 而TIMERA1_VECTOR 在三个时候都可以被触发(TACCR1 CCIFG、TACCR2 CCIFG,TAIFG
* 只要这三个寄存器中的任何一个被置位了,TIMERA1_VECTOR 中断就会被触发)。
*/
// Timer_A3 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
switch( TA0IV )
{
case 2: break; // CCR1 not used
case 4: break; // CCR2 not used
case 10: P1OUT ^= 0x01; // overflow
break;
}
}
复制代码
2014.2.21 【中断怎么才结束】【已解决】:原因:自己另外用51模仿了差不多的程序,发现自己想多了。程序是一直跑的。麻烦解决一下我的疑问。tks
下面是学习向导和实验手册的Lab5程序,我的理解是,BIT0(红灯)一开始就闪烁,然后Timer0的 计数器加到12000,就调用中断,红灯停止闪烁,(BIT6)绿灯闪烁。
但是板子上的情况是红灯闪烁两下,然后绿灯闪烁,然后红灯闪两下,然后绿灯闪烁,但是每次绿灯闪烁的次数不同。我不明白为什么会这样。 或者说我不是很明白 这个程序的中断怎么跑。 另外“Since the ACLK (VLO) is running at 12 kHz, the value needs to be 12000 cycles.”我不是很明白。
ps:CCS的字体怎么调整?
//***********************************************************
// Lab5_Start.c Temperature sampling example using ADC10
// Clocking: MCLK and SMCLK = 1.1MHz DCO/8
// ACLK = 12kHz VLO
//
// SFB 1/2012
//***********************************************************
#include <msp430g2553.h>
#ifndef TIMER0_A1_VECTOR
#define TIMER0_A1_VECTOR TIMERA1_VECTOR
#define TIMER0_A0_VECTOR TIMERA0_VECTOR
#endif
volatile long tempRaw;
volatile unsigned int i;
void FaultRoutine(void);
void ConfigWDT(void);
void ConfigClocks(void);
void ConfigLEDs(void);
void ConfigADC10(void);
void ConfigTimerA2(void);
void main(void){
ConfigWDT();
ConfigClocks();
ConfigLEDs();
ConfigADC10();
ConfigTimerA2();
_BIS_SR(GIE);//开启总中断
while(1){
P1OUT |= BIT0;
for(i = 100; i>0; i--);
P1OUT &= ~BIT0;
for(i= 500; i>0; i--);
}
}
void ConfigWDT(void){
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
}
void ConfigClocks(void){
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
FaultRoutine(); // If calibration data is erased
// run FaultRoutine()
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO
IFG1 &= ~OFIFG; // Clear OSCFault flag
BCSCTL2 |= SELM_0 + DIVM_3 + DIVS_3; // MCLK = DCO/8, SMCLK = DCO/8
}
void FaultRoutine(void){
P1OUT = BIT0; // P1.0 on (red LED)
while(1); // TRAP
}
void ConfigLEDs(void){
P1DIR = BIT6 + BIT0; // P1.6 and P1.0 outputs
P1OUT = 0; // LEDs off
}
void ConfigADC10(void){
ADC10CTL1 = INCH_10 + ADC10DIV_0; // Temp Sensor ADC10CLK
}
void ConfigTimerA2(void){
CCTL0 = CCIE;//使 计时器counter/比较器寄存器compare register 在CCTL0 capture/compare 控制寄存器 中 中断
CCR0 = 12000;//计时器数值达到CCR0,中断就会生成
TACTL = TASSEL_1 + MC_2;
//TACTL is the Timer_A control register
//TASSEL_1 selects the ACLK(辅助时钟)
//MC_2 sets the operation for continuous mode
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void){
/*
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON;
_delay_cycles(5); // Wait for ADC Ref to settle
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
P1OUT |=BIT6; // P1.6 on (green LED)
_delay_cycles(100);
ADC10CTL0 &= ~ENC; // Disable ADC conversion
ADC10CTL0 &= ~(REFON + ADC10ON); // Ref and ADC10 off
tempRaw = ADC10MEM; // Read conversion value
P1OUT &= ~BIT6; // green LED off
*/
P1OUT |= BIT6;
for(i = 5000; i>0; i--);
P1OUT &= ~BIT6;
for(i= 5000; i>0; i--);
CCR0 += 12000;//CCR0在中断结束后会自动清零,这里在给CCR0赋值,以便之后的中断使用
}
复制代码
此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
qinkaiabc
2019-03-24 18:16
精彩回答 2 元偷偷看……
0人看过
加载中...
查看其它2个回答
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
一周热门 更多>