完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
使用的是基于芯片AT32F403ACCT7创建的RTT项目,用的can_sample例程,发现在控制台发送can_sample后控制台就会卡住
Debug发现是卡在了_can_sendmsg中的发送判断里
然后发现循环中i的值很奇怪
应该是从0开始计数到ffff就会结束,但这里它的初值直接就是超过ffff的,导致程序一直卡在这里,是被哪里改掉的呢,整个项目只使能了can,修改了外部时钟,加入了can_sample例程,其余未有改动 |
|
相关推荐
5个回答
|
|
|
CAN通信是基于硬件连接的,如果没有接CAN设备,那发送时是会卡死在这里的。
|
|
|
|
|
|
但是i计数到0xffff就会跳出这个循环吧,我看到i直接变成了一个大于0xffff的值,注意是第一次执行到这个循环的时候就是了,并不是从0开始计数的
|
|
|
|
|
|
static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num)
{ struct CAN_Handler *hcan; hcan = &((struct at32_can *) can->parent.user_data)->CanConfig; struct rt_can_msg *pmsg = (struct rt_can_msg *) buf; CanTxMsg TxMessage; rt_uint32_t i; /* Check the parameters */ RT_ASSERT(IS_CAN_DLC(pmsg->len)); /*check select mailbox is empty */ switch (1 << box_num) { case CAN_TX_MAILBOX0: if ((hcan->Instance->TSTS & CAN_TSTS_TSME0) != CAN_TSTS_TSME0) { /* Return function status */ return -RT_ERROR; } break; case CAN_TX_MAILBOX1: if ((hcan->Instance->TSTS & CAN_TSTS_TSME1) != CAN_TSTS_TSME1) { /* Return function status */ return -RT_ERROR; } break; case CAN_TX_MAILBOX2: if ((hcan->Instance->TSTS & CAN_TSTS_TSME2) != CAN_TSTS_TSME2) { /* Return function status */ return -RT_ERROR; } break; default: RT_ASSERT(0); break; } if (RT_CAN_STDID == pmsg->ide) { TxMessage.IDT = CAN_ID_STD; RT_ASSERT(IS_CAN_STDID(pmsg->id)); TxMessage.StdId = pmsg->id; } else { TxMessage.IDT = CAN_ID_EXT; RT_ASSERT(IS_CAN_EXTID(pmsg->id)); TxMessage.ExtId = pmsg->id; } if (RT_CAN_DTR == pmsg->rtr) { TxMessage.RTR = CAN_RTR_DATA; } else { TxMessage.RTR = CAN_RTR_REMOTE; } /* Set up the DLC */ TxMessage.DLC = pmsg->len & 0x0FU; /* Set up the data field */ TxMessage.Data[0] = (uint32_t)pmsg->data[0]; TxMessage.Data[1] = (uint32_t)pmsg->data[1]; TxMessage.Data[2] = (uint32_t)pmsg->data[2]; TxMessage.Data[3] = (uint32_t)pmsg->data[3]; TxMessage.Data[4] = (uint32_t)pmsg->data[4]; TxMessage.Data[5] = (uint32_t)pmsg->data[5]; TxMessage.Data[6] = (uint32_t)pmsg->data[6]; TxMessage.Data[7] = (uint32_t)pmsg->data[7]; CAN_Transmit(hcan->Instance, &TxMessage); while((CAN_TransmitStatus(hcan->Instance, box_num) != CANTXOK) && (i != 0xFFFF)) { i++; } return RT_EOK; } |
|
|
|
|
|
i 需要赋初值 0 吧
|
|
|
|
|
|
是的,不赋初值,出现了随机数。
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1411 浏览 0 评论
4335 浏览 0 评论
图腾柱PFC无法上升至400V,且电感电流为正弦波形,但是幅值极小
9603 浏览 0 评论
飞凌嵌入式ElfBoard-Vim编辑器之静态链接和动态链接
2932 浏览 0 评论
使用 LinkBoy 将程序导出为 C 语言代码并烧录至 Arduino ESP32 开发板
2343 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-9 18:05 , Processed in 0.704235 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3513