This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F5529: msp430f5529

Part Number: MSP430F5529

您好,我在使用5529的定时器timer_a时,设置了TA0CCR0为9,我想设置一个变量n,每次计数器计数到9了,n就加一,请问我该怎么设置呢

  • 您好我们已收到您的问题并升级到英文论坛,如有答复将尽快回复您。谢谢!

  • 您好,您可以参考以下代码:

    https://dev.ti.com/tirex/explore/node?node=AFDh5q2fLOVBjhPwpSfOTw__IOGqZri__LATEST

    并需要进行以下修改:

    1. 将 TA0CCR0改为=9

    2. 删除该行 "P1OUT ^= 0x01",然后把您的变量n放在这里。当 TIMER0_A0_ 中断时,n 会添加 1。

  • 您好,这里的n好像无法作用在主程序中

  • 您好,工程师在函数中定义 n : _interrupt void Timer_B (void) ,当 n 增加到 9 ,P1.0=1 时,程序如下运行:

    您可以更改 while (1) 并在此处添加定时器输出,您可以先试下,不知道是否符合您的要求。

  • 您好,您可以看一下我上一个问题中的描述,我是使用了timer_a来计数并输出,请问是这里使用了timer_b还要使用timer_a吗,还有就是 _interrupt void Timer_B (void)这个中断函数是定义在哪里的?

  • 您好,,我想设计的就是一个把flash中存储的数据赋给数组,然后每次定时器中断输出一个数组值的程序。但是由于数据过大,ccs中我定义的数组好像一次性存放不下,所以我希望在定时器累计中断次数n,当n=9时,主程序可以通过监听这个n值,来关闭定时器,重写数组然后再打开定时器输出,我使用了volatile 定义,现在发现内存中n的值已经可以发生了累加,但是由于主函数不会循环保持对n值的监听,所以即使n值在子函数中变化了,主函数无法重置输出数组

  • 您好,以上给到您的代码只是个例子,您可以使用TimerA,您不需要TimerB。

    以及这两个是可以同时使用的。

    the _interrupt void Timer_B (void) 是定义在 msp430f5529.h file中的。

    您可以从以下代码中查看声明:#pragma vector = TIMER0_A0_VECTOR, 转到 msp430f5529.h。

  • 您好,可以麻烦看下上面那个最新的提问吗?

    我想设计的就是一个把flash中存储的数据赋给数组,然后每次定时器中断输出一个数组值的程序。但是由于数据过大,ccs中我定义的数组好像一次性存放不下,所以我希望在定时器累计中断次数n,当n=9时,主程序可以通过监听这个n值,来关闭定时器,重写数组然后再打开定时器输出,我使用了volatile 定义,现在发现内存中n的值已经可以发生了累加,但是由于主函数不会循环保持对n值的监听,所以即使n值在子函数中变化了,主函数无法重置输出数组

  • 或者ccs中有什么办法可以扩大数组的容量吗,我现在定义的数组unsigned short a[3000],只能最多放进3000个数据,再大就会报错。

  • 您好,可以麻烦看下上面那个最新的提问吗?

    您好新的提问都帮您跟进了,有答复会尽快给到您。

  • 1. 您好,请您检查下您定义 n 的位置, 需要将其定义为全局变量 (在主函数之外)。

    2. 在主函数中,您需要打开以下中断:_bis_SR_register();  在此处添加您的功能(关闭定时器),最后打开 LPM0,如下所示:

  • 您好,我按照上面这个尝试了一下,我在n=9时将数组m的值进行了替换,但是好像上面的程序并未生效,检测到计数器仍然持续在工作,数组m也未被替换;我的主函数和中断程序如下
  • 您好,我这边显示您的回复不太清楚,能麻烦您再重新上传下图片吗?

  • 您好,已经重新上传

  • 您好,

    > TA0CTL |=MC__STOP;

    不会使定时器停止,您试下以下语句:

    > TA0CTL &= ~MC_3;   // MC=0 to stop timer

  • 您好,我试了好像还是不可以。能麻烦工程师修改一下这里完整示例吗,我的程序如下,定义了两个四位的一维数组m和M,每次中断触发先输出m数组中的m0到m3,当中四个值输出完成,希望可以停止中断,将M数组中的值赋给m,然后再继续输出新的m0到m3

  • 帮您跟进给工程师了哈,预计下周工作日内会给到您答复。

  • 我在n=9时将数组m的值进行了替换

    那么数据 m[i] 是否可以替换? 您可以像上一条回复中那样添加 TA0CTL &= ~MC_0 ,以查看定时器是否可以停止。 

    在 ISR 中,定时器中断被禁用,因此应该是可以在 "if (k==4) " 块中将 M[] (立即) 复制到 m[] (立即)。9 是一个很小的数字,需要放入 TA0CCR0 (使用 SMCLK 计时)。 ISR 无法在这段时间内完成,因此将持续运行,并且永远不会返回 main()。

    此外,位之间的时间间隔将不会保持。 请问数字 9 源自何处? 您这边从最初的问题来看,似乎是希望将闪存块复制到 RAM 块,以便可以输出它。 请问您这边为什么不能直接从闪存发送?

  • 当我直接从flash中发送时,令d=*p,然后输出d,会导致每一位数据的时间长度与原先设定的长度有误差,比如我原本是0.5ms输出一位,从flash中读取再输出会变成0.67ms左右。

  • 添加这句TA0CTL &= ~MC_0 ,貌似定时器没有暂停,不知道是不是我写的不太对,能否给一个完整的如何暂停中断的例程?例如,当中断程序发生了n=100次时,使得定时器、中断暂停,直到我清空n的值。

  • 好的再帮您跟进给工程师看下,有答复尽快给到您。

  • >TA0CTL &= ~MC_0

    >> 不会停止计时器 (因为 MC__STOP[=MC_0]=0)。 您试下以下语句:

    >>TA0CTL &= ~MC_3 ; // MC=0 以停止计时器

    停止计时器将停止新的中断,直到执行其他操作 (即定时器再次启动)。 从 ISR 返回后,可能会触发一个挂起的中断。 要防止这种情况,请添加以下语句:

    > TA0CCTL0 &= ~CCIFG ; // 清除可能挂起的 CCR0 中断