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 与 TM4C123GH6PM 连接以使用 UART

Guru**** 1626620 points
Other Parts Discussed in Thread: TMP007, OPT3001, TM4C123GH6PM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/904336/ccs-msp432p401r-interfacing-the-msp432p401r-with-tm4c123gh6pm-to-use-uart

器件型号:MSP432P401R
主题中讨论的其他器件: OPT3001TM4C123GH6PM

工具/软件:Code Composer Studio

你(们)好 我目前正在尝试从 MSP432P401R Launchpad 发送数据。 MSP432P401R 的代码如下所示:

//
//
//版权所有(C) 2014 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
// 重新分发源代码必须保留上述版权
// 注意、此条件列表和以下免责声明。
//
// 二进制形式的重新分发必须复制上述版权
// 注意、中的条件列表和以下免责声明
// 随提供的文档和/或其他材料
// 分布。
//
// 德州仪器公司的名称和的名称都不是
// 其贡献者可用于认可或推广衍生产品
// 未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//
// MSP432低功耗 main.c
//
//   说明:使用实施 Bosch BoosterPack 的源代码
//   MSP432P401R Launchpad 可实现低功耗。 BoosterPack 包括:
//   -带有加速计和陀螺仪的惯性测量单元(IMU)传感器
//   -磁力计
//   -带压力、环境温度和湿度的环境传感器
//   -环境光传感器
//   -红外温度传感器
//
//由 Michael Arriete 改编
//
//
#include
#include
#include
#include
#include
#include "stdio.h"
#include
#include "i2c_driver.h"
#include "demo_sysctl.h"
#include "bmi160_support.h"
#include "bme280_support.h"
#include "tmp007.h"
#include "opt3001.h"
#include "UART_DRIVER.h"
//***** 定义*****
#define CPU_FREQ           (48000000)
#define using;BOSCH;BP
#define SAMPLE_TIME_1         (53)
#define SAMPLE_TIME_2         (26)
#define SAMPLE_TIME_4         (13)
#define SAMPLE_TIME_6         (8)
#define SAMPLE_TIME_8         (6)
#define SAMPLE_TIME_10        (5)
#define NUM_AVGR_MUSS         2//x^2帧
//***** 函数原型*****
void startCrystalOscillator (void);
void setSystemClock (uint32_t CPU_Frequency);
void configureGPIO (void);
void startWakeUpTimerA (uint16_t ulClockMS);
void stopWakeUpTimerA (void);
int32_t movingAvg (int pingAvg、int16_t newValue);
//***** 全局数据*****
const uint8_t wdtWakeUpPeriod [8]={
    WDT_A_CLOCKDIVIDER_2G、
    WDT_A_CLOCKDIVIDER_128M、
    WDT_A_CLOCKDIVIDER_8192K、
    WDT_A_CLOCKDIVIDER_512K、
    WDT_A_CLOCKDIVIDER_32K、
    WDT_A_CLOCKDIVIDER_8192、
    WDT_A_CLOCKDIVIDER_512、
    WDT_A_CLOCKDIVIDER_64、
};
const uint8_t timeSamesBMI [6]={
    SAMPLE_TIME_1、   //每秒1次采样
    SAMPLE_TIME_2、   //Sample、每秒2次
    SAMPLE_TIME_4、   //每秒4次采样
    SAMPLE_TIME_6、   //Sample、每秒6次
    SAMPLE_TIME_8、   //每秒8次采样
    SAMPLE_TIME_10、   //每秒10次采样
};
const uint8_t timeSamplesBMM [6]={
    SAMPLE_TIME_1、   //每秒1次采样
    SAMPLE_TIME_2、   //Sample、每秒2次
    SAMPLE_TIME_4、   //每秒4次采样
    SAMPLE_TIME_6、   //Sample、每秒6次
    SAMPLE_TIME_8、   //每秒8次采样
    SAMPLE_TIME_10、   //每秒10次采样
};
const uint8_t timeSamplesBME [6]={
    SAMPLE_TIME_1、   //每秒1次采样
    SAMPLE_TIME_2、   //Sample、每秒2次
    SAMPLE_TIME_4、   //每秒4次采样
    SAMPLE_TIME_6、   //Sample、每秒6次
    SAMPLE_TIME_8、   //每秒8次采样
    SAMPLE_TIME_10、   //每秒10次采样
};
const uint8_t timeSamplesTMP [6]={
    SAMPLE_TIME_1、   //每秒1次采样
    SAMPLE_TIME_2、   //Sample、每秒2次
    SAMPLE_TIME_4、   //每秒4次采样
    SAMPLE_TIME_6、   //Sample、每秒6次
    SAMPLE_TIME_8、   //每秒8次采样
    SAMPLE_TIME_10、   //每秒10次采样
};
const uint8_t timeSamesOPT [6]={
    SAMPLE_TIME_1、   //每秒1次采样
    SAMPLE_TIME_2、   //Sample、每秒2次
    SAMPLE_TIME_4、   //每秒4次采样
    SAMPLE_TIME_6、   //Sample、每秒6次
    SAMPLE_TIME_8、   //每秒8次采样
    SAMPLE_TIME_10、   //每秒10次采样
};
//每个传感器的默认时间采样值
volatile uint8_t sampleTimePeriodBMI = 2;
volatile uint8_t sampleTimePeriodBMM = 5;
volatile uint8_t sampleTimePeriodBME = 0;
volatile uint8_t sampleTimePeriodTMP = 0;
volatile uint8_t sampleTimePeriodOPT=0;
//由 GUI 更改- 默认值~ 0.0156秒 1/32KHz * WDT_A_CLOCKDIVIDER_512
volatile uint8_t wdtWakeUpPeriodIndex = 6;
// BMI160/BMM150
BMI160_Return_Function_type returnValue;
结构 bmi160_gyro_t     S_gyroXYZ;
struct bmi160_accel_t    s_accelXYZ;
struct bmi160_mag_xyz_s32_t s_magcompXYZ;
// BME280  
S32返回 Rslt;
S32 g_s32传动温度  = 0;
u32 g_u32传动压力 = 0;
u32 g_u32实际湿度= 0;
// OPT3001
uint16_t RawData;
浮子  变矩器 Lux;
// TMP007
uint16_t rawTemp;
uint16_t rawObjTemp;
float  tObjTemp;
float  tObjAmb;
//计时器计数器
uint16_t WDTcount = 0;
//接收 UART 变量
#define NUM_RX_CHARs 64
char rxMsgData[NUM_RX_chars]="";
int numMsgsRx = 0;
int tempIndex = 5;
int NumChars = 0;
//校准关闭
int8_t accel_off_x;
int8_t accel_off_y;
int8_t accel_off_z;
S16 gyro_off_x;
S16 gyro_off_y;
s16 gyro_off_z;
//手势识别
int getGestures = 1;
INT 显性= 0;
uint16_t gyroAbsX、gyroAbsY、gyroAbsZ;
uint16_t deltaAccelX、deltaAccelY、deltaAccelZ;
int16_t premeAccelX = 0;
int16_t premeAccelY=0;
int16_t premeAccelZ = 0;
int16_t petGyroX = 0;
int16_t petGyroY=0;
int16_t petGyroZ = 0;
int16_t 死计数= 0;
int32_t gyroAvgX = 0.0;
int32_t gyroAvgY = 0.0;
int32_t gyroAvgZ = 0.0;
int32_t accelAvgX = 0.0;
int32_t accelAvgY = 0.0;
int32_t accelAvgZ = 0.0;
//传感器状态变量
bool BME_ON = true;
bool BMI_ON = true;
bool TMP_ON = false;
bool opt_on = true;
/*************
 功能:
 *
int main (空)
  volatile uint32_t index;
  //停止 WDT 并禁用主中断
  MAP_WDT_A_HOLDTimer();
  MAP_Interrupt_disableMaster();
  //启用 SRAM 组保持
  SYSCTl->SRAM_BANKRET |= SYSCTL_SRAM_BANKEN_BNK7_EN;
  对于(索引= 0;索引< 100;索引++);
#ifdef USE_LPM
  //配置 I/O 以最大程度地降低功耗
  configureGPIO();
  //关闭 PSS 高侧和低侧监控器以最大限度地降低功耗
  MAP_PSS_disableLowSide ();
  MAP_PSS_disableHighSide();
#endif
  //配置时钟
  startCrystalOscillator();
  setSystemClock (CPU_FREQ);
#ifdef 使用_ BOSCH _ BP
  //初始化 UART
  uartInit();
  //初始化 i2c
  initi2C();
#endif
  MAP_Interrupt_enableMaster();
#ifdef 使用_ BOSCH _ BP
  //初始化 bmi160传感器
  bmi160_initial_sensor ();
  returnRslt = bmi160_CONFIG_RUNNING_MODE (application_navigation);
  bmi160_accel_foc_trigger_xyz (0x03、0x03、0x01、&accel_off_x、&accel_off_y、 accel_off_z);
  bmi160_set_foc_gyro_enable (0x01、&gyro_off_x、&gyro_off_y、&gyro_off_z);
  //初始化 bme280传感器
  bme280_data_reading_template();
  返回 Rslt = bme280_set_power_mode (BME280_SLEEP_MODE);
  //初始化 opt3001传感器
  sensorOpt3001Init();
  //初始化 tmp007传感器
  sensorTmp007Init();
#endif
  //默认情况下保持 TMP 传感器禁用(TMP007已放电、且未组装在较新的 BoosterPack 上)
  sensorTmp007Enable (false);
  //启用 OPT 和 BME 传感器
  sensorOpt3001Enable (真);
  返回 Rslt = bme280_set_power_mode (BME280_normal_mode);
  //将 WDT 用作从 LPM3唤醒的间隔计时器
  while (1)
  {
    //停止 WDT
    MAP_WDT_A_HOLDTimer();
    MAP_WDT_A_clearTimer();
    MAP_Interrupt_disableInterrupt (INT_WDT_A);
    //如果读取/转换数据,将频率设置回全速
    if ((WDTcount%timeSamplesBME[sampleTimePeriodBME]==0)||
        (WDTcount%timeSamplesBMM[sampleTimePeriodBMM]=0)||
        (WDTcount%timeSamplesBMI[SampleTimePeriodBMI]==0)||
        (WDTcount%timeSamplesTMP[SampleTimePeriodTMP]=0)||
        (WDTcount%timeSampleOPT[sampleTimePeriodOPT]=0)||
        (WDTcount = 53))
    {
      if (getGestures)
      {
        陀螺仪 AbsX = ABS (s_gyroXYZ.x);
        陀螺仪 AbsY = ABS (s_gyroXYZ.y);
        GyroAbsZ = ABS (s_gyroXYZ.z);
        gyroAvgX = movingAvg (gyroAvgX,gyroAbsX);
        gyroAvgY=movingAvg(gyroAvgY, gyroAbsY);
        gyroAvgZ = movingAvg (gyroAvgZ、gyroAbsZ);
        if (gyroAvgX >1000 || gyroAvgY >1000 || gyroAvgZ >1000)
        {
          死计数= 0;
          如果(gyroAvgY>gyroAvgX)
          {
            如果( gyroAvgY> gyroAvgZ)
            {
              显性= 2;//gyro Y
            }
            其他
            {
              显性= 3;//gyro Z
            }
          }
          否则( gyroAvgZ>gyroAvgX )
          {
            显性= 3;//gyro Z
          }
          其他
          {
            显性= 1;//gyro X
          }
        }
        否则{
          deltaAccelX = abs (s_accelXYZ.x - deleAccelX);
          deltaAccelY = abs (s_accelXYZ.y - deleAccelY);
          deltaAccelZ = abs (s_accelXYZ.z - deleAccelZ);
          accelAvgX = movingAvg (accelAvgX、deltaAccelX);
          accelAvgY = movingAvg (accelAvgY、deltaAccelY);
          accelAvgZ = movingAvg (accelAvgZ、deltaAccelZ);
          if (accelAvgX > 100 || accelAvgY > 100 || accelAvgZ > 100)
          {
            死计数= 0;
            if ( accelAvgY> accelAvgX )
            {
              if ( accelAvgY> accelAvgZ)
              {
                显性= 5;//accel Y
              }
              其他
              {
                显性= 6;//accel Z
              }
            }
            否则( accelAvgZ> accelAvgX )
            {
              显性= 6;//accel Z
            }
            其他
            {
              显性= 4;//accel X
            }
          }
          否则{
            死计数++;
            如果(死计数>3)
            {
              显性= 0;//静态条件
            }
          }
        }
//        //contraCT GUI 的 JSON 字符串
//        snprintf (test.txString、30、
//            "{\"显性\":{\"代码\":%d}\n"、
//            显性);
//
//        //发送 UART 数据 JSON 字符串
//        sendText();
        fortAccelX = s_accelXYZ.x;
        fortaccelY = s_accelXYZ.y;
        fortaccelZ = s_accelXYZ.z;
      }
    }
    /*//Mag 更新频率
    if (WDTcount%timeSamplesBMM[sampleTimePeriodBMM]=0)
    {
      IF (BMI_ON)
      {
        //通过 BMI 读取 Mag 值(BMM)
        返回值= bmi160_bmm150_mag_compensate_xyz (&s_magcompXYZ);
        //控制 BMM 的 JSON 字符串
        snprintf (test.txString、60、
            "{\"mag\":{\"x\":%d、\"y\":%d、\"z\":%d}"、
            s_magcompXYZ.x、s_magcompXYZ.y、s_magcompXYZ.z);
        //发送 UART 数据 JSON 字符串
        sendText();
      }
    }*/
    //Accel 和 Gyro 更新频率
    /*IF (WDTcount%timeSamplesBMI[sampleTimePeriodBMI]==0)
    {
      IF (BMI_ON)
      {
        //读取加速度和陀螺值
        返回值= bmi160_read_accel_xyz (_s_accelXYZ);
        返回值= bmi160_read_gyro_xyz (&s_gyroXYZ);
        //控制 BMI 的 JSON 字符串
        snprintf (test.txString、120、
            "{\"显性\":{\"代码\":%d}、"
            "\"陀螺仪\":{\"x\":%d、\"y\":%d、\"z\":%d}、"
            "\"加速\":{\"x\":%d、\"y\":%d、\"z\":%d}\n"、
            显性、
            s_gyroXYZ.x、s_gyroXYZ.y、s_gyroXYZ.z、
            s_accelXYZ.x、s_accelXYZ.y、s_accelXYZ.z);
        //发送 UART 数据 JSON 字符串
        sendText();
      }
    }*/
    //**将需要将每个传感器分别分成各自的 IF 语句,以便 GUI 更改每个传感器的采样率
    //TMP 更新频率
    if (WDTcount%timeSamplesTMP[sampleTimePeriodTMP]=0)
    {
      IF (TMP_ON)
      {
        //读取/转换 tmp007和 opt3001数据
        sensorTmp007Read (&rawTemp、&rawObjTemp);
        //sensorTmp007Convert (rawTemp、rawObjTemp、&tObjTemp、&tObjAmb);
        //控制 TMP 的 JSON 字符串
        /*snprintf (test.txString、60、
            "{"ir_temp\":{"obj_temp\":%5.2f}}\n"、
            tObjTemp);*/
        //发送 UART 数据 JSON 字符串
        sendText();
      }
    }
    //选择更新频率
    /*if (WDTcount%timeSamplesOPT[sampleTimePeriodOPT]==0){
      if (opt_on)
      {
        //读取和转换 OPT 值
        sensorOpt3001Read (&RawData);
        sensorOpt3001Convert (RawData、&convertedLux);
        //contraCT JSON 字符串用于 opt
        snprintf (test.txString、60、
            "{\"轻\":{\" lux\":%5.2f}}\n"、
            ConvertedLux);
        //发送 UART 数据 JSON 字符串
        sendText();
      }
    }*/
    //BME 更新频率
    if (WDTcount%timeSamplesBME[sampleTimePeriodBME]==0){
      if (BME_ON)
      {
        //读取 BME 环境数据
        返回 Rslt = bme280_read_pression_tempate_hum湿度(
            &g_u32ActualPress、&g_s32ActualTemp、&g_u32ActualHumity);
        //控制 BME 的 JSON 字符串
        /*snprintf (test.txString、60、
            "{\"环境\":{\"潮湿\":%d、\"按下\":%d、\" amb_temp\":%d}\n"、
            g_u32传动湿度、g_u32传动压力、g_s32传动温度);*/
        double h =(double) g_u32实际湿度/1000;
        double t =(double) g_s32传动温度/100;
        /*uartInit();
        uartSend (char * buf、unsigned char len);*/
        //snprintf (test.txString、50、"{\"yum\":%f、\"press\":%d、\"amb_temp\":%f}\n"、h、g_u32ActualPress、 t);
        snprintf (test.txString、50、"%f"、h);
        //发送 UART 数据 JSON 字符串
        sendText();
      }
    }
    //达到最大计数时重置 WDTcount
    如果(WDTcount = 53){
      //在达到大约一秒后重置 WDT 计数器
      WDTcount = 0;
    }
    WDTcount++;
    //检查主机是否有任何消息
    if (receiveText (rxMsgData、NUM_RX_CHARs)){
      numMsgsRx++;
      NumChars = strlen (rxMsgData);
      //通过 UART 接收到的数据进行解析,并相应地更改采样率和开/关状态
      if (NumChars > 6){
        switch (rxMsgData[2]){
        用例"S": //例如{"s":10}或{"s":8}或{"s":4)、以设置10Hz、8Hz 或4Hz 的采样率
          switch (rxMsgData[3]){
          案例"I":
            tempIndex = 6;
            if (rxMsgData[tempIndex]=""){
              tempIndex = 7; //这适应已转换为字符串的值
            }
            switch (rxMsgData[tempIndex]){
            情况"0":
              SampleTimePeriodBMI = 0;
              中断;
            案例"1":
              SampleTimePeriodBMI = 1;
              中断;
            案例"2":
              SampleTimePeriodBMI = 2;
              中断;
            案例"3":
              SampleTimePeriodBMI = 3;
              中断;
            案例"4":
              SampleTimePeriodBMI = 4;
              中断;
            案例"5":
              SampleTimePeriodBMI = 5;
              中断;
            默认值:
              中断;
            }
            中断;
            案例"m":
              tempIndex = 6;
              if (rxMsgData[tempIndex]=""){
                tempIndex = 7;
              }
              switch (rxMsgData[tempIndex]){
              情况"0":
                SampleTimePeriodBMM = 0;
                中断;
              案例"1":
                SampleTimePeriodBMM = 1;
                中断;
              案例"2":
                SampleTimePeriodBMM = 2;
                中断;
              案例"3":
                SampleTimePeriodBMM = 3;
                中断;
              案例"4":
                SampleTimePeriodBMM = 4;
                中断;
              案例"5":
                SampleTimePeriodBMM = 5;
                中断;
              默认值:
                中断;
              }
              中断;
              案例"t":
                tempIndex = 6;
                if (rxMsgData[tempIndex]=""){
                  tempIndex = 7;
                }
                switch (rxMsgData[tempIndex]){
                情况"0":
                  SampleTimePeriodTMP = 0;
                  中断;
                案例"1":
                  SampleTimePeriodTMP = 1;
                  中断;
                案例"2":
                  SampleTimePeriodTMP = 2;
                  中断;
                案例"3":
                  SampleTimePeriodTMP = 3;
                  中断;
                案例"4":
                  SampleTimePeriodTMP = 4;
                  中断;
                案例"5":
                  SampleTimePeriodTMP = 5;
                  中断;
                默认值:
                  中断;
                }
                中断;
                案例"o":
                  tempIndex = 6;
                  if (rxMsgData[tempIndex]=""){
                    tempIndex = 7;
                  }
                  switch (rxMsgData[tempIndex]){
                  情况"0":
                    SampleTimePeriodOPT = 0;
                    中断;
                  案例"1":
                    SampleTimePeriodOPT = 1;
                    中断;
                  案例"2":
                    SampleTimePeriodOPT = 2;
                    中断;
                  案例"3":
                    SampleTimePeriodOPT = 3;
                    中断;
                  案例"4":
                    SampleTimePeriodOPT = 4;
                    中断;
                  案例"5":
                    SampleTimePeriodOPT = 5;
                    中断;
                  默认值:
                    中断;
                  }
                  中断;
                  案例"e":
                    tempIndex = 6;
                    if (rxMsgData[tempIndex]=""){
                      tempIndex = 7;
                    }
                    switch (rxMsgData[tempIndex]){
                    情况"0":
                      SampleTimePeriodBME = 0;
                      中断;
                    案例"1":
                      SampleTimePeriodBME = 1;
                      中断;
                    案例"2":
                      SampleTimePeriodBME = 2;
                      中断;
                    案例"3":
                      SampleTimePeriodBME = 3;
                      中断;
                    案例"4":
                      SampleTimePeriodBME = 4;
                      中断;
                    案例"5":
                      SampleTimePeriodBME = 5;
                      中断;
                    默认值:
                      中断;
                    }
                    中断;
          }
          中断;
          案例"i"://例如:{"i":0}或{"i":1}
            if (rxMsgData[5]='1'){
              returnRslt = bmi160_CONFIG_RUNNING_MODE (application_navigation);
              BMI_ON = true;
            }否则{
              returnRslt = bmi160_CONFIG_RUNNING_MODE (ACCEL_PEDOMETER);
              BMI_ON = false;
            }
            中断;
          案例"t"://例如:{"t":0}或{"t":1}
            if (rxMsgData[5]='1'){
              sensorTmp007Enable (真);
              tmp_on = true;
            }否则{
              sensorTmp007Enable (false);
              tmp_on = false;
            }
            中断;
          案例"o"://例如:{"o":0}或{"o":1}
            if (rxMsgData[5]='1'){
              sensorOpt3001Enable (真);
              opt_on = true;
            }否则{
              sensorOpt3001使能(false);
              opt_on = false;
            }
            中断;
          案例"e"://例如:{"e":0}或{"e":1}
            if (rxMsgData[5]='1'){
              返回 Rslt = bme280_set_power_mode (BME280_normal_mode);
              BME_ON = true;
            }否则{
              返回 Rslt = bme280_set_power_mode (BME280_SLEEP_MODE);
              BME_ON = false;
            }
            中断;
          案例"R":
            if (rxMsgData[5]='1'){
              getGestures = 1;
            }否则{
              getGestures = 0;
              显性= 0;
            }
            中断;
        }
      }
    }
    //配置 WDT
    //对于 LPM3时钟源应为 BCLK 或 VLOCLK
    MAP_WDT_A_initIntervalTimer (WDT_A_CLOCKSOURCE_BCLK/* WDT_A_CLOCKSOURCE_ACLK*、
        wdtWakeUpPeriod[wdtWakeUpPeriodIndex]);
    MAP_Interrupt_enableInterrupt (INT_WDT_A);
    //启动 WDT
    MAP_WDT_A_startTimer();
    //Go 至 LPM0 (无法使用 LPM3、因为我们无法准确接收 UART 数据)
    MAP_PCM_gotoLPM0 ();
  }
/*************
 功能:
  用作简单的移动平均器。 用于手势识别。
 *
int32_t movingAvg (int pingAvg、int16_t newValue)
  返回((((foreAvg << NUM_AVGR_MUSS)+ newValue - foreAvg)>> NUM_AVGR_MUSS);
/*************
 功能:
  以下函数负责在中启动 XT1
  MSP432、用于为驱动的内部 FLL 提供源
  MCLK 和 SMCLK。
 *
void startCrystal振 荡器(void)
  /*为外设/晶振 HFXT*/配置引脚
  MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、
      GPIO_PIN3 | GPIO_PIN4、GPIO_PRIMARY_MODULE_FUNCTION);
  /*为外设/晶振 LFXT*/配置引脚
  MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、
      GPIO_PIN0 | GPIO_PIN1、GPIO_PRIMARY_MODULE_FUNCTION);
/*************
 功能:
  以下函数负责设置系统
  时钟的频率下运行。
 *
空 setSystemClock (uint32_t CPU_Frequency)
  /*设置外部时钟频率。 此 API 是可选的、但会是可选的
  *如果用户想使用 getMCLK/getACLK/etc、就来方便
  函数
  *
  MAP_CS_setExternalClockSourceFrequency (32768、CPU_Frequency);
  MAP_CS_setReferenceOscillatorFrequency (CS_REFO_32kHz);
  /*在开始之前,我们必须将 VCORE 更改为1以支持24MHz 频率*/
  MAP_PCM_setCoreVoltageLevel (PCM_AM_LDO_VCORE0);
  MAP_FlashCtl_setWaitState (FLASH_BANK0、1);
  MAP_FlashCtl_setWaitState (FLASH_BANK1、1);
  /*在无超时的非旁路模式下启动 HFXT 和 LFXT。 *
  MAP_CS_startHFXT (false);
  MAP_CS_startLFXT (false);
  /*按如下方式初始化时钟源:
  *   MCLK = HFXT/2 = 24MHz
  *   ACLK = LFXT = 32KHz
  *   HSMCLK = HFXT/4 = 6MHz
  *   SMCLK = HFXT/2 = 12MHz
  *   BCLK = REFO = 32kHz
  *
  MAP_CS_initClockSignal (CS_MCLK、CS_HFXTCLK_SELECT、CS_CLOCK_DEVIDER_2);
  MAP_CS_initClockSignal (CS_ACLK、CS_LFXTCLK_SELECT、CS_CLOCK_DEVIDER_1);
  MAP_CS_initClockSignal (CS_HSMCLK、CS_HFXTCLK_SELECT、CS_CLOCK_DEVIDER_8);
  MAP_CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_SELECT、CS_CLOCK_DEVIDER_4);
  MAP_CS_initClockSignal (CS_BCLK、CS_REFOCLK_SELECT、CS_CLOCK_DEVIDER_1);
/*************
 功能:
 *
void configureGPIO (void)
  /*配置 I/O 以在进入睡眠前最大限度地降低功耗*/
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、PIN_All8);
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、PIN_All8);
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P3、PIN_All8);
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P4、PIN_All8);
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P5、PIN_All8);
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P6、PIN_All8);
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P7、PIN_All8);
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P8、PIN_All8);
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P9、PIN_All8);
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P10、PIN_All8);
  MAP_GPIO_setOutputLowOnPin (GPIO_PORT_PJ、GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3);
  MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、PIN_All8);
  MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、PIN_All8);
  MAP_GPIO_setAsOutputPin (GPIO_PORT_P3、(PIN_All8和~GPIO_PIN6));
  MAP_GPIO_setAsOutputPin (GPIO_PORT_P4、(PIN_All8和~(GPIO_PIN1 | GPIO_PIN6)));
  MAP_GPIO_setAsOutputPin (GPIO_PORT_P5、(PIN_All8和~(GPIO_PIN0 | GPIO_PIN2)));
  MAP_GPIO_setAsOutputPin (GPIO_PORT_P6、(PIN_All8和~GPIO_PIN7));
  MAP_GPIO_setAsOutputPin (GPIO_PORT_P7、PIN_All8);
  MAP_GPIO_setAsOutputPin (GPIO_PORT_P8、PIN_All8);
  MAP_GPIO_setAsOutputPin (GPIO_PORT_P9、PIN_All8);
  MAP_GPIO_setAsOutputPin (GPIO_PORT_P10、PIN_All8);
  MAP_GPIO_setAsOutputPin (GPIO_PORT_PJ、GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3);
/*************
 功能:
 *
void startWakeUpTimerA (uint16_t ulClockMS)
  ulClockMS =(ulClockMS * 32768)/1000;
  /* TimerA 上行模式配置参数*/
  Timer_A_UpModeConfig upConfig =
  {
      Timer_A_CLOCKSOURCE_ACLK、        // ACLK 时钟源
      Timer_A_CLOCKSOURCE_divider _1、      // ACLK/1 = 32KHz
      ulClockMS、                //节拍周期
      Timer_A_TAIE_INTERRUPT_DISABLE、     //禁用计时器中断
      Timer_A_CCIE_CCR0_INTERRUPT_ENABLE,  //启用 CCR0中断
      Timer_A_skip_clear            //清除值
  };
  MAP_Timer_A_configureUpMode (TIMER_A0_BASE、&upConfig);
  MAP_Timer_A_enableCaptureCompareInterrupt (TIMER_A0_BASE、
      Timer_A_CAPTURECOMPARE 寄存器_0);
  MAP_Interrupt_enableInterrupt (INT_TA0_0);
  MAP_Timer_A_startCounter (TIMER_A0_BASE、TIMER_A_UP_MODE);
/*************
 功能:
 *
void stopWakeUpTimerA (空)
  MAP_Interrupt_disableInterrupt (INT_TA0_0);
  MAP_Timer_A_stopTimer (TIMER_A0_BASE);
/*************
 函数:TA0_0_IRQHandler
 *
void TA0_0_IRQHandler (void)
  MAP_Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、
      Timer_A_CAPTURECOMPARE 寄存器_0);
#ifdef USE_LPM
  MAP_Interrupt_disableSlepOnIsrExit();
#endif
/*************
 函数:WDT_A_IRQHandler
 *
void WDT_A_IRQHandler (void)
  //MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);
  //从 LMP3唤醒会将我们带到 PCM_AM_LDO_VCORE0、而不是 PCM_AM_LF_VCORE0
// map_PCM_setPowerState (PCM_AM_LDO_VCORE0);
//  map_PCM_setCoreVoltageLevel (PCM_AM_DCDC_VCORE0);
#ifdef USE_LPM    
  MAP_Interrupt_disableSlepOnIsrExit();
#endif    
/*************
 函数:Port1_IRQHandler
 *
空 Port1_IRQHandler (空)
  uint32_t 去抖;
  uint32_t status;
  MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);
  STATUS = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
  IF (STATUS & GPIO_PIN1)
  {
  }
  /*开关去抖延迟*/
  for (去抖= 0;去抖< 10000;去抖++)
    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);
#ifdef USE_LPM    
  MAP_Interrupt_disableSlepOnIsrExit();
#endif
/*************
 函数:PORT5_IRQHandler
 *
void PORT5_IRQHandler (void)
  uint32_t status;
  STATUS = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P5);
  MAP_GPIO_DisableInterrupt (GPIO_PORT_P5、GPIO_PIN2);
  MAP_Interrupt_disableInterrupt (INT_PORT5);
  IF (STATUS & GPIO_PIN2)
  {
  }
  /*开关去抖延迟*/
  MAP_GPIO_clearInterruptFlag (GPIO_PORT_P5、状态);
#ifdef USE_LPM
  MAP_Interrupt_disableSlepOnIsrExit();
#endif
/*************
 函数:_system_pre_init
 *
int _system_pre_init (void)
  //停止 WDT
  MAP_WDT_A_HOLDTimer();             //保持看门狗计时器
  //执行 C/C++全局数据初始化
  返回1;
我尝试将 TM4C123GH6PM Launchpad 与 MSP432P401R 连接、如下所示:
我希望这样做、以便 TM4C123GH6PM 接收 MSP432P401R 发送的数据。 换言之、我希望使 MSP432P401R 成为发送器/主器件、而 TM4C123GH6PM 是接收器/从器件。 我已经尝试过各种尝试、但到目前为止还没有成功。 我希望有人能帮助我将 TM4C123GH6PM 与 MSP432P401R 相连接。 谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sapphire、

    如果希望在两个不同的微控制器之间建立 UART 通信、我建议您从每个平台上的简单 UART 示例开始。 测试与运行 UART 终端程序(如"超级终端")的 PC 之间的通信。  一旦两个平台与 PC 进行独立通信、就应该能够将 TX 连接到一个平台的 RX、将 RX 连接到另一个平台的 TX、并在平台之间进行通信。   

    BR、
    Leo

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

    您好、Sapphire、


    我最近没有看到响应、因此将关闭此主题。 请告诉我、您是否能够使用上述方法进行操作。

    BR、
    Leo