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.

[参考译文] 编译器/MSP432P401R:将 Code Composer Studio 中的代码与 MSP432P401R 链接时遇到问题

Guru**** 2524550 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/840215/compiler-msp432p401r-i-am-facing-problem-in-linking-a-code-in-code-composer-studio-with-msp432p401r

器件型号:MSP432P401R

工具/软件:TI C/C++编译器

我在 MSP432P401r 中的链接过程中遇到错误。 我的代码如下所示

#include "ti/devices/msp432p4xx/inc/msp.h"
#include
#define Num_of 结果1100
#define ADC_TIMER1
#define ADC_TIMER_PERIOD 12000

volatile uint16_t A1Results[Num_for_Results];
int main (void){
volatile unsigned int i;
WDT_A->CTL = WDT_A_CTL_PW |//停止 WDT
WDT_A_CTL_HOLD;
P1->SEL0 |= BIT2 | BIT3;//将2-UART 引脚设置为辅助功能
//配置 UART
EUSCI_A0->CTLW0 |= EUSCI_A_CTLW0_SWRST;//将 eUSCI 置于复位状态
EUSCI_A0->CTLW0 = EUSCI_A_CTLW0_SWRST |//在复位时保持 eUSCI

EUSCI_B_CTLW0_ssel_SMCLK;//为 SMCLK 配置 eUSCI 时钟源
EUSCI_A0->BRW = 1;// 12000000/16/9600
EUSCI_A0->MCTLW =(10<< EUSCI_A_MCTLW_BRF_OFS)|
EUSCI_A_MCTLW_OS16;

EUSCI_A0->CTLW0 &=~EUSCI_A_CTLW0_SWRST;//初始化 eUSCI

P5->SEL1 |= BIT4;//为 ADC 配置 P5.4
P5->SEL0 |= BIT4;
ADC14->CTL0 = ADC14_CTL0_SHT0_6| ADC14_CTL0_ON | ADC14_CTL0_PDIV_2 | ADC14_CTL0_DIV_2 | ADC14_CTL0_ssel_4 | ADC14_CTL0_MSC| ADC14_C14_C14_C14_CTR_0;ADC14_C14_C14_CTR_C14_CTR_C14_C14_CK_0
ADC14->CTL1 = ADC14_CTL1_RES_0;//使用采样计时器、12位转换结果


ADC14->CTL0= ADC14_CTL0_SHP+ADC14_CTL0_CONSEQ_1;

ADC14->MCTL[0]|= ADC14_MCTLN_INCH_1;// A1 ADC 输入选择;Vref=AVCC
ADC14->IER0 = ADC14_IER0_IE3;//启用 ADC14IFG.3

Timer_A1->CCTL[1]=OUTMOD_3;
Timer_A1->CCR[0]=((ADC_TIMER_PERIOD)/2)-1;
Timer_A1->CCR[0]= ADC_TIMER_PERIODE-1;
ADC14->CTL0 = ADC14_CTL0_SHS_1;
ADC14->CTL0 = ADC14_CTL0_ENC;

Timer_A1->CTL |= TIMER_A_CTL_tassel_2 |// MCLK
Timer_A_CTL_MC_1;//up 模式

ADC14->CTL0 = ADC14_CTL0_SC;

__ENABLE_IRQ();

//在 NVIC 模块中启用 ADC 中断
NVIC->ISER[0]= 1 <<(ADC14_IRQn)& 31);
_no_operation();

ADC14->IER0 |= ADC14_IER0_IE0;//启用 ADC 转换完成中断

SCB->SCR &=~SCB_SCR_SLEEPONEXIT_MSK;//从 ISR 退出时唤醒

//确保 SLEEPONEXIT 立即生效
_DSB();

void ADC14_IRQHandler (void)

volatile unsigned int data;

数据= ADC14->MEM[0];

while (!(EUSCI_A0->IFG 和 EUSCI_A_IFG_TXIFG));

//回显接收到的字符
EUSCI_A0->TXBUF =数据;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 CCS 中、请重建整个项目。  右键单击项目名称、然后选择 Rebuild Project。  然后在文本文件中捕获 Console 视图的全部内容。  使用名为 Copy Build Log 的图标。  确保使用文件扩展名.txt。  然后将该文本文件附加到您的下一个帖子。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../copy-build-log.txte2e.ti.com/.../8562.copy-build-log.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。  链接器的关键诊断是...

    未定义 第一个参考
    符号 文件中
    ------ --------
    _no_operation ./msp432p401x_adc14_01.obj
    

    这几乎肯定是由于配置工程时出现了一些错误。  该线程将移交给一些 MSP432专家、他们知道如何配置像您一样的项目。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >_no_operation ./msp432p401x_adc14_01.obj

    我认为此函数(内在函数)名称的开头有两个下拉条、即"_no_operation()"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,先生

    感谢您先前的回答我解决了错误、但我没有得到任何输出现在运行程序后没有显示任何问题代码中的问题  

    谢谢你  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这确实是一个新问题(与 CCS 无关)、但:

    1)在以下行中:

    >ADC14->CTL0= ADC14_CTL0_SHP+ADC14_CTL0_CONSEQ_1;

    >ADC14->CTL0 = ADC14_CTL0_SHS_1;
    >ADC14->CTL0 = ADC14_CTL0_ENC;

    >ADC14->CTL0 = ADC14_CTL0_SC;

    通过使用"="、您将清除所有其他位;具体而言、您将设置 CTL0_ON=0、从而关闭 ADC。 每个都应为"|="。 (也不需要第一个和最后一个。)

    ----------

    您使用的是 CONSEQ=1、但您仅使用一个通道(MCTL/MEM)、并且您不会在最终(仅) MCTL 中设置 EOS 位。 我建议 CONSEQ=0。

    ----------

    >EUSCI_A0->BRW = 1;// 12000000/16/9600

    这看起来不正确。 由于您尚未更改 SMCLK、它以3MHz 运行、我的计算器显示3000000/16/9600=20。 不过、如果您成功、这是可以的。

    ----------

    您将遇到的下一个问题是:当 CONSEQ=0或=1和计时器触发器(SHS !=0)时,您需要在触发器之间切换 ENC (关闭,然后打开)。 [参考 TRM (SLAU356I)图22-7和22-8]。 ISR 是一个非常好的实现方法。 症状是您只能获得一个转换结果(ISR 调用)、然后什么也没有。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,先生  

    我已经做了以上所有提到、但我仍然没有获得任何输出、请查看我的以下代码、现在有什么问题。 我使用了波特率460800。 系统时钟12MHz。

    #include "ti/devices/msp432p4xx/inc/msp.h"
    #include
    #define Num_of 结果1100
    #define ADC_TIMER1
    #define ADC_TIMER_PERIOD 12000
    #define __system_clock 12000000

    volatile uint16_t A1Results[Num_for_Results];
    int main (void){
    volatile unsigned int i;
    WDT_A->CTL = WDT_A_CTL_PW |//停止 WDT
    WDT_A_CTL_HOLD;
    P1->SEL0 |= BIT2 | BIT3;//将2-UART 引脚设置为辅助功能
    //配置 UART
    EUSCI_A0->CTLW0 |= EUSCI_A_CTLW0_SWRST;//将 eUSCI 置于复位状态
    EUSCI_A0->CTLW0 = EUSCI_A_CTLW0_SWRST |//在复位时保持 eUSCI

    EUSCI_B_CTLW0_ssel_SMCLK;//为 SMCLK 配置 eUSCI 时钟源
    EUSCI_A0->BRW = 1;// 12000000/16/460800
    EUSCI_A0->MCTLW =(10<< EUSCI_A_MCTLW_BRF_OFS)|
    EUSCI_A_MCTLW_OS16;

    EUSCI_A0->CTLW0 &=~EUSCI_A_CTLW0_SWRST;//初始化 eUSCI

    P5->SEL1 |= BIT4;//为 ADC 配置 P5.4
    P5->SEL0 |= BIT4;
    ADC14->CTL0 |= ADC14_CTL0_SHT0_6 | ADC14_CTL0_ON | ADC14_CTL0_PDIV_2 | ADC14_CTL0_DIV_2 | ADC14_CTL0_ssel_4 | ADC14_CTL0_MSC_HP | ADC14_C14_C14_CTR_0_ADC14_CC0_ADC14_MCL0_ADC14_CL0_ADC14_MC_CL0| ADC14_CC_CL0_ADC14_MS_CL0| ADC14_CC_CL0_
    ADC14->CTL1 |= ADC14_CTL1_RES_0;//使用采样计时器,12位转换结果


    //ADC14->CTL0= ADC14_CTL0_SHP+ADC14_CTL0_CONSEQ_1;


    ADC14->MCTL[0]|= ADC14_MCTLN_INCH_1;// A1 ADC 输入选择;Vref=AVCC
    ADC14->IER0 = ADC14_IER0_IE3;//启用 ADC14IFG.3

    Timer_A1->CCTL[1]= OUTMOD_3;
    Timer_A1->CCR[0]=((ADC_TIMER_PERIOD)/2)-1;
    Timer_A1->CCR[0]= ADC_TIMER_PERIODE-1;
    ADC14->CTL0 = ADC14_CTL0_SHS_1;
    ADC14->CTL0 = ADC14_CTL0_ENC;

    Timer_A1->CTL |= TIMER_A_CTL_tassel_2 |// MCLK
    Timer_A_CTL_MC_1;//up 模式


    ADC14->CTL0 |= ADC14_CTL0_SC;


    __ENABLE_IRQ();

    //在 NVIC 模块中启用 ADC 中断
    NVIC->ISER[0]= 1 <<(ADC14_IRQn)& 31);
    __no_operation();

    ADC14->IER0 |= ADC14_IER0_IE0;//启用 ADC 转换完成中断

    SCB->SCR &=~SCB_SCR_SLEEPONEXIT_MSK;//从 ISR 退出时唤醒

    //确保 SLEEPONEXIT 立即生效
    _DSB();
    // ADC14->CTL0 |= ADC14_CTL0_EOS;

    void ADC14_IRQHandler (void)

    volatile unsigned int data;

    数据= ADC14->MEM[0];

    while (!(EUSCI_A0->IFG 和 EUSCI_A_IFG_TXIFG));

    //回显接收到的字符
    EUSCI_A0->TXBUF =数据;

    谢谢  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    触发初始串行写入的是什么?

    中断似乎没有任何原因触发。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您没有进行我建议的更改。

    >ADC14->CTL0 = ADC14_CTL0_SHS_1;
    >ADC14->CTL0 = ADC14_CTL0_ENC;

    这些(仍然)关闭 ADC。 使用"|="。

    ----------

    >EUSCI_A0->BRW = 1;// 12000000/16/460800

    I (仍然)看不到任何将 SMCLK 从3MHz 更改为12MHz 的代码。

    对于 uCOS=16和 SMCLK=3MHz 或12MHz、BRW=1 (仍然)不正确。 在8MHz 时并不是很好。

    ----------

    您(仍然)不会在 ISR 中切换 ENC。

    ----------

    您可能应该将您的代码与上的一些示例进行比较

    http://dev.ti.com/tirex/explore/node?node=AOqyDJonBtS4QACP3tJVEg__z-lQYNj__LATEST

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢主席先生的上一次答复

    我更改了我的代码我运行波特率115200我每秒获得481个样本问题是、每秒之后我获得不同数量的样本。我使用波特率115200或460800我获得相同的样本。正如您所说的、我触发 ISR 中的触发 ENC 结果中没有任何内容。 现在代码中存在什么问题


    #include "ti/devices/msp432p4xx/inc/msp.h"
    #define __system_clock 12000000
    int main (空)

    volatile unsigned int i、data;
    __ENABLE_IRQ();

    WDT_A->CTL = WDT_A_CTL_PW |//停止看门狗计时器
    WDT_A_CTL_HOLD;
    //在 NVIC 模块中启用 ADC 中断
    NVIC->ISER[0]= 1 <<(ADC14_IRQn)& 31);

    //配置 UART 引脚
    P1->SEL0 |= BIT2 | BIT3;//将2-UART 引脚设置为辅助功能

    P5->SEL1 |= BIT4;//为 ADC 配置 P5.4
    P5->SEL0 |= BIT4;
    CS->KEY = CS_KEY_VAL;//解锁 CS 模块以进行寄存器访问
    CS->CTL0 = 0;//重置调整参数
    CS->CTL0 = CS_CTL0_DCORSEL_3;//将 DCO 设置为12MHz
    //选择 MCLK = DCO、无分频器
    //选择 SMCLK = DCO
    CS->CTL1 =(CS->CTL1 &~(CS_CTL1_SELM_MASK |
    CS_CTL1_SELS _MASK ))|
    CS_CTL1_SELM_3 |
    CS_CTL1_SELs_3;

    CS->KEY = 0;//锁定 CS 模块,防止意外访问


    //在 NVIC 模块中启用 eUSCIA0中断
    // NVIC->ISER[0]= 1 <<((EUSCIA0_IRQn)& 31);

    ADC14->CTL0 |= ADC14_CTL0_SHT0_6| ADC14_CTL0_SHP | ADC14_CTL0_ON | ADC14_CTL0_PDIV_2 | ADC14_CTL0_DIV_2 | ADC14_CTL0_CONSEQ_4 | ADC14_CTLMSC_0;ADC14_CTLMC_4 | ADC14_CTL2_CTLMSEL
    ADC14->CTL1 |= ADC14_CTL1_RES_0;//使用采样计时器,12位转换结果

    ADC14->MCTL[0]|= ADC14_MCTLN_INCH_1;// A1 ADC 输入选择;Vref=AVCC


    ADC14->IER0 |= ADC14_IER0_IE0;//启用 ADC 转换完成中断

    SCB->SCR &=~SCB_SCR_SLEEPONEXIT_MSK;//从 ISR 退出时唤醒

    //配置 UART
    EUSCI_A0->CTLW0 |= EUSCI_A_CTLW0_SWRST;//将 eUSCI 置于复位状态
    EUSCI_A0->CTLW0 = EUSCI_A_CTLW0_SWRST |//在复位时保持 eUSCI

    EUSCI_B_CTLW0_ssel_SMCLK;//为 SMCLK 配置 eUSCI 时钟源
    //波特率计算
    // 12000000/(16*115200)= 6.510
    //分数部分= 0.510
    //用户指南表21-4:UCBRSx = 0x0
    // UCBRFx = int ((6.510-6)*16)= 8
    EUSCI_A0->BRW = 6;// 12000000/16/115200
    EUSCI_A0->MCTLW =(8<< EUSCI_A_MCTLW_BRF_OFS)|
    EUSCI_A_MCTLW_OS16;

    EUSCI_A0->CTLW0 &=~EUSCI_A_CTLW0_SWRST;//初始化 eUSCI
    // EUSCI_A0->IFG &&~EUSCI_A_IFG_RXIFG;//清除 eUSCI RX 中断标志
    // EUSCI_A0->IE |= EUSCI_A_IE_RXIE;//启用 USCI_A0 RX 中断
    //启用全局中断
    // P1->IE |= 0x02;
    //NVIC->ISER[1]=1;


    //*确保 SLEEPONEXIT 立即生效
    _DSB();

    //__delay_cycles (1500000);
    ADC14->CTL0 |= ADC14_CTL0_ENC;

    while (1)

    //

    //开始采样/转换
    ADC14->CTL0 |= ADC14_CTL0_SC;
    while (!ADC14->IFGR0);
    //data = ADC14->MEM[0];
    //__sleep();
    //
    __no_operation();//用于调试器

    // UART 中断服务例程
    void ADC14_IRQHandler (void)

    //ADC14->CTL0 |= ADC14_CTL0_ENC;
    volatile unsigned int data;

    数据= ADC14->MEM[0];

    while (!(EUSCI_A0->IFG 和 EUSCI_A_IFG_TXIFG));

    //回显接收到的字符
    EUSCI_A0->TXBUF =数据;

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、先生、

    使用上述代码当我使用系统时钟24MHZ 进行500次采样时,我每秒得不到恒定采样,超过500次或低于500次时,就是这样。

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您看到的差异有多大(样本/秒)?

    我的计算器显示您应该得到大约12MHz/32/3/(128+16+1)=862个样本(字节)/秒 这应该能够以115.2kbps (11520字节/秒)的速率轻松实现。

    如果将 ADC 时钟加倍并不会改变、听起来您的限制在其他地方。 您使用什么来接收这些样片?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢你的答复  

    我在另一秒得到了一次456我在相同的时钟和相同的波特率下得到了每秒512个样本  

    问题是、无论是使用115200波特率还是460800波特率、在这两种情况下都没有相同的样本。 每秒我没有获得恒定样本、它提供不同 数量的样本。

    我使用 python 代码在 notepad++上收到了这些示例。

    我的代码中有什么问题吗?  在代码中、两个环路是对的还是错的?

    谢谢主席先生

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    鉴于(a)更改 UART 比特率和(b)加快 ADC 时钟速度不会影响症状、我(仍然)怀疑接收数据的程序中存在问题。

    Python 做得很好、但"运行速度真的很快"通常不在其中。 我通常将 PuTTY 与“会话->日志记录”选项一起用于这些类型的事情。 它不会跟上兆位速率、但在这里应该做得非常好。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,先生

    我发送一张输出图片、我将在领域获取输出、它显示我发送的内容和接收的内容是相同的、但我如何计算出 它是862个样本/秒 我认为我的代码运行正常。

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先、我将捕获日志文件中的数据、例如30秒、计算日志文件中的字节、然后除以30。 这有点笨拙、但 它应该会相当快地为您提供一次近似。 现在您正在寻找2倍的差异、这一点应该很明显。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我在 PuTTY 日志文件中捕获该程序的输出30秒时、我得到大约33000字节、因此大约为1ksps。 我相信 MSP432时钟比我("千分之一")的时间计数更重要、但它肯定比456更接近862SPS。

    您的 Realterm 实验告诉您什么?