文章目录
前言
Infineon处理器
AURIX™系列
TC399XX-256F300S
典型应用
开发工具
参考资料
前言
见《【综述】DSP处理器芯片》
Infineon处理器
AURIX™系列,基于TriCore内核,用于汽车和工业领域。
XMC™系列,基于ARM® Cortex®-M内核,用于功率转换、工厂自动化、楼宇自控、交通和家用电器等领域。
TRAVEO™ T2G系列,基于ARM® Cortex®内核,用于媒体和互联。
PSoC™系列,基于ARM® Cortex®内核,属于嵌入式功率IC(片上系统)。
传统产品 (C500-, C166-, XC166-, AUDO1 系列),多为8 bit和16 bit,用于细分的特定领域。
AURIX™系列
AURIX™系列是AUDO™MAX的延续,其TriCore™ 内核是32 位处理器,它的架构是将微控制器的实时功能、DSP的计算算力以及RISC读写存储的高性能/价格优势结合在一个核中,非常适合安全关键型应用。
TC2xx,第一代AURIX™,多达3个TriCore1.6,65nm工艺,最高频率300MHz。
TC3xx,第二代AURIX™,多达6个TriCore1.62,40nm工艺,频率300MHz。
TC4xx(未量产),第三代AURIX™,多达6个TriCore1.8,28nm工艺(猜测),频率500MHz。
TC399XX-256F300S
TC399XX-256F300S是第二代AURIX™中性能最强悍的一款芯片,名称中各个字段的含义如下:
该芯片采用40nm工艺,频率300MHz,32bit处理器,6核(4 lock-stepped cores and 2 non lock-stepped cores),RAM 6.9M,ROM 16M,1 Gbit Ethernet,12 CAN FD。它的内部架构如下图所示:
典型应用
TC399XX-256F300S拥有丰富的外设资源、强大的数据处理能力和很高的安全可靠性,在ADAS域控、传感器融合、自动驾驶和机器学习上面都可以应用,最能体现其各方面性能的应用是在多旋翼无人机上的应用,示例如下:
无人机的多传感器输入融合,多电机驱动,和安全冗余,使用TC399或TC37x的多核架构,单片解决自动飞行、电机控制、雷达传感器、BMS和功率转换等,BOM成本和性能绝佳。示例如下:
部分代码示例如下:
#include "Ifx_Types.h"
#include "IfxCpu.h"
#include "IfxAsclin_reg.h"
#include "IfxPort_reg.h"
#include "Scu/Std/IfxScuWdt.h"
#include "Port/Std/IfxPort.h"
#include "Test_Print.h"
#include "stdarg.h"
#define USE_ASCLIN1 (STD_OFF)
#define ASCLIN0_BASE (0xF0000600U)
#define ASCLIN1_BASE (0xF0000700U)
#define ASCLIN_FLAGSCLEAR_MASK (0xFFFFFffFU)
/* Macro for Unused parameters*/
#define UNUSED_PARAMETER(VariableName) {if((VariableName) != 0U)\
{/* Do Nothing */}}
static volatile Ifx_ASCLIN *psASCLIN0;
#ifdef _TASKING_C_TRICORE_
#if (_TASKING_C_TRICORE_ == 1U)
#pragma section farbss="Shared.DEFAULT_RAM_8BIT"
#endif /* #if (_TASKING_C_TRICORE_ == 1U) */
#elif defined _GNU_C_TRICORE_
#if (_GNU_C_TRICORE_ == 1U)
#pragma section ".data.Shared.DEFAULT_RAM_8BIT" aw 1
#endif /* #if (_GNU_C_TRICORE_ == 1U) */
#elif defined _DIABDATA_C_TRICORE_
#if (_DIABDATA_C_TRICORE_ == 1U)
#pragma section DATA ".data.Shared.DEFAULT_RAM_8BIT" ".bss.Shared.DEFAULT_RAM_8BIT" far-absolute RW
#endif /* #if (_DIABDATA_C_TRICORE_ == 1U) */
#endif
char recieve_data[6] = {0};
void InitSCI(void);
void print_f(const char *p_frm, ...);
void getline(char *p_line, uint32 n_max);
void erase_line(char *p_line, uint32 *pos)
{
uint32 cnt;
for(cnt=0;cnt<*pos;cnt++)
{
*p_line = 0;
p_line++;
put_char(BACKSPACE);
put_char(' ');
put_char(BACKSPACE);
}
*pos = 0;
}
inline void delay(void)
{
volatile int i;
for (i=0;i<100;i++);
}
void put_buffer(char *p_line, uint32 n_max,const char *p_str,uint32 *pos)
{
/* uint32 cnt;
cnt = *pos; */
while(*pos < n_max && *p_str !=0)
{
*p_line = *p_str;
put_char(*p_str);
p_line++;
p_str++;
(*pos)++;
}
/* *pos = cnt; */
}
int getlineWithPos(char *p_line, uint32 n_max, uint32 *pos)
{
uint32 w_cnt;
uint32 ret_val;
int w_key;
w_cnt = *pos;
p_line += *pos;
ret_val = 0;
do
{
w_key = get_ch();
if (w_key == -1)
{
ret_val = 0;
}
else
{
if (w_key == CR || w_key == LF)
{
*p_line = 0;
ret_val = CR;
}
else
{
if (w_key == TAB)
{
*p_line = 0; /* set the value to 0 so that the first part of the string can be analyzed */
ret_val = TAB;
}
else
{
if (w_key == BACKSPACE || w_key == DEL)
{
/* backspace or delete */
if (w_cnt != 0)
{
/* delete character */
w_cnt--;
p_line--;
put_char(BACKSPACE);
put_char(' ');
put_char(BACKSPACE);
}
}
else
{
if ((w_key != CNTLQ) && (w_key != CNTLS))
{
/* normal character*/
{
/* store/reflect character */
*p_line = (char)w_key;
put_char ((char)w_key);
p_line++;
w_cnt++;
if (w_cnt == n_max)
{
/* limit reached */
(void)beep();
/* delete all characters */
while (w_cnt != 0)
{
w_cnt--;
p_line--;
put_char(BACKSPACE);
put_char(' ');
put_char(BACKSPACE);
}
}
}
}
}
}
}
}
}
while ((w_key != CR) && (w_key != LF) && (w_key != BACKSPACE) && \
(w_key != DEL) && (w_key != TAB));
*pos = w_cnt;
return(ret_val);
}
void buf_to_screen(char *text_buf)
/*~-*/
{
/*~L*/
while (*text_buf != 0)
/*~-*/
{
/*~T*/
/* send character */
put_char(*text_buf);
text_buf++;
/*~-*/
}
/*~E*/
/*~-*/
}
int core0_main (void)
{
IfxCpu_enableInterrupts();
/*
* !!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 ());
Test_InitPrint();
IfxPort_setPinMode(&MODULE_P14, 0, IfxPort_Mode_outputPushPullAlt2);
print_f("abcdef"); //--- for uart test
//getline(recieve_data, 6); //--- for uart test
while (1)
{
}
return (1);
}
开发工具
AURIX™系列芯片的软件架构、底层库、工具链,示例如下:
软件开发IDE HighTec示例如下:
参考资料
AURIX™ TC39x User Manual.pdf