Funpack第二季第二期英飞凌Tc275套件的简单运用
一、项目描述
本期是一款英飞凌的TC275 板子,配备了基于 32 位的单芯片,有三个核,频率高达200Mhz,带有4MB 闪存和 LQFP-176的 封装,是一款适用于汽车和工业应用的强大 AURIX™ 微控制器,板子带有LED灯,按键,电位器,以及各种接口, 包括了英飞凌的CAN 收发器 TLE9251VSJ 和 CAN 连接器,Arduino 连接器, Mikrobus 连接器等,自带了片上调试系统,使用英飞凌自家免费的ADS等开发软件可以直接进行调试。我这次完成了任务二,也就是设计一个呼吸灯,通过旋转板卡上的电位计,改变呼吸灯闪烁速率,同时将ADC采集的数据通过串口/CAN,发送到另一台设备上显示。用到了板子的io口,定时器延时,adc和uart串口这几个模块,首先是用stm定时器确定一个延时的参数,每隔一段时间通过翻转连接led灯的io口的输出电平改变led灯的状态,形成了呼吸灯的效果,然后ADC采集板载电位计的电压值,用得到的这个电压值改变led灯翻转的时间间隔,也就是改变了呼吸灯的闪烁频率,因为题目没有给出具体的数值,因此只是将adc转换的结果除以10,当作led灯翻转的时间间隔,最后将转换结果通过串口发送到电脑的串口调试助手显示出来。
二、各功能对应的主要代码片段及说明
1、初始化用到的模块,包括LED灯,ADC,UART,具体的初始化代码参考官方库和具体代码。
/* Initialize LEDs */
initializeLEDs();
/* Initialize VADC */
vadcBackgroundScanInit();
/* Start the background scan */
vadcBackgroundScanRun();
init_ASCLIN_UART(); /* Initialize the module */
IfxCpu_enableInterrupts(); /* Enable interrupts after initialization */
2、在while循环中,首先通过一个函数得到ADC转换的结果,然后下一个函数中,根据结果改变LED灯翻转的频率,最后就是把ADC转换的结果通过串口发送到电脑上的串口调试助手中显示出来。
while(1)
{
adc_data = Adc_GetValue();
/* Update the LEDs depending on the measured value */
indicateConversionValue();
sprintf(ch, "adc_data:%d\r\n",(int)adc_data);
Uart_SendStr(ch);
wait(ticksFor100ms);
}
blinkLED()这个函数就是实现LED按照指定间隔时间翻转的函数。
void blinkLED(uint16 led_freq)
{
IfxPort_togglePin(LED1); /* Toggle the state of the LED */
waitTime(IfxStm_getTicksFromMilliseconds(BSP_DEFAULT_TIMER, led_freq)); /* Wait 500 milliseconds */
}
indicateConversionValue(void)这个函数得到ADC的转换结果除以10,然后传递给blinkLED()这个函数,以改变LED灯闪烁的频率。ADC的值在0-4095之间,除以10,也就是0到400左右,因此LED翻转的频率大概在0-400毫秒,加上主循环中延时100毫秒,因此LED灯闪烁频率大概在2Hz-10Hz左右。
unsigned int indicateConversionValue(void)
{
//uint16 led_freq=100;
Ifx_VADC_RES conversionResult;
/* Retrieve the conversion value until valid flag of the result register is true */
do
{
conversionResult = IfxVadc_Adc_getResult(&g_vadcBackgroundScan.adcChannel);
}
while (!conversionResult.B.VF);
blinkLED(conversionResult.B.RESULT/10);
return conversionResult.B.RESULT/10;
}
Adc_GetValue(void)函数实现把ADC转换结果返回到主函数中。
uint32 Adc_GetValue(void){
Ifx_VADC_RES conversionResult;
/* Retrieve the conversion value until valid flag of the result register is true */
do
{
conversionResult = IfxVadc_Adc_getResult(&g_vadcBackgroundScan.adcChannel);
}
while (!conversionResult.B.VF);
//blinkLED(conversionResult.B.RESULT/10);
return conversionResult.B.RESULT;
}
Uart_SendStr(char* str)这个函数实现把指定参数通过串口传递给电脑,在串口调试助手中显示出来。
void Uart_SendStr(char* str){
Ifx_SizeT len = (Ifx_SizeT)strlen(str);
IfxAsclin_Asc_write(&g_ascHandle, str, &len, TIME_INFINITE); /* Transmit data via TX */
}
三、功能展示及说明
功能方面通过旋转电位计,LED灯的闪烁频率将发生变化,具体可以参照视频展示的效果。
四、对本次活动的建议
通过这次活动了解了英飞凌的车用mcu及其开发环境,感谢硬禾及得捷举办的活动。祝活动越办越好!