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.

关于CCSv5编译工程的问题



最近在学习使用TI公司的MSP4305529的超低功耗单片机,在我用CCSv5编译工程的时候,遇到一些问题,需要你们帮忙看一下:

1.有时候在编译工程的时候,第一次跟第二次build,显示的错误信息都不一样,有时候第一次编译的时候会出现一些警告或者错误,修改一下再次编译的时候前面一次遇到的警告和错误都不见了,这个是怎么回事???

2.在HAL_Wheel.c里面的中断函数,里面有个switch结构,每个分支对应于中断向量的标志,在其中一个分支下我随意加上一句s=0;的语句,s是没有经过定义一个变量,是我用来测试用的,然后clean再次编译整个工程,发觉错误信息栏并没有报错,而且上次出现的警告信息也没有,我就觉得很奇怪,是不是文件的编译路径没有被包含进来,但是我使用的都是TI提供的工程,这个是什么问题???

3.是关于代码的问题:#pragma vector = ADC12_VECTOR

__interrupt void ADC12_ISR(void)

上面两行是中断向量入口,TI提供的例子,有时候写的是 ADC12_ISR(void),有时候写的是 ADC12ISR(void),区别就是带不带下划线,请问这两个带不带下划线的中断服务程序有什么区别吗???

4.在利用TI给的LAB4建立工程的时候,我在里面建立自己创建的一个C文件myADC12.c,里面定义了一些关于AD的函数,包括ADC中断服务程序,我把HAL_Wheel.c里面的中断服务程序给注释掉,并把HAL_Wheel.c里面的中断服务程序复制到myADC12.c,方便以后自己用,因为要用到多个通道的AD转换,所以干脆把它们都放在一个myADC12.c文件里面,然后编译整个工程,结果报错,错误是ADC12_ISR已经重复定义,然后我把ADC12_ISR改为ADC12ISR(不带下划线)然后再次编译,不报错,然后我把HAL_Wheel.c里面的注释去掉,再次编译,不报错。。。这些是什么问题???

5.在用CCSv5的时候有时候也会出现一些小问题,是不是CCS新版本本身存在一些小BUG。。。

以上问题均基于CCSv5上的,而且工程用的都是TI自带的例程,配置均没进行修改。

  • 1.第一个问题没看明白,你说修改一下就可以编译通过,如果把error修改了通过编译是正常的;

    2.你用的是哪个版本的compiler,我在CCS 5.4 和编译器 TI V4.1.5环境下测试,编译后会报错了,变量未定义;

    3. ADC12_ISR只是中断函数的名字,可以自己改的;

    4. ADC12只有一个中断向量和服务函数,不明白你说的几个ADC中断函数什么意思,中断服务函数不需要定义,CCS会识别中断前的关键字 __interrupt;

    5. CCS的小问题能发给大家看看吗?

  • 首先谢谢你的热心回答,之前的几个问题解决了,编译没报错是因为工程里面的灰色文件没有包含进去编译。。。

    这边还有几个问题需要给你帮忙看一下,就是:

    1.AD采样时钟。,例子里面默认的是使用ADC12 内部时钟源,即ADC12OSC,我在datasheet里面查看了一下,这里的ADC12OSC是使用USC来控制的,他跟一个叫做MODOSC的时钟源有关(MODOSC是什么,我搞不明白,能不能帮忙解释一下?)而MODOSC是来源于MODCLK的,但是在电路图上并没有看到MODCLK到底是从哪里来的,使用的应该不是从系统那里直接过来的,应该是分频得到的,现在就是ADC12的时钟找不到是多少???而且MODOSC的使用好像说是得需要MODOSC_REQEN的使能允许才能使用,但是在代码里面也并没有看到对MODOSC的配置,是不是默认就会配置为ADC12 的采样时钟???最后问下,ADC12可以采用四种时钟源,即内部时钟ADC12OSC,ACLK,MCLK,SMCLK,这四种时钟是怎么为ADC12提供时钟的,也就是这四种时钟分到ADC12 上的到底有多少???

    2.系统时钟问题。系统时钟可以采用好几种方式,现在的问题是LAB实验里面采用的是不是XT2?我看程序的时候,程序配置的都是跟DCO相关的配置寄存器,因为里面的寄存器都是以DCO为前缀的,而我又问了下其他人,说DCOCLK是数字RC振荡器,频率比较低,而另外一个LFXT1也是低频的,在MSP430系列单片机资料上看到对DCO振荡器的说明,不是非常明白,外部LFXT1和XT2失效时,DCO振荡器就会自动使用为MCLK为系统提供时钟源,此时振荡器就会产生失效,触发NMI中断响应请求,也就是每个主程序文件里面都会有一个NMI的中断服务程序,将振荡器触发的失效标志清零,我这样理解不知道对不对???

    3.ADC12中断服务程序。我不知道是配置问题还是什么原因,我使用的中断是P6.0,也就是例子里面的,但是我把程序改了一下,其他的不变,改的地方是ADCIE,还有PxSEL、ADC12MCTL0,还有中断向量入口ADC12IV_ADC12IFGx,为了方便,我把程序贴在下面:

    void ADC12_init(void)
    {

    P7SEL |= 0x000f; // 选择并设置通道(功能选择:作为模拟输入)
    ADC12CTL0 = ADC12ON + ADC12MSC + ADC12SHT1_8; // 打开 ADC12, 多次采样,extend sampling time
    // to avoid overflow of results
    ADC12CTL1 = ADC12SHP + ADC12CONSEQ_2; // 使用采样定时器, 单通道多次转换
    ADC12IE = 0x08; // ADC12IFG.3中断允许
    ADC12CTL0 |= ADC12ENC; // 使能ADC转换
    ADC12MCTL0 = ADC12INCH_13; // ref+=AVcc, channel = A12 -> P7.0
    ADC12CTL0 |= ADC12SC; // 开始转换 - software trigger

    }

    上面程序没什么问题吧???但是就是进不去中断,调试的时候我在每一个向量分支下都设置了一个标志,只有一个可以进入,那就是ADC12IV_ADC12IFG0,下一步我把TI给的源程序移植到我系统下,也只有ADC12IV_ADC12IFG0这一个向量可以产生中断,请问一下,这个是什么原因,就好像是除了ADC12IV_ADC12IFG0以外,其它入口被关闭一样,???请问一下ADC12IE的每一位是对应一个通道的吗?即如果ADC12IE = 0x08; 第3位置1 ,就是ADC12IFG.3会置位,第4位置1ADC12IFG.4就会置位???还有就是ADC12MEM有16个存储器,是不是在默认情况下每一个通道采样产生的结果就保存在对应的ADC12MEMx中?这个可不可以设置,如果可以,那得怎么设置???

    还有,AD的通道设置好像直接配置PxSEL为模拟输入,然后配置一下模式,再启动一下AD开始采样就行了?相应的标志位就会置位,而跟ADC12MCTLx好像没多大关系,ADC12MCTLx也是可以用来配置转换转换通道,但是在这里跟用PxSEL来配置转换通道有什么不一样???

    有劳各位帮忙回答下以上问题,在此非常感谢!!!

  • 请问一下,如何将编译器改为 TI V4.1.5环境,我编译也有警告,就是关于编译环境的

  • 建议使用较新版本的ccs

    另外,在建立工程的时候,可以选择你是用的编译器版本(如果你的ccs带有多个编译器的话),可以在工程配置里重新选择编译器版本