对于can的驱动函数文件加注释。在can(加注释).c中标了“//2024.6”的语句加以理解并写出注释。放入博客中。
结果截图、连线照片、实验原理图和CAN原理介绍。
1、can(加注释).c注释内容:
CANMode = CAN_MODE_NORMAL;
//设置CAN模式为正常模式。
if(DestID > 0x1FFFFFFFU) return 1;
//检查目标ID是否超出了允许的最大值,如果是,则返回1。
if(can_send_once(canNo,DestID,send_length,buff+len-i) == 1)
//尝试发送CAN数据帧,如果发送函数返回1,则退出循环并返回错误。
if ((CAN_ARR[canNo-1]->RF0R & CAN_RF0R_FMP0) == 0U)
//检查CAN接收FIFO0是否有消息。
len = (CAN_RDT0R_DLC & CAN_ARR[canNo-1]->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; //从接收到的数据帧中获取数据长度。
SET_BIT(CAN_ARR[canNo-1]->IER, CAN_IER_FMPIE0);
//CAN接收中断。
NVIC_EnableIRQ(table_irq_can[Can_Rx_FifoNo]);
//NVIC中断控制器中的CAN接收中断。
transmit_mailbox = (register_tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos;
//计算并获取CAN发送邮箱的代码位置。
CAN_ARR[canNo-1]->sTxMailBox[transmit_mailbox].TIR=((DestID<< CAN_TI0R_STID_Pos)|CAN_ID_STD|rtr);
//设置CAN传输邮箱的标识寄存器
RCC->APB1ENR1 |= RCC_APB1ENR1_CAN1EN;
//使能CAN1的时钟
GPIOA->MODER |= (GPIO_MODER_MODE11_1|GPIO_MODER_MODE12_1);
//配置GPIOA的11和12引脚为CAN1的RX和TX
CLEAR_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_SLEEP);
//清除CAN_MCR寄存器中的SLEEP位,以退出CAN的睡眠模式
SET_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_INRQ);
//设置CAN_MCR寄存器中的INRQ位,请求进入CAN的初始化模式
CLEAR_BIT(CAN_ARR[canNo-1]->MCR, CAN_MCR_INRQ);
//清除CAN_MCR寄存器中的INRQ位,退出CAN的初始化模式
CAN_ARR[canNo-1]->BTR|=((uint32_t)(Prescaler-1)|CAN_SJW_1TQ|CAN_BTR_TS1_1|CAN_BTR_TS1_0|CAN_BTR_TS2_2|CANMode);
//设置CAN位时序寄存器,配置CAN的位时序参数
SET_BIT(CAN_ARR[canNo-1]->FMR, CAN_FMR_FINIT);
//设置CAN_FMR寄存器中的FINIT位,进入过滤器初始化模式
if(CanID <= 0x7FFU) CanID = CanID << CAN_TI0R_STID_Pos;
//如果CanID的值小于或等于0x7FF,将其左移至CAN_TI0R_STID_Pos
FilterIdHigh = (CanID >> 16) & 0xFFFF;
//存储CanID的高16位
FilterIdLow = (CanID & 0xFFFF);
//存储CanID的低16位
FilterMaskIdHigh = 0xFFE0; //设高16位11111110
FilterMaskIdLow = 0x0000; //低16位00000000
filternbrbitpos = (uint32_t)1 << (FilterBank & 0x1FU); //将1左移FilterBank的值来得到对应的位位置,FilterBank的值与0x1F(即0x1FU)做AND操作
SET_BIT(CAN_ARR[canNo-1]->FMR, CAN_FMR_FINIT); //将CAN控制器的过滤器配置为初始化模式(FINIT=1)
CLEAR_BIT(CAN_ARR[canNo-1]->FA1R, filternbrbitpos); //清除FA1R寄存器
CLEAR_BIT(CAN_ARR[canNo-1]->FA1R, filternbrbitpos);
//清除CAN_FA1R寄存器中对应的位,取消选择过滤器
SET_BIT(CAN_ARR[canNo-1]->FS1R, filternbrbitpos);
//设置CAN_FS1R寄存器中对应的位,选择16位过滤器尺寸
CLEAR_BIT(CAN_ARR[canNo-1]->FM1R, filternbrbitpos);
//清除CAN_FM1R寄存器中对应的位,设置过滤器模式为IDMASK模式
CLEAR_BIT(CAN_ARR[canNo-1]->FFA1R, filternbrbitpos);
//清除CAN_FFA1R寄存器中对应的位,将过滤器关联到FIFO0
SET_BIT(CAN_ARR[canNo-1]->FA1R, filternbrbitpos);
//设置CAN_FA1R寄存器中对应的位,激活过滤器
CLEAR_BIT(CAN_ARR[canNo-1]->FMR, CAN_FMR_FINIT);
//清除CAN_FMR寄存器中的FINIT位,退出过滤器初始化模式(FINIT=0)
2、结果截图:
连线图:
实验原理图和CAN原理介绍: