本文摘要:
本文章介绍如何使用NXP官方软件S32KDS中的lin组件(不使用LDF文件配置)
开发平台:
S32 Design Studio for ARM Version 2.2
SDK版本:
S32_SDK_S32K1xx_RTM_3.0.0
使用芯片
:S32K148
组件例程免费下载方式在文末!!!
1. 配置要使用的LIN对应的UART端口

2. 添加对应组件到工程,lin和lptmr组件
3. 配置lin(使用多条lin的就添加多个lin组件)
4. 配置lptmr定时器(lptmr组件具体应用可参考往期文章)
5. 配置好参数后点击如下图按钮或选项即可将配置数据更新至代码
6. 在代码中加入LIN初始化和lptmr初始化的代码即可使用LIN
// 系统参数 不修改
#define TIMER_COMPARE_VAL 2000
#define TIMER_TICKS_1US 4U
volatile bool wakeupSignalFlag = false;
// 超时时间 0.5ms
#define TIMEOUT (500U)
// LIN1时基计数
uint16_t lin1timerOverflowInterruptCount = 0U;
// 发送和接收缓存
uint8_t linTxBuff[8] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
uint8_t linRxBuff[8] = {0};
// LIN0回调函数
lin_callback_t lin1CallbackHandler(uint32_t instance, lin_state_t * lin1_State)
{
lin_callback_t callbackCurrent;
callbackCurrent = lin1_State->Callback;
(void)instance;
switch (lin1_State->currentEventId)
{
case LIN_PID_OK:
LIN_DRV_SetTimeoutCounter(INST_LIN1, 500);
// user handle
// LIN_DRV_MasterSendHeader()函数会进入到这里,在这里通过ID的不同进行不同的操作
if(lin1_State->currentId == 0x01)
{
// 主机写
LIN_DRV_SendFrameData(INST_LIN1, linTxBuff, sizeof(linTxBuff));
}
if(lin1_State->currentId == 0x02)
{
// 主机读
LIN_DRV_ReceiveFrameData(INST_LIN1, linRxBuff, sizeof(linRxBuff));
}
break;
case LIN_PID_ERROR: LIN_DRV_GoToSleepMode(INST_LIN1); break;
case LIN_TX_COMPLETED:
case LIN_RX_COMPLETED: LIN_DRV_GotoIdleState(INST_LIN1); break;
case LIN_CHECKSUM_ERROR:
case LIN_READBACK_ERROR:
case LIN_FRAME_ERROR:
case LIN_RECV_BREAK_FIELD_OK: LIN_DRV_SetTimeoutCounter(INST_LIN1, TIMEOUT); break;
case LIN_WAKEUP_SIGNAL: wakeupSignalFlag = true; break;
case LIN_SYNC_ERROR:
case LIN_BAUDRATE_ADJUSTED:
case LIN_NO_EVENT:
case LIN_SYNC_OK:
default: break;
}
return callbackCurrent;
}
// LIN0初始化
void lin1_Init(void)
{
LIN_DRV_Init(INST_LIN1, &lin1_InitConfig0, &lin1_State);
LIN_DRV_InstallCallback(INST_LIN1, (lin_callback_t)lin1CallbackHandler);
}
// 定时器初始化
void LPTMR0_Init(void)
{
LPTMR_DRV_Init(INST_LPTMR1, &lpTmr1_config0, false);
INT_SYS_InstallHandler(LPTMR0_IRQn, &LPTMR_ISR, (isr_t *)NULL);
INT_SYS_EnableIRQ(LPTMR0_IRQn);
LPTMR_DRV_StartCounter(INST_LPTMR1);
}
// 将此函数加入到0.5ms定时器中断 为了给LIN0提供时基
void lin1_addTIM(void)
{
LIN_DRV_TimeoutService(INST_LIN1);
timerOverflowInterruptCount++;
}
// 0.5ms定时器中断
void LPTMR_ISR(void)
{
lin1_addTIM();
LPTMR_DRV_ClearCompareFlag(INST_LPTMR1);
}
// LIN0时基回调函数,该函数名在lin配置页面有定义
uint32_t lin1TimerGetTimeIntervalCallback0(uint32_t *ns)
{
static uint32_t previousCountValue = 0UL;
uint32_t counterValue;
counterValue = LPTMR_DRV_GetCounterValueByCount(INST_LPTMR1);
*ns = ((uint32_t)(counterValue + lin1timerOverflowInterruptCount * TIMER_COMPARE_VAL - previousCountValue)) * 1000 / TIMER_TICKS_1US;
lin1timerOverflowInterruptCount = 0UL;
previousCountValue = counterValue;
return 0UL;
}
7. 使用以下函数发送帧头
// 使用该函数即可发送帧头,帧头在回调函数中会有写操作或读操作,参见上一步
LIN_DRV_MasterSendHeader(INST_LIN1, 0x01);
组件例程下载地址:
https://download.csdn.net/download/m0_50669075/85039291
S32K148更多例程和源码以及最新内容下载地址:
END
版权声明:本文为m0_50669075原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。