嵌入式作业七

对于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原理介绍:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值