请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP432P401R 主题中讨论的其他器件: OPT3001、 TM4C123GH6PM
工具/软件: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 相连接。 谢谢你。