tc275单片机的内核_TC275开发板学习心得(一)

1、刚拿到TC27T开发板时,是比较兴奋的,开发板是一块红色的正方形板卡,板子布局简洁干净。感觉板卡上遗憾的地方,按键和指示灯放在了板卡背面,给操作和指示带来些不便,还有板卡上封装丝印没有明显印在板卡上,在扩展外部接口连接时要特别小心,不然很容易弄错脚位,给调试带来麻烦,甚至把板卡弄坏,所以接下来要先认真仔细地看开发板的介绍资料。

接着简单熟悉开发板使用说明文档,开发板上的资源,包括各个器件资料,特别是主芯片TC275相关。TC27T开发板主要包括以下功能:

1)英飞凌TC275T 32位多核控制器,包含三个核,其中两个TriCore 1.6P核(一个带锁步核)和一个TriCore1.6E 核(带锁步核),三核主频200Mhz,编程FLASH 4MB,内嵌HSM,芯片功能安全可以达到ASIL-D;

2)电源模块。包括主电源芯片TLE7368-3E及组件,给系统和其他模块提供5V和3.3V电压,另MCU内部电源转换产生1.3V核电压;

3)USB MiniWiggler JDS 调试接口;

4)CAN通信模块,包括CAN收发器和扩展连接器;

5)LIN通信模块,包括LIN收发器和宽展连接器;

6)蜂鸣器及驱动电路;

7)GPIO和ADC扩展接口;

8)按键输入模块;

9)LED指示模块;

10)JTAG扩展接口;

11)DAP调试扩展接口;

12)普通以太网接口,包含千兆PHY芯片和RJ45连接器。

这次申请的DEMO学习演示主要会用到TC275的USB MiniWiggler JDS调试模块,GPIO和ADC,CAN通信,按键,LED和蜂鸣器等,实现了环境温湿度信息采集,状态监控,报警及信息上报等功能。

2、部分代码简单介绍如下:

基于英飞凌iLLD库进行集成,主要用到的模块和函数介绍如下。

1)  GPIO模块

//存储引脚电平状态

boolean IfxPort_getPinStateDio[5];

void Dio_init_input(void)

{

// 配置热释电1信号采集引脚P2.6为输入,上拉

IfxPort_setPinMode(&MODULE_P02,6,IfxPort_Mode_inputPullUp); //X103连接器  PIN_19

}

void Dio_init_output(void)

{

// 配置蜂鸣器驱动引脚P33.0为输出,上拉

IfxPort_setPinMode(&MODULE_P33,0,  IfxPort_Mode_outputPushPullGeneral);

IfxPort_setPinHigh(&MODULE_P33,0);  //默认禁能

// 配置监控主机驱动控制引脚P14.9为输出,上拉

IfxPort_setPinMode(&MODULE_P14,9, IfxPort_Mode_outputPushPullGeneral);

IfxPort_setPinLow(&MODULE_P14,9);//默认禁能

}

void DIO_State_Read(void)

{

//读取热释电1信号

IfxPort_getPinStateDio[0] = IfxPort_getPinState(&MODULE_P02, 6);

}

2)  LED模块介绍

void GPIO_Led_init(void)

{

// configure P33.8 as general output

IfxPort_setPinMode(&MODULE_P33,8, IfxPort_Mode_outputPushPullGeneral);

// configure P33.9 as general output

IfxPort_setPinMode(&MODULE_P33,9,  IfxPort_Mode_outputPushPullGeneral);

// configure P33.10 as general output

IfxPort_setPinMode(&MODULE_P33,10, IfxPort_Mode_outputPushPullGeneral);

// configure P33.11 as general output

IfxPort_setPinMode(&MODULE_P33, 11,  IfxPort_Mode_outputPushPullGeneral);

}

void GPIO_Led(void)

{

IfxPort_togglePin(&MODULE_P33, 8);

IfxStm_waitTicks(&MODULE_STM0, 5000000);

IfxPort_togglePin(&MODULE_P33, 9);

IfxStm_waitTicks(&MODULE_STM0, 5000000);

IfxPort_togglePin(&MODULE_P33, 10);

IfxStm_waitTicks(&MODULE_STM0, 5000000);

IfxPort_togglePin(&MODULE_P33, 11);

IfxStm_waitTicks(&MODULE_STM0, 5000000);

}

3)  蜂鸣器模块

//蜂鸣器报警

void Beep_On(void)

{

int i;

for(i=0;i<10000;i++)

{

IfxPort_setPinLow(&MODULE_P33,0);

IfxStm_waitTicks(&MODULE_STM0, 50000);

IfxPort_setPinHigh(&MODULE_P33,0);

IfxStm_waitTicks(&MODULE_STM0, 50000);

IfxPort_setPinLow(&MODULE_P33,0);

IfxStm_waitTicks(&MODULE_STM0, 50000);

IfxPort_setPinHigh(&MODULE_P33,0);

IfxStm_waitTicks(&MODULE_STM0, 50000);

}

}

//蜂鸣器报警禁能

void Beep_Off(void)

{

IfxPort_setPinHigh(&MODULE_P33,0);

}

4)  CAN通信模块

//定义全局变量

IfxMultican_Message txMsg;

uint32 dataLow = 0x03020100;

uint32 dataHigh = 0x07060504;

const unsigned id=0xcf00203;//定义扩展ID

extern  uint32 dataLow;

extern uint32 dataHigh;

extern IfxMultican_Message txMsg;

//CAN handle

IfxMultican_Can can;//指向全CAN的模块地址

//Nodes handles

IfxMultican_Can_Node canSrcNode;//指向节点寄存器地址

//Message Object handles

IfxMultican_Can_MsgObj canSrcMsgObj;//指向消息体寄存器地址

//通道、节点、报文的初始化

void CAN_Init(void)

{

//CAN模块初始化 //CAN配置结构体

IfxMultican_Can_Config canConfig;

IfxMultican_Can_initModuleConfig(&canConfig, &MODULE_CAN);

IfxMultican_Can_initModule(&can, &canConfig);

//CAN节点初始化//CAN节点配置结构体

IfxMultican_Can_NodeConfig canNodeConfig;

IfxMultican_Can_Node_initConfig(&canNodeConfig, &can);

canNodeConfig.baudrate = 1000000;//波特率设为1M

//CAN源节点

{

canNodeConfig.nodeId = IfxMultican_NodeId_0;

canNodeConfig.rxPin =&IfxMultican_RXD0B_P20_7_IN;//P20.7作为输入引脚

canNodeConfig.rxPinMode = IfxPort_InputMode_pullUp;

canNodeConfig.txPin = &IfxMultican_TXD0_P20_8_OUT;//P20.8作为输出引脚

canNodeConfig.txPinMode = IfxPort_OutputMode_pushPull;

// 源节点初始化

IfxMultican_Can_Node_init(&canSrcNode,&canNodeConfig);

}

//Message Object Initialisation

{

//    创建报文对象配置

IfxMultican_Can_MsgObjConfig canMsgObjConfig;

IfxMultican_Can_MsgObj_initConfig(&canMsgObjConfig, &canSrcNode);

//    分配报文对象

canMsgObjConfig.msgObjId = 0;

canMsgObjConfig.messageId = id;//消息ID

canMsgObjConfig.acceptanceMask =0x7FFFFFFFUL;

canMsgObjConfig.frame = IfxMultican_Frame_transmit;

canMsgObjConfig.control.messageLen=IfxMultican_DataLengthCode_8;//数据长度

canMsgObjConfig.control.extendedFrame = TRUE;//扩展帧帧格式

canMsgObjConfig.control.matchingId = TRUE;//匹配ID

//      初始化报文对象

IfxMultican_Can_MsgObj_init(&canSrcMsgObj, &canMsgObjConfig);

}

}

//上面已经把通道 、节点、报文配置好了,下面开始收发

void CAN_Trannsfer(void)

{

//全CAN报文初始化

IfxMultican_Message_init(&txMsg,id,dataLow,dataHigh, IfxMultican_DataLengthCode_8);//数据的高低位,低位在前,高位在后

//发送数据

while(IfxMultican_Can_MsgObj_sendMessage(&canSrcMsgObj, &txMsg)==IfxMultican_Status_notSentBusy);

}

5)  ADC采集模块

// VADC模块

IfxVadc_Adc vadc;

// VDC 组//选择ADC0转换器

IfxVadc_Adc_Group adcGroup[1];

// VDC 通道//选择AN0和AN1分别作为温度和湿度传感器输入通道

IfxVadc_Adc_Channel adcChannel[1][2];

// 存储转换结果

uint16  ADC_result[1][2];

void ADC_init(void)

{

int chnIx;

// 创建配置变量

IfxVadc_Adc_Config adcConfig;

IfxVadc_Adc_initModuleConfig(&adcConfig, &MODULE_VADC);

//初始化ADC模块全局参数,采样周期和结果精度

IfxVadc_Adc_initModule(&vadc, &adcConfig);

// 创建组配置变量

IfxVadc_Adc_GroupConfig adcGroupConfig;

IfxVadc_Adc_initGroupConfig(&adcGroupConfig, &vadc);

//初始化Convertor0的 AN0和AN1通道

int group_i = 0;

for(group_i = 0; group_i<1;group_i++)

{

// 定义组ID

adcGroupConfig.groupId = group_i;

// 设置Master ID为自己的ID,即自己作为Master

adcGroupConfig.master = adcGroupConfig.groupId;

// 使能队列中断源

adcGroupConfig.arbiter.requestSlotQueueEnabled = TRUE;

// 使能扫描中断源

adcGroupConfig.arbiter.requestSlotScanEnabled = TRUE;

// 使能后台中断源

adcGroupConfig.arbiter.requestSlotBackgroundScanEnabled = TRUE;

//使能所有源的门

adcGroupConfig.queueRequest.triggerConfig.gatingMode         = IfxVadc_GatingMode_always;

adcGroupConfig.scanRequest.triggerConfig.gatingMode           = IfxVadc_GatingMode_always;

adcGroupConfig.backgroundScanRequest.triggerConfig.gatingMode = IfxVadc_GatingMode_always;

// 初始化组配置

IfxVadc_Adc_initGroup(&adcGroup[group_i], &adcGroupConfig);

// 创建通道配置变量

IfxVadc_Adc_ChannelConfig adcChannelConfig[2];

for(chnIx=0; chnIx<2; ++chnIx)

{

IfxVadc_Adc_initChannelConfig(&adcChannelConfig[chnIx], &adcGroup[group_i]);

//配置通道ID

adcChannelConfig[chnIx].channelId = (IfxVadc_ChannelId)(chnIx);

//配置通道结果寄存器,采用专用结果寄存器

adcChannelConfig[chnIx].resultRegister = (IfxVadc_ChannelResult)(chnIx);

// 初始化通道

IfxVadc_Adc_initChannel(&adcChannel[group_i][chnIx], &adcChannelConfig[chnIx]);

//添加到扫描源

unsigned channels = (1 << adcChannelConfig[chnIx].channelId);

unsigned mask = channels;

boolean continuous = TRUE;

IfxVadc_Adc_setScan(&adcGroup[group_i],channels,mask, continuous);

}

}

}

void ADC_Scan(void)

{

int group_m;

unsigned char chnIx;

Ifx_VADC_RES conversionResult;

for (group_m = 0; group_m < 1; group_m++)

{

// 开启自动扫描

IfxVadc_Adc_startScan(&adcGroup[group_m]);

// 判断转换结果是否 有效,然后读取转换结果

for (chnIx = 0; chnIx < 2; ++chnIx)

{

// wait for valid result

//Ifx_VADC_RES conversionResult;

do {

conversionResult = IfxVadc_Adc_getResult(

&adcChannel[group_m][chnIx]);

} while (!conversionResult.B.VF);

ADC_result[group_m][chnIx] = conversionResult.B.RESULT;

}

}

}

6)  MAIN主程序

int core0_main (void)

{

//使能中断

__enable ();

//看门狗禁能

/*

* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!

* Enable the watchdog in the demo if it is required and also service the watchdog periodically

* */

IfxScuWdt_disableCpuWatchdog (IfxScuWdt_getCpuWatchdogPassword ());

IfxScuWdt_disableSafetyWatchdog (IfxScuWdt_getSafetyWatchdogPassword ());

//变量初始化

dataLow = 0x0;

dataHigh = 0x0;

//模块初始化

GPIO_Led_init();

CAN_Init();

ADC_init();

Dio_init_input();

Dio_init_output();

while (1)

{

//LED点亮

GPIO_Led();

//ADC模块扫描

ADC_Scan();

//查询读取IO状态

DIO_State_Read();

//热释电传感器模块采集到人红外信号有效

if(IfxPort_getPinStateDio[0]==0)

{

//打开摄像头主机开始录像

Camera_On();

dataLow = 0xeeeeeeee;

dataHigh = 0xeeeeeeee;

//上报有人异常信息

CAN_Trannsfer();

//蜂鸣器报警

Beep_On();

}

//热释电传感器模块没采集到人红外信号

else

{

//关闭摄像头主机

Camera_Off();

//蜂鸣器不报警

Beep_Off();

//上报温湿度信息

dataLow =  (uint32)ADC_result[0][0];

dataHigh = (uint32)ADC_result[0][1];

CAN_Trannsfer();

}

}

return (1);

}

3、遇到的问题与对策

开发集成工具Hightec安装,工程项目搭建和调试中遇到的问题。

AURIX开发集成环境熟悉,包括Framework基本软件架构,开发工具使用,调试仿真环境熟悉。首先完成点灯例程的实现工程编辑,编译,调试配置,下载,运行等基本开发步骤,如果顺利运行,会看到板卡背面的四颗LED交替闪烁,初步验证了板卡是完好的。因为英飞凌这套新的环境,之前没有接触过,所以这期间工具安装,环境参数设置及后续工程中编译排查报错等问题折腾了一阵子。如Hightec编译器工具链配置编译CfgCompiler_xxx.MK文件路径和实际安装路径不一致,就得去修改为实际的安装路径;如编译器默认的没有选择GNUC,就要去工具链编译配置ConfigPrjMK文件中去选择GNUC;如编译过程中出现无法找到文件的错误,就得去设置窗口菜单Include Paths中去设置添加需要增加的相关文件包含路径。

在调试GPIO采集热释电信号时发现采集不到正确的信号,经过排查P2.6引脚,测量热释电模块输出有效信号引脚电压高电平时为3.3V电平,这个电平给到P2.6端口,因为TC275开发板上默认的为5V电平,所以TC275不能正确采集信号输入,经过3.3V和5V电平转换电路后就可以正确采集输入。

在调试ADC模块采集温湿度外界变化信息时,经过单步跟踪仿真运行发现采集到的结果值没有变化,经过排查温湿度模块输出连接TC275板卡时,连接AN0,AN1引脚有误,

板卡丝印没标很容易把X103和X102整错,经重新连接到正确的AN0和AN1引脚,采集后的数据经过计算其结果和实际比较符合。当然还有其它调试中遇到的问题就不一一列举了。

4、DEMO简单介绍

本DEMO以TC275T开发板为控制核心,扩展输入采集板部分包括:热释电红外传感器模块SR602及其电平转换电路,温湿度传感器模块AM1011及其采集辅助电路。输出部分一是可以通过CAN 分析仪CANalyst-II将采集处理后的信息数据上报到PC端。二是可以控制视频主机系统完成监控记录功能,主机系统包括:视频监控控制板及电路、视频监控主机和多路摄像头,三是控制蜂鸣器报警。

整个DEMO实物如下:

你可能感兴趣的:(tc275单片机的内核)