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.

[参考译文] CCS/MSP432P401R:msp432p401r (黑色电路板)、CCS 版本:6.1.1.00022

Guru**** 2943390 points

Other Parts Discussed in Thread: CCSTUDIO

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/701318/ccs-msp432p401r-msp432p401r-black-boards-ccs-version-6-1-1-00022

器件型号:MSP432P401R

工具/软件:Code Composer Studio

我有许多较旧的 msp432p401r (黑板)

当前使用 CCS 版本:6.1.1.00022

MSP432器件支持文件   6.1.0.6   com.ti.ccstudio.msp432.emu.win32.feature.group   德州仪器(TI)

问题是我喜欢直接编写代码、问题是示例中的语法使用此格式

EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST;      //保持 eUSCI_B 处于复位状态

而我习惯使用这种格式进行编码

UCB0CTLW0 |= UCSWRST;                            /*软件复位使能*/

我还遇到了中断问题

在  msp432_startup.ccs.c 第103行

"    defaultISR、                            /* EUSCIB0 ISR              */

我将其更改为

EUSCIB0_IRQHandler

msp432p401r.h 也有一个中断矢量   

EUSCIB0_IRQn               = 20、    // 36 EUSCIB0中断*/

为什么有2个不同的 IRQ 处理程序  msp432_startup.ccs.c  msp432p401r.h

 现在介绍 NVIC

新方法使用

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

OLD 首选

NVIC_ISER0 |= INTISR20; // eUSCI_B0

 摘自 msp432p401r_classic.h

#define INTISR20                0x00100000 // eUSCI_B0

真正的问题是、当我运行代码时、它永远不会到达我的代码位于下面的中断例程

一直在做一个例程来初始化从器件、但很不幸、我还有一个逻辑分析仪、我可以看到起始位以及从器件地址、 然后时钟变为低电平并通过 TXing 的任何数据挂起、就像中断从未被执行并且 TXBUFFER 从未被载入一样、这是因为中断没有被处理。  

此外、我还收到了大量这些警告

说明   资源   路径   位置   类型
#2120-D 静态函数"EUSCIB0_IRQHandler"被视为 extern、因为它被引用但未定义   msp432_startup_ccs.c   /blk_sensor_version2   行45   C/C++ problem
在"C:\ti_blk_ccs6\ccsv6\ccs_base\arm\include\msp432p401r_classic.h"的第3160行中声明的"ADDMASK_M"不兼容重新定义   。ccspsproject   /blk_sensor_verion2   行13192、外部位置:ccs_base\ccs_c+\ccs_c+ ccs_ble6 r_classic.h"的第3160行中声明不兼容重新定义 msp432p401r.h    
在"C:\ti_blk_ccs6\ccsv6\ccs_base\arm\include\msp432p401r_classic.h"的第3159行中声明的宏"ADDMASK_OFS"的#48-D 不兼容重新定义   。ccsproject   /blk_sensor_ver2   行13191、外部位置:\ccs_base\ccs_ccs_cprice\ccs_ccs_ccs_cepic 6 r.h" msp432p401r.h    
#48-D 不兼容的宏"ADDRX_M"重新定义(在"C:\ti_blk_ccs6\ccsv6\ccs_base\arm\include\msp432p401r_classic.h"的第3157行声明)   。ccsproject   /blk_sensor_verion2   行13189、外部位置:ccs_base\ccs_c+\ccs_c+ ccs_cep_c\bl6 r_classic.h" msp432p401r.h    
#48-D 不兼容的宏"ADDRX_OFS"重新定义(在"C:\ti_blk_ccs6\ccsv6\ccs_base\arm\include\msp432p401r_classic.h"的第3156行声明)   。ccsproject   /blk_sensor_ver2   行13188、外部位置:\ccs_base\ccs_ccs_cprice\ccs_cepic 6 r_ccs_ccs_class.h msp432p401r.h)    
#48-D 宏"AESBLKCNT_M"的不兼容重定义(在"C:\ti_blk_ccs6\ccsv6\ccs_base\arm\include\msp432p401r_classic.h"的第1619行声明)   。ccsproject   /blk_sensor_version2   行9229、外部地址\ccs_ccs_base\ccs+\ccs_r_classic.h" msp432p401r.h    
#48-D 不兼容的宏"AESBLKCNT_OFS"重新定义(在"C:\ti_blk_ccs6\ccsv6\ccs_base\arm\include\msp432p401r_classic.h"的第1618行声明)   。ccsproject   /blk_sensor_version2   行9228、ccs_base\include\msp432p401r_classic.h" msp432p401r.h   :ccs_ccs_classic.h
#48-D 不兼容的宏"AESBLKCNT0"的重新定义(在"C:\ti_blk_ccs6\ccsv6\ccs_base\arm\include\msp432p401r_classic.h"的第1620行声明)   。ccsproject   /blk_sensor_version2   行9219、外部位置:\ccs_base\ccs_ccs_ctry.h" msp432p401r.h    
#48-D 宏"AESBLKCNT1"的不兼容重定义(在"C:\ti_blk_ccs6\ccsv6\ccs_base\arm\include\msp432p401r_classic.h"的第1621行声明)   。ccsproject   /blk_sensor_ver2   行9220、外部位置:\ccs_base\ccs_c+ ccs_cprice\ccs_cepic 6 r.h" msp432p401r.h    
#48-D 不兼容的宏"AESBLKCNT2"的重新定义(在"C:\ti_blk_ccs6\ccsv6\ccs_base\arm\include\msp432p401r_classic.h"的第1622行声明)   。ccsproject   /blk_sensor_ver2   行9221、外部位置:\ccs_base\ccs_ccs_c+ cprice\ccs_ccs_ccs_cepic 6 r.h" msp432p401r.h    

//
//
// A0 P5.5*
// A1 P5.4*
// A2 P5.3//
A3 P5.2*
// A4 P5.1*
// A5 P5.0*
// A6 P4.7*
// A7 P4.6*
// A8 P4.5*
// A9 P4.4*
// A10 P4.3*
// A11 P4.2*
// A12 P4.1*
// A13 P6.1*// A13 P4.0*


// A13 P4.0*/ A14 P6.1* A16 P9.1#
// A17 P9.0#
// A18 P8.7#
// A19 P8.6#
// A20 P8.5#
// A21 P8.4#
// A22 P8.3#
// A23 P8.2#
//

////// I2c P1.6*
// I2c

到 LCD
//P0 P3 P2 P4 P5 P6 P7
//RS R/W E X D0 D1 D2 D3 D4 D5 D6 D7
//

//

#include "MSP.h"

void LCD_init (void);


volatile UINT32_t TXData_x = 0x00;
volatile UINT32_t TXData_y = 0x00;

uint32_t TXData[64];//
uint32_t TXData_value;//

uint32_t i = 0x0000;//

void (main)


WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
P1SEL0 |= BIT6 | BIT7; // I2C 引脚 P1.6=SDA P1.7=SCL

NVIC_ICPR0 = 0xFFFFFFFF;// CLR INT
NVIC_ICPR1 = 0xFFFFFFFF;// CLR INT
NVIC_ISER0 |= INTISR20;// 1 <<(((EUSCIB0_IRQn)& 31); //在 NVIC 模块中启用 eUSCIB0中断

//将 USCI_B0配置为 I2C 模式
lcd_init();

UCB0CTLW0 |= UCSWRST;//保持 RST
UCB0CTLW0 = UCSWRST | UCTR |UCMODE_3 | UCMST | UCSYNC | UCSSEL_SMCLK;// I2C、TX、Mstr
UCB0CTLW1 |= UCASTP_1;//在字节 CTR 值后停止发送
UCB0BRW = 0x001E;//波特率= SMCLK /30

UCB0CTLW0 &=~UCSWRST;// CLR RST 保持

UCB0IE |= UCTXIE0 | UCNACKIE;//启用中断

__ENABLE_INTERRUPT ();
UCB0CTLW0 |= UCTXSTP;//发送停止并尝试重新启动
(I = 300;I > 0;I--);//终止一段时间


UCB0I2CSA = 0x27;// UCTXLW0
| UCB0T 地址 //发送启动


while (UCB0STATW 和0x0010)//检查总线是否繁忙
{
__NO_OPERATION ();//进行调试
}



void LCD_init (void)//使用 A2004 LCD 以及 PCF8574 I2C 到8位输出
{
TXData[0x00]= 0x22;//设置为4位
TXData = 0x02[0x02]; //丢弃"E"以接受数据
//现在4位为高电平然后低
电平 TXData[0x02]= 0x22;
TXData[0x03]= 0x02;
TXData[0x04]= 0x20;
TXData[0x05]= 0x00;

TXData[0x06]= 0x20; //复位显示
TXData[0x07]= 0x00;
TXData[0x08]= 0x21;
TXData[0x09]= 0x01;

TXData[0x0A]= 0xA4;// A
TXData[0x0B]= 0x84;
TXData[0x0C]= 0xA1;
TXData[0x0D]= 0x81;TXData[0x84]

= 0x08]




;TXData[0x84]= 0x08];TXData[0x08]= 0x08]= 0x08];TXData[TXData[0x84]= 0x08]= 0x84];TXData[0x08]= 0x08]= 0x08];TXData[TXData[TXData[0x84]= 0x08]= 0x08];TXData[0x08]= 0x08]= 0x08]

TXData[0x14]= 0xA3;
TXData[0x15]= 0x83;

TXData[0x16]= 0xA4;// D
TXData[0x17]= 0x84;
TXData[0x18]= 0xA4;
TXData[0x19]= 0x84;

TXData[0x1A]= 0xFFFF;// ETXData[0x1B]
= 0xFFF]



;TXData[0xFFF]= 0xFFF];TXData[0xFFF]= 0xFFFF;TXData[0x1]= 0xFFFF.FFF]= 0x1FFF]


void EUSCIB0_IRQHandler (void)//从未执行
{
if (UCB0IFG & UCTXIFG0)// TX 缓冲区为空
{
if (TXData[TXData_x]= 0xFFFF)
{
UCB0CTLW0 |= UCTXSTP;// TX A STOP 条件
__NO_OPERATION ();


}
{UCB0CTLW0+

}= UCBTXTXBUT = UCTX+缓冲区;// TXTXBUT = UCB0TXBUT = UCTX+= UCB0TXBUT = UCB0TXBUT = UCTX+
}

if (UCB0IFG 和 UCNACKIFG)//接收到 NACK
{
UCB0CTLW0 |= UCTXSTP;//发送停止并尝试重新启动
(I = 300;I > 0;I -);//终止一些时间
}



感谢您的任何帮助

此致

罗马

msp432_startup.ccs.c

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

    您使用的是哪个版本的 SimpleLink MSP432 SDK? 在 SDK 的最新版本中找不到文件"msp432_startup.ccs.c"。

    根据警告、两个头文件被称为"msp432p401r.h"和"msp432p401r_classic.h"、它们会创建冲突定义。 您应该使用 SDK 或 CCS 中的头文件。

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

    你好、Sai

    感谢您的快速响应

    msp.h -> msp432p401r.h -> msp432p401r_classic.h  他们指的是下一 个".h "文件

    "MSP.h"是指  "msp432p401r.h"

     msp.h 上的代码

    //

    // MSP432器件

    //

    #if 已定义(__MSP432P401R__)

    #include "msp432p401r.h"

    //

    //未能匹配默认包含文件

    //

    msp432p401r.h 指 msp432p401r_classic.h

    msp432p401r.h 上的代码

    //将 MSP430内在函数与 ARM 等效项重新映射

    #include "MSP_compatibility.h"

    #include "msp432p401r_classic.h"

    msp432_startup_ccs.c 的代码
    
    /*********
    //
    //版权所有(C) 2012 - 2014 Texas Instruments Incorporated - http://www.ti.com/
    //
    如果
    
    满足以下条件//、则允许以源代码和二进制形式重新分发和使用(无论是否进行//修改):
    //
    //重新分发源代码必须保留上述版权
    //声明、此条件列表和以下免责声明。
    //
    //二进制形式的再发行必须复制上述版权
    //声明、此条件列表和//
    
    分发随附的//文档和/或其他材料中的以下免责声明。
    ////
    未经
    
    事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。
    ////
    本软件由版权所有者和贡献者提供
    //“按原样”,不
    
    承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权
    //所有者或贡献者都不对任何直接、间接、偶然、
    //特殊、模范、 或相应的损害(包括但不
    限于采购替代产品或服务;丧失使用、
    //数据或利润; 或业务中断)、无论
    
    出于何种原因使用
    本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。
    //
    // MSP432系列中断向量表,用于 CGT
    //
    ////*************
    
    #include 
    
    /*默认故障处理程序的转发声明。 静态
    空 resetISR (void);
    静态空 nmiISR (void);
    静态空 FaultISR (void);
    静态空默认 ISR (void);
    
    静态空 EUSCIB0_IRQHandler (void);
    
    
    /*
    启动*/*处理器时将调用的复位处理程序的外部声明 //
    extern void _c_int00 (void);
    
    
    //标记栈顶的链接器变量。 //
    extern unsigned long __stack_end;
    
    
    //应用程序使用的中断处理程序的外部声明。 要
    
    由用户添加的*//*
    
    
    /*中断矢量表。 请注意、必须在这上面放置适当的结构、以*/
    /*确保它最终位于物理地址0x0000.0000或的开头 /*
    程序(如果位于0以外的起始地址)。 */
    #pragma DATA_SECTION (interruptVectors、".intvecs")
    void (* const interruptVectors [])(void)=
    {
    (void (*)(void)((uint32_t)&_stack_end)、
    /*初始堆栈指针*/
    resetISR、 /*重置处理程序 *
    nmiISR、 /* NMI 处理程序 *
    FAULTISR、 /*硬故障处理程序*/
    缺省 ISR, /* MPU 故障处理程序 *
    缺省 ISR, /*总线故障处理程序 *
    缺省 ISR, /*用法故障处理程序*/
    0、 /*保留 *
    0、 /*保留 *
    0、 /*保留 *
    0、 /*保留 *
    缺省 ISR, /* SVCall 处理程序 *
    缺省 ISR, /*调试监视器处理程序 *
    0、 /*保留 *
    缺省 ISR, /* PendSV 处理程序 *
    缺省 ISR, /* SysTick 处理程序 *
    缺省 ISR, /* PSS ISR *
    缺省 ISR, /* CS ISR *
    缺省 ISR, /* PCM ISR *
    缺省 ISR, /* WDT ISR *
    缺省 ISR, /* FPU ISR *
    缺省 ISR, /* FLCTL ISR *
    缺省 ISR, /* COMP0 ISR *
    缺省 ISR, /* COMP1 ISR *
    缺省 ISR, /* TA0_0 ISR *
    缺省 ISR, /* TA0_N ISR *
    缺省 ISR, /* TA1_0 ISR *
    缺省 ISR, /* TA1_N ISR *
    缺省 ISR, /* TA2_0 ISR *
    缺省 ISR, /* TA2_N ISR *
    缺省 ISR, /* TA3_0 ISR *
    缺省 ISR, /* TA3_N ISR *
    缺省 ISR, /* EUSCIA0 ISR *
    缺省 ISR, /* EUSCIA1 ISR *
    缺省 ISR, /* EUSCIA2 ISR *
    缺省 ISR, /* EUSCIA1 ISR /EUSCIB0_IRQHandler
    、 /* EUSCIB0 ISR *
    缺省 ISR, /* EUSCIB1 ISR *
    缺省 ISR, /* EUSCIB2 ISR *
    缺省 ISR, /* EUSCIB3 ISR *
    缺省 ISR, /* ADC14 ISR *
    缺省 ISR, /* T32_INT1 ISR *
    缺省 ISR, /* T32_INT2 ISR *
    缺省 ISR, /* T32_INTC ISR *
    缺省 ISR, /* AES ISR *
    缺省 ISR, /* RTC ISR *
    缺省 ISR, /* DMA_ERR ISR *
    缺省 ISR, /* DMA_INT3 ISR *
    缺省 ISR, /* DMA_INT2 ISR *
    缺省 ISR, /* DMA_INT1 ISR *
    缺省 ISR, /* DMA_INT0 ISR *
    缺省 ISR, /* Port1 ISR *
    缺省 ISR, /*端口2 ISR *
    缺省 ISR, /* PORT3 ISR *
    缺省 ISR, /* Port4 ISR *
    缺省 ISR, /* PORT5 ISR *
    缺省 ISR, /* PORT6 ISR *
    缺省 ISR, /*保留41. *
    缺省 ISR, /*保留42. *
    缺省 ISR, /*保留43. *
    缺省 ISR, /*保留44. *
    缺省 ISR, /*保留45. *
    缺省 ISR, /*保留46. *
    缺省 ISR, /*保留47. *
    缺省 ISR, /*保留48. *
    缺省 ISR, /*保留49. *
    缺省 ISR, /*保留50 *
    缺省 ISR, /*保留51. *
    缺省 ISR, /*保留52. *
    缺省 ISR, /*保留53 *
    缺省 ISR, /*保留54. *
    缺省 ISR, /*保留55 *
    缺省 ISR, /*保留56. *
    缺省 ISR, /*保留57. *
    缺省 ISR, /*保留58 *
    缺省 ISR, /*保留59. *
    缺省 ISR, /*保留60. *
    缺省 ISR, /*保留61. *
    缺省 ISR, /*保留62. *
    缺省 ISR, /*保留63. *
    缺省 ISR /*保留64 */
    };
    
    
    /*这是处理器在
    复位事件之后首次开始执行时调用的代码*/。 只执行绝对必要的设置,*/
    /*之后调用应用程序提供的 entry()例程。 任何花式的*/
    *操作(例如根据复位原因寄存
    
    器做出决策、以及*/*复位该寄存器中的位)都只能由*/*应用程序控制。 */
    void resetISR (void)
    {
    /*跳转至 CCS C 初始化例程。 *
    _asm (".global _c_int00\n"
    " _c_int00");
    }
    
    
    //这是处理器收到 NMI 时调用的代码。 这个*/
    /*只需进入一个无限循环、保持
    调试器检查*//*的系统状态。 */
    static void nmiISR (void)
    {
    /* ULP Advisor 可免除故障陷阱*/
    #pragma diag_push
    #pragma CHECK_ULP ("-2.1")
    
    /*输入无限循环。 *
    while (1)
    {
    }
    
    #pragma diag_pop
    }
    
    
    //这是处理器收到故障时调用的代码 */
    /*中断。 这只是进入一个无限循环、保持系统状态*/
    //*供调试器检查。 */
    static void faultISR (void)
    {
    /* ULP Advisor 可免除故障陷阱*/
    #pragma diag_push
    #pragma CHECK_ULP ("-2.1")
    
    /*输入无限循环。 *
    while (1)
    {
    }
    
    #pragma diag_pop
    }
    
    
    //这是当处理器收到意外的*/
    /*中断时调用的代码。 这只是进入一个无限循环、保持系统状态*/
    //*供调试器检查。 */
    static void defaultISR (void)
    {
    /* ULP Advisor 可免除故障陷阱*/
    #pragma diag_push
    #pragma CHECK_ULP ("-2.1")
    
    /*输入无限循环。 *
    while (1)
    {
    }
    
    #pragma diag_pop
    }
    

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

    1) 1)结构方法更简单、更便于移植。 例如、您只需为外设定义一个宏、将代码写入该宏、然后将宏更改为不同的外设(同级)、您的代码将用于该外设。 当您希望将代码从一个计时器重用为另一个计时器、或将一个 SPI 重用为另一个 SPI 时、此功能非常有用。

    2) 2)如果您在启动文件中看到 defaultISR、则表示您正在使用较旧的编译器->当推出 msp432时、TI 未提供具有专用矢量的启动文件。 升级您的编译器。

    3) 3)在 NVIC 上:在 CMSIS 文件中查找 NVIC_enableirq ()和 NVIC_disableirq ()。 请改用它们。

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

    发现问题。
    我的代码的第75行
    UCB0CTLW0 |= UCTXSTP;//发送停止并尝试重新启动

    即使我的启动尚未启动、也会设置该值。
    我订购并收到了一个8位逻辑分析仪。 当我查看数据时、先发送一个开始信号、然后发送地址、从器件发送一个 ACK 信号、然后在发送任何数据之前立即发送一个停止信号。

    在初始启动之前、我注释掉了代码的第75行、这可以解决问题。
    基本上、可以在启动前设置停止

    基本上、这就是发生的情况

    设置停止//使用此操作确保 I2C 总线已停止-->意识到它不以这种方式工作
    设置从机地址
    发送起始值
    加载 TXBUFF
    //主控方发送起始地址,然后发送地址等待从属方 ACK
    从器件发送 ACK
    纳斯特发送一个停止
    由于立即停止、数据未发送

    至于代码,我有大约10个 MSP432P401r (黑板,希望将我限制为 CCS 6.1.1版),因为较高版本不再支持它们。
    此外、我的学校有点旧、手册/文档指的是代码的经典版本。
    没有描述新方法的版本、仅在示例代码中、有时会有点混乱。

    感谢 Danny 和 Sai 的所有帮助
    快速响应让您的人感觉很棒。

    此致
    罗马