一、新建工程
可参考往期推文:S32K344 VCU实战项目之带你入门篇
二、引脚配置
此实例选择CAN0进行配置。
三、外设配置
对于DMA,其采用的固定映射,对于通道0至通道15,其映射一部分外设,通道16至通道31映射一部分外设,所以对于外设要使用DMA,也需要注意此项。
添加外设:
CAN基础配置:
CAN的用户回调配置:
中断配置:
配置完毕后更新代码:
四、部分代码展示
/**
* @brief FlexCAN0中断回调函数
*
* 该函数处理FlexCAN0模块的各类事件,根据事件类型执行相应的处理逻辑。
* 主要负责接收和发送CAN消息。
*
* @param instance CAN实例号,此处固定为FlexCAN0。
* @param eventType 事件类型,指示当前中断的原因。
* @param buffIdx 接收缓冲区索引,指示接收消息所在的缓冲区。
* @param flexcanState FlexCAN状态结构体指针,包含FlexCAN模块的当前状态信息。
*/
void FlexCAN0_Callback(uint8 instance, Flexcan_Ip_EventType eventType, uint32 buffIdx,
const Flexcan_Ip_StateType *flexcanState)
{
/* 忽略参数,防止编译器警告 */
(void)flexcanState;
(void)instance;
(void)buffIdx;
/* 根据事件类型执行相应的处理逻辑 */
switch(eventType)
{
case FLEXCAN_EVENT_RX_COMPLETE:
{
txData[7] = 0;
/* 设置消息ID类型为标准ID,准备发送消息 */
tx_info.msg_id_type = FLEXCAN_MSG_ID_STD;
/* 发送消息,并从接收缓冲区读取新消息 */
FlexCAN_Ip_Send(INST_FLEXCAN_0, TX_MB_IDX, &tx_info, MSG_ID, (uint8 *)&txData);
FlexCAN_Ip_Receive(INST_FLEXCAN_0, RX_MB_IDX, &rxData, FALSE);
}break;
case FLEXCAN_EVENT_RXFIFO_COMPLETE:
{
/* RXFIFO完成事件的处理逻辑 */
}break;
case FLEXCAN_EVENT_TX_COMPLETE:
{
/* TX完成事件的处理逻辑 */
}break;
case FLEXCAN_EVENT_ENHANCED_RXFIFO_COMPLETE:
{
/* 增强型RXFIFO完成事件的处理逻辑 */
}break;
case FLEXCAN_EVENT_ENHANCED_RXFIFO_WATERMARK:
{
/* 增强型RXFIFO水位标记事件的处理逻辑 */
}break;
case FLEXCAN_EVENT_DMA_COMPLETE:
{
txData[7] = 11;
/* DMA完成事件的处理逻辑,发送消息并从FIFO读取数据 */
tx_info.msg_id_type = FLEXCAN_MSG_ID_STD;
FlexCAN_Ip_Send(INST_FLEXCAN_0, TX_MB_IDX, &tx_info, MSG_ID, (uint8 *)&txData);
FlexCAN_Ip_RxFifo(INST_FLEXCAN_0, &rxFifoData);
}break;
default:
{
/* 默认情况下,不做任何处理 */
}break;
}
}
五、注意事项
中断配置回调函数注意事项:
六、Reference
20240224【车载VCU项目简介】
20240226【车载VCU项目进度1】
20240304【车载VCU项目进度2】
20240308【车载VCU项目进度3】
20240323【车载VCU项目进度4】
20240420【车载VCU项目进度5】
20240619【车载VCU项目进度6】
20240719 【车载VCU项目进度7】20240726 【车载VCU项目进度8】