社区导航

 

搜索
查看: 668|回复: 21

[原创] MSP430单片机那些事儿(连载,2019年2月15日更新至第8篇)

[复制链接]

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

发表于 2019-1-23 15:06:21 | 显示全部楼层 |阅读模式
本帖最后由 tiankai001 于 2019-2-15 15:17 编辑

此内容由EEWORLD论坛网友tiankai001原创,如需转载或用于商业用途需征得作者同意并注明出处


说明:本帖内容如下,所有内容散落在各楼层,大家看的时候可以选择性查看

MSP430单片机那些事儿(1)时钟系统的默认配置

MSP430单片机那些事儿(2I/O端口的默认配置


MSP430单片机那些事儿(3)看门狗的默认配置



MSP430单片机那些事儿(4)中断标志与中断配置的关系


MSP430单片机那些事儿(5)中断函数编写方法

MSP430单片机那些事儿(6)定时器TimerA两个中断的区别

MSP430单片机那些事儿(7)定时器TimerA中断标志的置位和清除

MSP430单片机那些事儿(8)端口第二功能与端口引脚方向的搭配

MSP430单片机时间比较长了,一直以来,都是一种拿来就用的方法,很少真正的去认真解读msp430单片机的数据手册。只有出了问题时,才会去查阅对应的功能模块。
最近公司新同事经常会问一些问题,问到产品方面的问题的时候,我自然是可以清楚、明白的讲解;但是有时候问到对于MSP430不同功能模块的操作,尤其是问到为什么这样操作的时候,我就磕磕绊绊讲不明白。
基于此,我萌生了将平时了解的关于msp430单片机的零落知识记下来的想法。这样既可以和大家一起分享,还能够随时结合具体问题查漏补缺。
因为不是系统性的学习,所以这个帖子的题目就不能是教程或者学习笔记,借用很出名的一本书《明朝那些事儿》,这个帖子就叫做《MSP430单片机那些事儿》。

MSP430单片机那些事儿(1)时钟系统的默认配置
关于MSO430单片机上电后的默认时钟,我们先来看看数据手册上的描述(以msp430f67451单片机为例)。如下图所示。(说明:我英语水平不足,所以看着数据手册总是不顺,就顺便翻译了一下,翻译的可能不准确,有疑问的请直接提出来,大家可以一起讨论)
      01.jpg

下面这段话描述了M430430F67451A单片机上电后,时钟系统的默认配置。
1、上电后XT1CLK振荡器的默认配置
首先我们来看看时钟系统的相关寄存器。在时钟模块控制寄存器UCSCTL6中,我们可以看到,上电后XT1模式选择控制位中,选择了低频模式,XT1来源于内部时钟(使用外部晶振)。如下图所示。
08.jpg

具体控制位的默认配置解释如下
11.jpg
12.jpg
2、上电后ACLKSMCLKMCLK的参考时钟源的默认配置
在时钟模块控制寄存器UCSCTL4中,ACLKSMCLKMCLK参考时钟源选择XT1CLK。如下图所示。
07.jpg
下面分别解释一下三种时钟的选择控制位默认配置的含义
13.jpg
14.jpg
15.jpg
3、上电后DCO的频率的默认配置
03.jpg
为什么DCOSEL设置为10就是表示DCO的频率是2MHz呢?请看下面。

16.jpg
17.jpg
4、上电后MCLKSMCLK的频率的默认配置
最后来看看为什么折腾一圈后,MCLK,SMCLK的频率是1MHz。
04.jpg
因为DCO上电后是2MHz,经过FLL预分频为2分频后,自然MCLK就是1MHz了

18.jpg











回复

使用道具 举报

100

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-1-23 15:20:02 | 显示全部楼层
加油 感谢分享 坐等连载

点评

感谢支持,大家的支持是我的动力  详情 回复 发表于 2019-1-23 15:37


回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2019-1-23 15:37:17 | 显示全部楼层
yangjiaxu 发表于 2019-1-23 15:20
加油 感谢分享 坐等连载

感谢支持,大家的支持是我的动力


回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2019-1-24 09:42:30 | 显示全部楼层
MSP430单片机那些事儿(2I/O端口的默认配置

我们来看下面这段话,这段话说的是经过BOR(也就是掉电复位)后,单片机的一个初始状态。
关于I/O端口的初始状态,手册中是这样说的:上电后,所有端口处于输入状态。如下图所示。。。

01.jpg

再来看看手册中I/O端口所在章节中,关于I/O端口寄存器在复位后的值,如下图所示。可以看到,复位后,P1DIR=0x00

02.jpg

因为PxDIR是端口方向寄存器,如下图所示,该寄存器中的数据位如果被配置为0,则是输入,如果被配置为1,则是输出。
04.jpg
以上是手册中的描述和数据。接下来我们看看真实情况怎么样(以MSP430F6723为例),我们新建一个工程,配置完成后,进入仿真环境,在程序还没有运行时,观察P1端口的寄存器的值,如下图所示,确实如手册上描述的那样,P1DIR=0x00,端口为输入方向。
03.jpg




回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2019-1-24 11:03:54 | 显示全部楼层
本帖最后由 tiankai001 于 2019-1-24 11:06 编辑

MSP430单片机那些事儿(3)看门狗的默认配置

在几乎所有的MSP430单片机程序中,在程序的开始部分,都会看到这一句话,如下图所示,这句话的含义就是关闭看门狗,为什么要这样做呢?

01.jpg

在上一节中,我们看到,MSP430单片机在复位后,其看门狗定时器被默认为看门狗模式,如下图所示。

00.jpg

我们来看看数据手册中关于看门狗在上电后的默认设置是怎样的,如下图所示。从这句话可以解释为什么上电后一般先关闭看门狗:因为上电后看门狗定时器被默认为看门狗模式,并且定时时间间隔只有32ms,一般情况下(尤其是在程序调试阶段),这个时间太短了,所以先关闭看门狗,然后再根据实际需要,初始化完成后再配置。

02.jpg

下面图中可以看到手册上关于看门狗寄存器复位后的初始值。


04.jpg


我们再来看看在实际进入仿真状态下,看门狗寄存器的值是不是与手册上描述的一致。


03.jpg


下图中可以看出,在默认配置下,看门狗的定时时间间隔为什么是32ms


05.jpg

06.jpg





回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2019-1-28 16:43:10 | 显示全部楼层
MSP430单片机那些事儿(4)中断标志与中断配置的关系
MSP430单片机有着非常强大的功能和超低的功耗,在一般情况下,建议的低功耗工作方式就是用中断来实现的:程序运行在低功耗状态,依靠中断来唤醒低功耗状态,处理完后,让程序再进入低功耗状态。
由此可见,MSP430单片机的中断要好好研究一番,今天我们就来看看:中断标志和中断配置的关系。是不是只有使能了中断,才会有中断标志的产生,如果不使能中断,是不是就没有中断标志的产生?
我们以端口中断为例,首先来看一下手册上关于端口中断寄存器的说明。MSP430端口中断使能寄存器、中断边沿选择寄存器、中断标志寄存器的说明如下。
01.jpg

02.jpg

03.jpg



下面我们来简单些一小段程序,同时我们让程序进入仿真状态。程序如下:
05.jpg


进入仿真环境后,程序并没有运行,这时候有关P1端口寄存器的值如下所示。
04.jpg


接下来我们让程序运行到如下位置。
06.jpg


再来看P1端口有关中断的几个寄存器的值。可以看到,此时P1.0的中断标志已经被置位了,可是我们程序中没有使能P1.0端口的中断。但是我们看程序中,先把P1.0端口输出低电平,然后又输出高电平,这个正好满足了中断边沿触发选择寄存器的默认情况:0---上升沿触发中断。
07.jpg

所以我们可以得出结论:在MSP430单片机的中断中,有一些中断的标志位只要外部条件满足,就会产生中断标志,与是否使能中断无关。






回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2019-1-28 16:46:02 | 显示全部楼层
MSP430单片机那些事儿(4)中断标志与中断配置的关系

MSP430单片机有着非常强大的功能和超低的功耗,在一般情况下,建议的低功耗工作方式就是用中断来实现的:程序运行在低功耗状态,依靠中断来唤醒低功耗状态,处理完后,让程序再进入低功耗状态。
由此可见,MSP430单片机的中断要好好研究一番,今天我们就来看看:中断标志和中断配置的关系。是不是只有使能了中断,才会有中断标志的产生,如果不使能中断,是不是就没有中断标志的产生?
我们以端口中断为例,首先来看一下手册上关于端口中断寄存器的说明。MSP430端口中断使能寄存器、中断边沿选择寄存器、中断标志寄存器的说明如下。

01.jpg

02.jpg

03.jpg


下面我们来简单些一小段程序,同时我们让程序进入仿真状态。程序如下:

05.jpg

进入仿真环境后,程序并没有运行,这时候有关P1端口寄存器的值如下所示。

04.jpg

接下来我们让程序运行到如下位置。
06.jpg


再来看P1端口有关中断的几个寄存器的值。可以看到,此时P1.0的中断标志已经被置位了,可是我们程序中没有使能P1.0端口的中断。但是我们看程序中,先把P1.0端口输出低电平,然后又输出高电平,这个正好满足了中断边沿触发选择寄存器的默认情况:0---上升沿触发中断。
07.jpg

所以我们可以得出结论:在MSP430单片机的中断中,有一些中断的标志位只要外部条件满足,就会产生中断标志,与是否使能中断无关。






回复

使用道具 举报

87

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-1-30 08:11:28 | 显示全部楼层
大神关于MSP430F41死区电压有研究没,据说是这颗片子的POR设计的有问题,才会导致死区电压后,不掉电,重新上电,单片机复位不了的问题。

点评

这个问题在msp430f6系列单片机中也有,尤其是当电源端附加有大电容时,表现更为明显。我们现在也没有好的解决方法,只能是在掉电时加快放电速度,让电压尽快下降到死区电压以下。  详情 回复 发表于 2019-1-30 09:42


回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2019-1-30 09:42:03 | 显示全部楼层
忘归尘 发表于 2019-1-30 08:11
大神关于MSP430F41死区电压有研究没,据说是这颗片子的POR设计的有问题,才会导致死区电压后,不掉电,重新 ...

这个问题在msp430f6系列单片机中也有,尤其是当电源端附加有大电容时,表现更为明显。我们现在也没有好的解决方法,只能是在掉电时加快放电速度,让电压尽快下降到死区电压以下。


回复

使用道具 举报

385

TA的帖子

2

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-2-10 10:26:09 | 显示全部楼层
MSP430单片机好是好,就是贵啊!好多项目不敢用。

点评

你说的是实情,MSP430单片机价格确实有些高。 但是批量以后,价格会大幅度下降  详情 回复 发表于 7 天前
同感!  详情 回复 发表于 2019-2-10 13:53


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-2-10 13:53:57 | 显示全部楼层
bigbat 发表于 2019-2-10 10:26
MSP430单片机好是好,就是贵啊!好多项目不敢用。

同感!


回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 7 天前 | 显示全部楼层
bigbat 发表于 2019-2-10 10:26
MSP430单片机好是好,就是贵啊!好多项目不敢用。

你说的是实情,MSP430单片机价格确实有些高。
但是批量以后,价格会大幅度下降


回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 7 天前 | 显示全部楼层
MSP430单片机那些事儿(5)中断函数编写方法
了解多种单片机的电子工程师都知道,基本上每一种单片机都有中断,关于中断的优点不多说了,具体到MSP430单片机,由于其超低功耗特性,所以它的中断系统更是非常强大,因为要实现超低功耗,最重要的一点就是让单片机大部分时间处于休眠状态,利用中断来唤醒单片机,中断执行完后,再尽快再次进入休眠状态。
MSP430单片机的中断是如此强大:种类多、功能强。正因为中断种类多,中断函数的编写就要特别注意。

单片机中断函数的编写一般有三种方法:
1、对于单源中断(或者多源中断中只启用了一种中断),其中断函数可以如下面例子所示。

  1. #include <msp430.h>

  2. int main(void)
  3. {
  4.     WDTCTL = WDTPW | WDTHOLD;               // Stop WDT

  5.     // Setup P1.0 output
  6.     P1DIR |= BIT0;                          // Set P1.0 to output direction
  7.     P1OUT &= ~BIT0;                         // Clear P1.0

  8.     // Setup TA0
  9.     TA0CCTL0 = CCIE;                        // CCR0 interrupt enabled
  10.     TA0CCR0 = 50000;
  11.     TA0CTL = TASSEL_2 | MC_1 | TACLR;       // SMCLK, upmode, clear TAR

  12.     __bis_SR_register(LPM0_bits | GIE);     // Enter LPM0 w/ interrupt
  13.     __no_operation();                       // For debugger
  14. }

  15. // Timer0_A0 interrupt service routine
  16. #pragma vector=TIMER0_A0_VECTOR
  17. __interrupt void TIMER0_A0_ISR(void)
  18. {
  19.     P1OUT ^= BIT0;                          // Toggle P1.0
  20. }
复制代码



2、多源中断,方法一是采用查询中断标志的方法编写中断函数。如下面例子所示

  1. #pragma vector=USCI_A0_VECTOR
  2. __interrupt void USCI_A0_ISR(void)
  3. {
  4.   // 接收中断
  5.   if( ( UCA0IFG & UCRXIFG ) != 0 )
  6.   {
  7.    
  8.   }
  9.   // 发送中断
  10.   if( ( UCA0IFG & UCTXIFG ) != 0 )
  11.   {

  12.   }
  13. }
复制代码



3、多源中断,方法二是采用IAR库函数推荐的switch-case方法。如下面例子所示。

// Timer0_A1 Interrupt Vector (TAIV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
    switch (__even_in_range(TA0IV, 14))
    {
        case  TA0IV_NONE: break;             // No interrupt
        case  TA0IV_TA0CCR1: break;          // TA0CCR1_CCIFG
        case  TA0IV_TA0CCR2: break;          // TA0CCR2_CCIFG
        case  6: break;                      // Reserved
        case  8: break;                      // Reserved
        case 10: break;                      // Reserved
        case 12: break;                      // Reserved
        case TA0IV_TA0IFG:                   // TA0IFG
            P1OUT ^= BIT0;                   // Toggle P1.0
            break;
        default: break;
    }
}

我们今天重点说说这第三种方法。
这里有几个需要说明的地方。第一是__even_in_range(TA0IV, 14)这个函数是什么意思?
__even_in_range的原型在intrinsic.h文件里,关于这个函数的解释是这样的
第二:__value的值从哪里得来?我们来看看msp430x5xx,6xx的用户指南,找到TimerA的寄存器TAxIV。如下图所示,这样不但明白这个值是怎么来的,也很清楚为什么这个值必须是偶数了。
01.jpg

第三:__bound的值如何确定,有什么讲究?
上面说了__bound必须是偶数,至于它的值是多少,首先要根据它的数据类型unsigned short,取值必须在这个类型的范围之内,其次,如果对于这个中断里面中断向量比较高的中断不想响应,那就可以把这个值取低一点,就可以完美的解决这个问题。

msp430里经常被用在多源中断的查询中,如 switch( __even_in_range(TAIV,10)
只有在TAIV的值是在0--10内的偶数时才会执行switch函数内的语句其作用是提高switch语句的效率






回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 6 天前 | 显示全部楼层
MSP430单片机那些事儿(6)定时器TimerA两个中断的区别

MSP430单片机的定时器功能强大,有多种模式和功能。功能强大是优势,但是使用起来,编程时候却是很复杂的,一不小心就会出错。
MSP430F6723为例来说一下定时器TimerA的中断。从IARmsp430f6723的头文件中,如下图所示。
01.jpg

可以看到关于定时器TimerA有两个中断向量,那么问题来了,这两个中断向量有什么区别,定时器A的不同定时中断发生时,该怎样编写中断函数,中断函数的向量用哪一个呢?
其实上图中的注释已经说明了,4种中断根据不同情况进入不同中断向量对应的服务函数。
再看下图,在用户指南中,定时器TimerA中断向量寄存器,根本就找不到CC0的中断标志,说明这个中断向量寄存器对CC0中断是不适用的。
02.jpg
为了验证,编写下面的程序。该程序仅用于功能性验证,不具备通用性使用。

首先是定时器的初始化配置。

  1. void TimerACounterSetup(void)[/align]{
  2.     TA0CTL = TASSEL_1 + TACLR + TAIE; // 时钟源选择ACLK, 清除TAR,使能TA0中断
  3.     TA0CCTL1 = CCIE;                     //使能 CCR0
  4.     TA0CCTL2 = CCIE;    //使能 CCR1
  5.     TA0CCTL0 = CCIE;    //使能 CCR2
  6.     TA0CCR0 = 0x8000;   //CCR0初值
  7.     TA0CCR1 = 0x4000;   //CCR1初值
  8.     TA0CCR2 = 0x6000;   //CCR2初值
  9.     TA0CTL |= MC_1;        //增计数模式      
  10. }
复制代码


再写一个TIMER0_A0的中断函数
  1. #pragma vector=TIMER0_A0_VECTOR
  2. __interrupt void Timer_A_Counter (void)
  3. {
  4.   _NOP();  
  5. }
复制代码


最后写一个TIMER0_A1的中断函数。
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
    switch (__even_in_range(TA0IV, 14))
    {
        case  TA0IV_NONE: break;             // No interrupt
        case  TA0IV_TA0CCR1: break;          // TA0CCR1_CCIFG
        case  TA0IV_TA0CCR2: break;          // TA0CCR2_CCIFG
        case  6: break;                      // Reserved
        case  8: break;                      // Reserved
        case 10: break;                      // Reserved
        case 12: break;                      // Reserved
        case TA0IV_TA0IFG:                   // TA0IFG
            P1OUT ^= BIT0;                   // Toggle P1.0
            break;
        default: break;
    }

}
最后进入仿真环境,运行程序,请看下图,

03.jpg

04.jpg

05.jpg

06.jpg







回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 4 天前 | 显示全部楼层

MSP430单片机那些事儿(7)定时器TimerA中断标志的置位和清除

对于MSP430单片机的中断,有单源中断和多源中断的说法,可以这样理解:多个中断事件对应一个中断向量,就是多源中断。而只对应一个中断事件的中断向量,是单源中断。
但是对于msp430单片机众多的中断到底哪些是单源中断,那些是多源中断,手册中虽然没有很明确的讲,不过可以通过各个具有中断模块的中断向量寄存器看出端倪,一般情况下,只有对应多个中断事件的中断向量才会有中断向量寄存器。
另外就是关于中断标志的问题。看过很多资料,对于中断标志的置位和清除都是这样描述的(在中断使能的情况下):单源中断的中断标志会在硬件自动清除,而对于多源中断,则需要软件清除。
今天还以msp430f6723单片机的TimerA定时器为例来看以下中断标志的置位和清除。

第一步
首先我们先使用TA0CCR0产生一个1S的计数中断。定时器TimerA初始化代码如下。
  1. void TimerACounterSetup(void)[/align]{
  2.     TA0CTL = TASSEL0 + TACLR;            // ACLK, clear TAR
  3.     TA0CCTL0 = CCIE;                     // CCR0 interrupt enabled
  4.     TA0CCR0 = 0x8000;   
  5.     TA0CTL |= MC_1;                      //Start Timer_a in upmode      
  6. }
复制代码


中断服务函数代码如下。
  1. #pragma vector=TIMER0_A0_VECTOR
  2. __interrupt void Timer_A_Counter (void)
  3. {
  4.   
  5.   _NOP();
  6. }
复制代码


此时,程序中TimerA只有这一个中断,进入仿真环境后,运行程序,让程序运行到中断函数中,我们看一下此时TimerA各个寄存器的状态位都处在什么状态,尤其是各个中断标志、中断使能的状态。如下图所示。
01.jpg

可以看到,当进入TA0CCR0中断后,它的中断标志CCIFG已经是0,也就是已被清除了。
而此时TA0CCR1TA0CCR2以及TA0的中断标志也都被置上了,不过因为它们的中断使能控制位没有被使能,所以不会产生相应中断。
这个例子证明对于单源中断,他的中断标志位是硬件自动清除的。
第二步
然后我们不但使用TA0CCR0产生一个1S的计数中断。同时将定时器TimerATA0CCR1TA0CCR2以及TA0的中断都开启,初始化代码如下。
  1. void TimerACounterSetup(void)
  2. {
  3.     TA0CTL = TASSEL_1 + TACLR + TAIE; // 时钟源选择ACLK, 清除TAR,使能TA0中断
  4.     TA0CCTL1 = CCIE;                     //使能 CCR0
  5.     TA0CCTL2 = CCIE;    //使能 CCR1
  6.     TA0CCTL0 = CCIE;    //使能 CCR2
  7.     TA0CCR0 = 0x8000;   //CCR0初值
  8.     TA0CCR1 = 0x4000;   //CCR1初值
  9.     TA0CCR2 = 0x6000;   //CCR2初值
  10.     TA0CTL |= MC_1;        //增计数模式      
  11. }
复制代码



中断服务函数代码如下。
  1. #pragma vector=TIMER0_A0_VECTOR
  2. __interrupt void Timer_A_Counter (void)
  3. {
  4.   _NOP();  
  5. }


  6. #pragma vector=TIMER0_A1_VECTOR
  7. __interrupt void TIMER0_A1_ISR(void)
  8. {
  9.     switch (__even_in_range(TA0IV, 16))
  10.     {
  11.         case  TA0IV_NONE: break;             // No interrupt
  12.         case  TA0IV_TA0CCR1: break;          // TA0CCR1_CCIFG
  13.         case  TA0IV_TA0CCR2: break;          // TA0CCR2_CCIFG
  14.         case  6: break;                      // Reserved
  15.         case  8: break;                      // Reserved
  16.         case 10: break;                      // Reserved
  17.         case 12: break;                      // Reserved
  18.         case TA0IV_TA0IFG:                   // TA0IFG
  19.             P1OUT ^= BIT0;                   // Toggle P1.0
  20.             break;
  21.         default: break;
  22.     }
  23. }
复制代码



此时,程序中TimerA2个中断,进入仿真环境后,运行程序,让程序先运行到TA0CCR0中断函数中,我们看一下此时TimerA各个寄存器的状态位都处在什么状态,尤其是各个中断标志、中断使能的状态。如下图所示。
02.jpg
可以看到,当进入TA0CCR0中断后,它的中断标志CCIFG已经是0,也就是已被清除了。
而此时TA0CCR1TA0CCR2以及TA0的中断标志也都未被置上了,虽然它们的中断使能控制位已经使能,因为中断条件不满足,所以不会产生相应中断。
继续运行程序,当进入TIMER0_A1_VECTOR的中断后,再观察对应的TimerA各个寄存器的值,如下图所示。
03.jpg

这时单步运行程序,当进入TA0中断处理部分后,TAIFG变成0,也就是TA0的中断标志被清除了。从这里就可以看出单源中断和多源中断的中断标志清除时机的差别了。(这里有一个疑问,一直说多源中断的中断标志需要软件清除,但是这段程序里面,并没有清除TAIFG标志的语句,它怎么就变成0了呢,难道是这种IAR自带的switch (__even_in_range(TA0IV, 16))这种内嵌函数具有清除对应中断标志的功能?
04.jpg

继续运行程序,使程序发生TA0CCR1中断,相关寄存器的变化如下图所示
05.jpg

继续运行程序,使程序相继发生,TAOCCR2中断,相关寄存器的变化如下图所
06.jpg








回复

使用道具 举报

761

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 4 天前 | 显示全部楼层
真心好帖子,喜欢,啦啦

点评

感谢支持!  详情 回复 发表于 3 天前


回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 3 天前 | 显示全部楼层
MSP430单片机那些事儿(8)端口第二功能与端口引脚方向的搭配

几乎每一款MSP430单片机都有端口复用的情况,在msp430单片机的用户指南里面,关于端口复用,有下面的描述。
04.jpg
那么,在实际设计中,使用某个端口的第二功能时,如果没有正确设置端口的方向,会出现什么后果呢?
今天我们就用MSP430F6723ADC功能来做个实验验证一下。通常情况下,如果一个端口用作ADC端口,那么这个端口肯定是要设置为输入口的。可能在有些单片机中,一旦端口被选择配置为AD端口,单片机会自动将这个端口设置为输入口,但是我们从上面的描述中已经看到了,MSP430单片机不会这样做。
开始做实验!
第一步,在AD转换开始前,先将端口设置为输出方向,输出低电平,然后再配置为第二功能口。
仿真运行后,得到的AD转换值如下图所示。
01.jpg
第二步,在AD转换开始前,先将端口设置为输出方向,输出高电平,然后再配置为第二功能口。
仿真运行后,得到的AD转换值如下图所示
02.jpg
第三步,在AD转换开始前,先将端口设置为输入方向,然后再配置为第二功能口。
仿真运行后,得到的AD转换值如下图所示
03.jpg
第四步,经过上面三次实验,可以看到,AD转换的值与端口配置为第二功能口前的状态有很大区别。
需要说明的是,在第一步和第二步的测试中,进行第一次AD转换后,接下来的AD转换所得到的值与第三步所得到的值是一致的。



回复

使用道具 举报

477

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 3 天前 | 显示全部楼层
楼主加油,我们都看好你哦

点评

谢谢,大家的支持是我持续更新的动力  详情 回复 发表于 3 天前


回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 3 天前 | 显示全部楼层
alan000345 发表于 2019-2-14 13:17
真心好帖子,喜欢,啦啦

感谢支持!


回复

使用道具 举报

7260

TA的帖子

4933

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 3 天前 | 显示全部楼层
zhuyebb 发表于 2019-2-15 15:27
楼主加油,我们都看好你哦

谢谢,大家的支持是我持续更新的动力


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-2-18 10:07 , Processed in 0.510850 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表