找回密码
 立即注册
楼主: 乘风飞扬

CAN, 图形化程序自动生成, AiCube,USB转2组CAN | Lin 图形化程序自动生成

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-2-14 22:09:32 | 显示全部楼层
lh*** 发表于 2026-2-12 21:35
你好,为什么我这里打印信息没有,是3。0和3。1口接电脑USB吗?我是接的STC USB LINK1D的烧录口

...

printf_usb函数是通过USB-CDC虚拟串口打印信息,用USB线连接电脑与芯片P30(D-),P31(D+),VCC,GND,识别出CDC串口后,用串口助手打开对应的COM口进行打印信息。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:763
  • 最近打卡:2026-05-01 06:00:34

5

主题

520

回帖

2774

积分

金牌会员

积分
2774
发表于 2026-3-4 21:39:37 | 显示全部楼层
谢谢,学习来了
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:763
  • 最近打卡:2026-05-01 06:00:34

5

主题

520

回帖

2774

积分

金牌会员

积分
2774
发表于 2026-3-4 21:40:27 | 显示全部楼层
l1649*** 发表于 2025-12-4 20:19
现在都AI编程了,希望STC做一个自己的AI编程软件

等两天,大佬在弄。不急啊
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:288
  • 最近打卡:2026-04-30 10:02:50
已绑定手机

3

主题

41

回帖

781

积分

高级会员

积分
781
发表于 2026-3-5 08:39:11 | 显示全部楼层
能不能汉化代码?做中文编程
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-04-22 17:04:41
已绑定手机

22

主题

2500

回帖

3086

积分

论坛元老

积分
3086
发表于 2026-4-7 22:20:33 | 显示全部楼层
请问版主,现在AICube升级后,这4个标志:

BOOL fCAN1SendBusy;    //发送FIFO中的CAN数据包发送忙标志
BOOL fCANIReadyRead;   //接收FIFO中有待读取的CAN数据包标志
BOOL fCAN2SendEUsy;    //发送FIFO中的CAN数据包发送忙标志
BOOL fCAN2Readyfead;   //接收FIFO中有待读取的CAN数据包标志

已经没有了,我跟着您无法继续往下操作,能否指点一下如何处理么?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-4-8 09:18:13 | 显示全部楼层
wuzhe*** 发表于 2026-4-7 22:20
请问版主,现在AICube升级后,这4个标志:

BOOL fCAN1SendBusy;    //发送FIFO中的CAN数据包发送忙标志

把中断开启就有了:

截图202604080918046439.jpg

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-04-22 17:04:41
已绑定手机

22

主题

2500

回帖

3086

积分

论坛元老

积分
3086
发表于 2026-4-8 10:46:34 | 显示全部楼层
乘风*** 发表于 2026-4-8 09:18
把中断开启就有了:

感谢您,我马上试一下!

好像我们版本不一样啊?
其实我是使能了接收和发送中断的,但是生成的CAN文件中:

没有这4行:

BOOL fCAN1SendBusy;    //发送FIFO中的CAN数据包发送忙标志
BOOL fCANIReadyRead;   //接收FIFO中有待读取的CAN数据包标志
BOOL fCAN2SendEUsy;    //发送FIFO中的CAN数据包发送忙标志
BOOL fCAN2Readyfead;   //接收FIFO中有待读取的CAN数据包标志

  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用户文件头说明信息  
  4. // 文件名称: can.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改记录:
  8. //   1. (2026-04-07) 创建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>
  11. #include "config.h"
  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用户头文件包含  
  14. //<<AICUBE_USER_INCLUDE_END>>
  15. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  16. // 在此添加用户全局变量定义、用户宏定义以及函数声明
  17. //<<AICUBE_USER_GLOBAL_DEFINE_END>>
  18. const uint8_t CAN_DLC_MAP[2][16] =
  19. {
  20.     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8 }, //CAN2.0
  21.     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64 }, //CAN-FD
  22. };
  23. ////////////////////////////////////////
  24. // CAN1初始化函数
  25. // 入口参数: 无
  26. // 函数返回: 无
  27. ////////////////////////////////////////
  28. void CAN1_Init(void)
  29. {
  30. #define CAN1_SBT_BAUDRATE       (500UL) //SYSCLK/(S_PRESC+1)/((S_SEG1+2)+(S_SEG2+1))
  31. #define CAN1_SBT_SJW            (0)
  32. #define CAN1_SBT_PRESC          (1)
  33. #define CAN1_SBT_SEG1           (31)
  34. #define CAN1_SBT_SEG2           (14)
  35. #define CAN1_FBT_BAUDRATE       (500UL) //SYSCLK/(F_PRESC+1)/((F_SEG1+2)+(F_SEG2+1))
  36. #define CAN1_FBT_SJW            (0)
  37. #define CAN1_FBT_PRESC          (1)
  38. #define CAN1_FBT_SEG1           (31)
  39. #define CAN1_FBT_SEG2           (14)
  40.     CAN16_SetEndianMode(CAN16_LE);      //设置CAN的大小端模式
  41.     CAN1_Enable();                      //使能CAN1功能
  42.     CAN1_SwitchP505122();               //选择CAN1数据口: CANRX (P5.0), CANTX (P5.1), CANSTB(P2.2)
  43.     CAN1_DisableStandbyPin();           //禁止CAN1STB管脚功能
  44.     CAN1_EnterResetMode();              //进入复位模式,开始对CAN1模块进行初始化
  45.     CAN1_NormalMode();                  //CAN1模块为普通工作模式
  46.     CAN1_FD_BoschMode();                //Bosch CAN-FD模式
  47.     CAN1_SetSBT_SEG1(CAN1_SBT_SEG1);    //设置慢速波特率同步采样段1
  48.     CAN1_SetSBT_SEG2(CAN1_SBT_SEG2);    //设置慢速波特率同步采样段2
  49.     CAN1_SetSBT_SJW(CAN1_SBT_SJW);      //设置慢速波特率重新同步跳跃宽度
  50.     CAN1_SetSBT_PRESC(CAN1_SBT_PRESC);  //设置慢速波特率分频系数
  51.     CAN1_SetFBT_SEG1(CAN1_FBT_SEG1);    //设置快速波特率同步采样段1
  52.     CAN1_SetFBT_SEG2(CAN1_FBT_SEG2);    //设置快速波特率同步采样段2
  53.     CAN1_SetFBT_SJW(CAN1_FBT_SJW);      //设置快速波特率重新同步跳跃宽度
  54.     CAN1_SetFBT_PRESC(CAN1_FBT_PRESC);  //设置快速波特率分频系数
  55.     CAN1_RBStoreCorrectData();          //仅存储接收正确的数据
  56.     CAN1_OVFSaveNewest();               //RB上溢时,保存最新接收的数据(最早接收数据被覆盖)
  57.     CAN1_SetAFWLimit(1);                //设置RB将满警告阈值
  58.     CAN1_SetEWLimit_8();                //设置RB错误警告编程值((EWL+1)*8)
  59.     CAN1_DisableSelfACK();              //关闭自动应答
  60.     CAN1_PTBAutoRetransmit();           //PTB自动重传
  61.     CAN1_STBAutoRetransmit();           //STB自动重传
  62.     CAN1_STBPriorityFIFO();             //STB依据FIFO写入的先后顺序发送
  63.     CAN1_DisableTDC();                  //关闭发送延迟补偿功能
  64.     CAN1_EnableReceiveInt();            //使能接收中断
  65.     CAN1_EnableRBOverrunInt();          //使能接收溢出中断
  66.     CAN1_EnableRBFIFOFullInt();         //使能接收缓冲区满中断
  67.     CAN1_EnableRBAlmostFullInt();       //使能接收缓冲区将满中断
  68.     CAN1_EnablePTBTransmitInt();        //使能PTB发送中断
  69.     CAN1_EnableSTBTransmitInt();        //使能STB发送中断
  70.     CAN1_EnableErrorInt();              //使能错误中断
  71.     CAN1_EnableErrorPassiveInt();       //使能被动错误中断
  72.     CAN1_EnableArbitrateLostInt();      //使能仲裁丢失中断
  73.     CAN1_EnableBusErrorInt();           //使能总线错误中断
  74.     CAN1_SetIntPriority(0);             //设置中断为最低优先级
  75.     CAN1_EnableInt();                   //使能CAN1中断
  76.     CAN1_ClearFlags(0xff);              //清除全部中断标志位
  77.     CAN1_ClearErrorFlags(0xff);         //清除全部错误中断标志位
  78.     CAN1_ReleaseRBUF();                 //清除ROV标志位
  79.     CAN1_ExitResetMode();               //退出复位模式,
  80.     //<<AICUBE_USER_CAN1_INITIAL_BEGIN>>
  81.     // 在此添加用户初始化代码  
  82.     //<<AICUBE_USER_CAN1_INITIAL_END>>
  83. }
  84. ////////////////////////////////////////
  85. // CAN1发送数据帧函数
  86. // 入口参数: *pCAN: (发送CAN消息缓冲区)
  87. // 函数返回: 无
  88. ////////////////////////////////////////
  89. void CAN1_SendData(CAN_TxDataDef *pCAN)
  90. {
  91.     uint8_t cnt, i;
  92.     CAN1_WriteTBUF(0, pCAN->ID.u8[3]);  //写ID到TBUF
  93.     CAN1_WriteTBUF(1, pCAN->ID.u8[2]);
  94.     CAN1_WriteTBUF(2, pCAN->ID.u8[1]);
  95.     CAN1_WriteTBUF(3, pCAN->ID.u8[0]);
  96.     CAN1_WriteTBUF(4, pCAN->CTRL.u8);   //写帧控制字节到TBUF
  97.     CAN1_WriteTBUF(5, pCAN->RSVD[0]);
  98.     CAN1_WriteTBUF(6, pCAN->RSVD[1]);
  99.     CAN1_WriteTBUF(7, pCAN->RSVD[2]);
  100.     cnt = CAN_DLC_MAP[pCAN->CTRL.b.FDF][pCAN->CTRL.b.DLC]; //获取数据长度
  101.     for (i = 0; i < cnt; i++)
  102.         CAN1_WriteTBUF((8 + i), pCAN->pu8Data[i]); //写帧数据到TBUF
  103.     CAN1_SelectNextTBSlot();            //指向下一个STB SLOT
  104. #if (TRANS_MODE == PTB_MODE)
  105.     CAN1_TransmitPTB();                 //使能PTB发送
  106. #else
  107.     CAN1_TransmitAllSTB();              //使能STB发送
  108. #endif
  109. }
  110. ////////////////////////////////////////
  111. // CAN1接收数据帧函数
  112. // 入口参数: *pCAN: (接收CAN消息缓冲区)
  113. // 函数返回: 帧个数
  114. ////////////////////////////////////////
  115. uint8_t CAN1_ReceiveData(CAN_RxDataDef *pCAN)
  116. {
  117.     uint8_t cnt, i;
  118.     uint8_t n = 0;
  119.     while (CAN1_CheckRBStatus() != CANRCTRL_RSTAT_EMPTY)
  120.     {
  121.         pCAN->ID.u8[3] = CAN1_ReadRBUF(0); //从RBUF中读取ID
  122.         pCAN->ID.u8[2] = CAN1_ReadRBUF(1);
  123.         pCAN->ID.u8[1] = CAN1_ReadRBUF(2);
  124.         pCAN->ID.u8[0] = CAN1_ReadRBUF(3);
  125.         pCAN->ID.u32 &= 0x1FFFFFFFUL;
  126.         pCAN->CTRL.u8 = CAN1_ReadRBUF(4); //从RBUF中读取帧控制字
  127.         pCAN->CTRL2.u8 = CAN1_ReadRBUF(5);
  128.         pCAN->CYCLE.u8[1] = CAN1_ReadRBUF(6); //从RBUF中读取TTCAN周期字
  129.         pCAN->CYCLE.u8[0] = CAN1_ReadRBUF(7);
  130.         cnt = CAN_DLC_MAP[pCAN->CTRL.b.FDF][pCAN->CTRL.b.DLC]; //获取数据长度
  131.         for (i = 0; i < cnt; i++)
  132.             pCAN->pu8Data[i] = CAN1_ReadRBUF(8 + i); //从RBUF中读取帧数据
  133.         CAN1_ReleaseRBUF();             //释放RBUF,准备读取下一个SLOT
  134.         pCAN++;
  135.         n++;                            //帧个数+1
  136.     }
  137.     return n;                           //返回帧个数
  138. }
  139. ////////////////////////////////////////
  140. // CAN2初始化函数
  141. // 入口参数: 无
  142. // 函数返回: 无
  143. ////////////////////////////////////////
  144. void CAN2_Init(void)
  145. {
  146. #define CAN2_SBT_BAUDRATE       (500UL) //SYSCLK/(S_PRESC+1)/((S_SEG1+2)+(S_SEG2+1))
  147. #define CAN2_SBT_SJW            (0)
  148. #define CAN2_SBT_PRESC          (1)
  149. #define CAN2_SBT_SEG1           (31)
  150. #define CAN2_SBT_SEG2           (14)
  151. #define CAN2_FBT_BAUDRATE       (500UL) //SYSCLK/(F_PRESC+1)/((F_SEG1+2)+(F_SEG2+1))
  152. #define CAN2_FBT_SJW            (0)
  153. #define CAN2_FBT_PRESC          (1)
  154. #define CAN2_FBT_SEG1           (31)
  155. #define CAN2_FBT_SEG2           (14)
  156.     CAN16_SetEndianMode(CAN16_LE);      //设置CAN的大小端模式
  157.     CAN2_Enable();                      //使能CAN2功能
  158.     CAN2_SwitchP525323();               //选择CAN2数据口: CAN2RX (P52), CAN2TX (P53), CANSTB(P2.3)
  159.     CAN2_DisableStandbyPin();           //禁止CAN2STB管脚功能
  160.     CAN2_EnterResetMode();              //进入复位模式,开始对CAN2模块进行初始化
  161.     CAN2_NormalMode();                  //CAN2模块为普通工作模式
  162.     CAN2_FD_BoschMode();                //Bosch CAN-FD模式
  163.     CAN2_SetSBT_SEG1(CAN2_SBT_SEG1);    //设置慢速波特率同步采样段1
  164.     CAN2_SetSBT_SEG2(CAN2_SBT_SEG2);    //设置慢速波特率同步采样段2
  165.     CAN2_SetSBT_SJW(CAN2_SBT_SJW);      //设置慢速波特率重新同步跳跃宽度
  166.     CAN2_SetSBT_PRESC(CAN2_SBT_PRESC);  //设置慢速波特率分频系数
  167.     CAN2_SetFBT_SEG1(CAN2_FBT_SEG1);    //设置快速波特率同步采样段1
  168.     CAN2_SetFBT_SEG2(CAN2_FBT_SEG2);    //设置快速波特率同步采样段2
  169.     CAN2_SetFBT_SJW(CAN2_FBT_SJW);      //设置快速波特率重新同步跳跃宽度
  170.     CAN2_SetFBT_PRESC(CAN2_FBT_PRESC);  //设置快速波特率分频系数
  171.     CAN2_RBStoreCorrectData();          //仅存储接收正确的数据
  172.     CAN2_OVFSaveNewest();               //RB上溢时,保存最新接收的数据(最早接收数据被覆盖)
  173.     CAN2_SetAFWLimit(1);                //设置RB将满警告阈值
  174.     CAN2_SetEWLimit_8();                //设置RB错误警告编程值((EWL+1)*8)
  175.     CAN2_DisableSelfACK();              //关闭自动应答
  176.     CAN2_PTBAutoRetransmit();           //PTB自动重传
  177.     CAN2_STBAutoRetransmit();           //STB自动重传
  178.     CAN2_STBPriorityFIFO();             //STB依据FIFO写入的先后顺序发送
  179.     CAN2_DisableTDC();                  //关闭发送延迟补偿功能
  180.     CAN2_EnableReceiveInt();            //使能接收中断
  181.     CAN2_EnableRBOverrunInt();          //使能接收溢出中断
  182.     CAN2_EnableRBFIFOFullInt();         //使能接收缓冲区满中断
  183.     CAN2_EnableRBAlmostFullInt();       //使能接收缓冲区将满中断
  184.     CAN2_EnablePTBTransmitInt();        //使能PTB发送中断
  185.     CAN2_EnableSTBTransmitInt();        //使能STB发送中断
  186.     CAN2_EnableErrorInt();              //使能错误中断
  187.     CAN2_EnableErrorPassiveInt();       //使能被动错误中断
  188.     CAN2_EnableArbitrateLostInt();      //使能仲裁丢失中断
  189.     CAN2_EnableBusErrorInt();           //使能总线错误中断
  190.     CAN2_SetIntPriority(0);             //设置中断为最低优先级
  191.     CAN2_EnableInt();                   //使能CAN2中断
  192.     CAN2_ClearFlags(0xff);              //清除全部中断标志位
  193.     CAN2_ClearErrorFlags(0xff);         //清除全部错误中断标志位
  194.     CAN2_ReleaseRBUF();                 //清除ROV标志位
  195.     CAN2_ExitResetMode();               //退出复位模式,
  196.     //<<AICUBE_USER_CAN2_INITIAL_BEGIN>>
  197.     // 在此添加用户初始化代码  
  198.     //<<AICUBE_USER_CAN2_INITIAL_END>>
  199. }
  200. ////////////////////////////////////////
  201. // CAN2发送数据帧函数
  202. // 入口参数: *pCAN: (发送CAN消息缓冲区)
  203. // 函数返回: 无
  204. ////////////////////////////////////////
  205. void CAN2_SendData(CAN_TxDataDef *pCAN)
  206. {
  207.     uint8_t cnt, i;
  208.     CAN2_WriteTBUF(0, pCAN->ID.u8[3]);  //写ID到TBUF
  209.     CAN2_WriteTBUF(1, pCAN->ID.u8[2]);
  210.     CAN2_WriteTBUF(2, pCAN->ID.u8[1]);
  211.     CAN2_WriteTBUF(3, pCAN->ID.u8[0]);
  212.     CAN2_WriteTBUF(4, pCAN->CTRL.u8);   //写帧控制字节到TBUF
  213.     CAN2_WriteTBUF(5, pCAN->RSVD[0]);
  214.     CAN2_WriteTBUF(6, pCAN->RSVD[1]);
  215.     CAN2_WriteTBUF(7, pCAN->RSVD[2]);
  216.     cnt = CAN_DLC_MAP[pCAN->CTRL.b.FDF][pCAN->CTRL.b.DLC]; //获取数据长度
  217.     for (i = 0; i < cnt; i++)
  218.         CAN2_WriteTBUF((8 + i), pCAN->pu8Data[i]); //写帧数据到TBUF
  219.     CAN2_SelectNextTBSlot();            //指向下一个STB SLOT
  220. #if (TRANS_MODE == PTB_MODE)
  221.     CAN2_TransmitPTB();                 //使能PTB发送
  222. #else
  223.     CAN2_TransmitAllSTB();              //使能STB发送
  224. #endif
  225. }
  226. ////////////////////////////////////////
  227. // CAN2接收数据帧函数
  228. // 入口参数: *pCAN: (接收CAN消息缓冲区)
  229. // 函数返回: 帧个数
  230. ////////////////////////////////////////
  231. uint8_t CAN2_ReceiveData(CAN_RxDataDef *pCAN)
  232. {
  233.     uint8_t cnt, i;
  234.     uint8_t n = 0;
  235.     while (CAN2_CheckRBStatus() != CANRCTRL_RSTAT_EMPTY)
  236.     {
  237.         pCAN->ID.u8[3] = CAN2_ReadRBUF(0); //从RBUF中读取ID
  238.         pCAN->ID.u8[2] = CAN2_ReadRBUF(1);
  239.         pCAN->ID.u8[1] = CAN2_ReadRBUF(2);
  240.         pCAN->ID.u8[0] = CAN2_ReadRBUF(3);
  241.         pCAN->ID.u32 &= 0x1FFFFFFFUL;
  242.         pCAN->CTRL.u8 = CAN2_ReadRBUF(4); //从RBUF中读取帧控制字
  243.         pCAN->CTRL2.u8 = CAN2_ReadRBUF(5);
  244.         pCAN->CYCLE.u8[1] = CAN2_ReadRBUF(6); //从RBUF中读取TTCAN周期字
  245.         pCAN->CYCLE.u8[0] = CAN2_ReadRBUF(7);
  246.         cnt = CAN_DLC_MAP[pCAN->CTRL.b.FDF][pCAN->CTRL.b.DLC]; //获取数据长度
  247.         for (i = 0; i < cnt; i++)
  248.             pCAN->pu8Data[i] = CAN2_ReadRBUF(8 + i); //从RBUF中读取帧数据
  249.         CAN2_ReleaseRBUF();             //释放RBUF,准备读取下一个SLOT
  250.         pCAN++;
  251.         n++;                            //帧个数+1
  252.     }
  253.     return n;                           //返回帧个数
  254. }
  255. ////////////////////////////////////////
  256. // 初始化CAN消息帧数据结构
  257. // 入口参数: *pCAN: (CAN消息缓冲区)
  258. //           *pData: (待发送的消息数据)
  259. //           u8DLC: (数据的DLC值
  260. //               !!! 注意:对于CAN-FD消息,当数据长度大于8时,DLC的值与
  261. //                   实际的数据长度不一致,建议使用CAN_DLC_8、CAN_DLC_64
  262. //                   等格式的宏定义当作参数传递给u8DLC)
  263. //           u32ID: (帧ID)
  264. //           bCANFD: (0:CAN2.0 1:CAN-FD)
  265. // 函数返回: 无
  266. ////////////////////////////////////////
  267. void CAN_InitFrame(CAN_TxDataDef *pCAN, uint8_t *pData, uint8_t u8DLC, uint32_t u32ID, BOOL bCANFD)
  268. {
  269.     uint8_t cnt;
  270.     uint8_t i;
  271.     pCAN->ID.u32 = u32ID;               //设置帧ID
  272.     pCAN->CTRL.u8 = 0;                  //初始化控制字
  273.     if (!bCANFD)                        //判断时CAN2.0帧还是CAN-FD帧
  274.     {
  275.         pCAN->CTRL.b.FDF = 0;           //0:CAN2.0帧
  276.         pCAN->CTRL.b.BRS = 0;           //CAN2.0帧波特率不可变,必须设置为0
  277.         pCAN->CTRL.b.DLC = (u8DLC & 0x0f); //设置帧数据长度参数,CAN2.0不可大于8
  278.     }
  279.     else
  280.     {
  281.         pCAN->CTRL.b.FDF = 1;           //1:CAN-FD帧
  282.         pCAN->CTRL.b.BRS = 1;           //0:整帧为低速波特率; 1:数据和CRC为快速波特率(CAN-FD可设置为0或者1)
  283.         pCAN->CTRL.b.DLC = (u8DLC & 0x0f); //设置帧数据长度参数
  284.     }
  285.     pCAN->CTRL.b.IDE = 0;               //0:标准帧; 1:扩展帧
  286.     pCAN->CTRL.b.RTR = 0;               //0:数据帧; 1:远程帧
  287.     cnt = CAN_DLC_MAP[pCAN->CTRL.b.FDF][pCAN->CTRL.b.DLC]; //获取数据长度
  288.     for (i = 0; i < cnt; i++)
  289.         pCAN->pu8Data[i] = *pData++;
  290. }
  291. ////////////////////////////////////////
  292. // CAN1中断服务程序
  293. // 入口参数: 无
  294. // 函数返回: 无
  295. ////////////////////////////////////////
  296. void CAN1_ISR(void) interrupt CAN1_VECTOR
  297. {
  298.     //<<AICUBE_USER_CAN1_ISR_CODE1_BEGIN>>
  299.     // 在此添加中断函数用户代码  
  300.     uint8_t isr;
  301.     uint8_t err;
  302.     isr = CAN1_ReadIntStatus();         //读取中断标志位
  303.     CAN1_ClearFlags(isr);               //写1清除中断标志位
  304.     err = CAN1_ReadErrorStatus();       //读取错误标志位
  305.     CAN1_ClearErrorFlags(err);          //写1清除错误标志位
  306.     if (CAN1_CheckReceive(isr))         //判断接收中断标志位
  307.     {
  308.     }
  309.     if (CAN1_CheckRBOverrun(isr))       //判断接收溢出中断标志位
  310.     {
  311.     }
  312.     if (CAN1_CheckRBFIFOFull(isr))      //判断接收缓冲区满中断标志位
  313.     {
  314.     }
  315.     if (CAN1_CheckRBAlmostFull(isr))    //判断接收缓冲区将满中断标志位
  316.     {
  317.     }
  318.     if (CAN1_CheckPTBTransmit(isr))     //判断PTB发送中断标志位
  319.     {
  320.     }
  321.     if (CAN1_CheckSTBTransmit(isr))     //判断STB发送中断标志位
  322.     {
  323.     }
  324.     if (CAN1_CheckError(isr))           //判断错误中断标志位
  325.     {
  326.     }
  327.     if (CAN1_CheckArbitrateLost(err))   //判断仲裁丢失中断标志位
  328.     {
  329.     }
  330.     if (CAN1_CheckErrorPassive(err))    //判断被动错误中断标志位
  331.     {
  332.     }
  333.     if (CAN1_CheckBusError(err))        //判断总线错误中断标志位
  334.     {
  335.     }
  336.     if (CAN1_CheckRBUFOverflow())       //判断接收BUF上溢标志位
  337.     {
  338.         CAN1_ReleaseRBUF();             //写1到RREL来清除ROV只读标志位
  339.     }
  340.     //<<AICUBE_USER_CAN1_ISR_CODE1_END>>
  341. }
  342. ////////////////////////////////////////
  343. // CAN2中断服务程序
  344. // 入口参数: 无
  345. // 函数返回: 无
  346. ////////////////////////////////////////
  347. void CAN2_ISR(void) interrupt CAN2_VECTOR
  348. {
  349.     //<<AICUBE_USER_CAN2_ISR_CODE1_BEGIN>>
  350.     // 在此添加中断函数用户代码  
  351.     uint8_t isr;
  352.     uint8_t err;
  353.     isr = CAN2_ReadIntStatus();         //读取中断标志位
  354.     CAN2_ClearFlags(isr);               //写1清除中断标志位
  355.     err = CAN2_ReadErrorStatus();       //读取错误标志位
  356.     CAN2_ClearErrorFlags(err);          //写1清除错误标志位
  357.     if (CAN2_CheckReceive(isr))         //判断接收中断标志位
  358.     {
  359.     }
  360.     if (CAN2_CheckRBOverrun(isr))       //判断接收溢出中断标志位
  361.     {
  362.     }
  363.     if (CAN2_CheckRBFIFOFull(isr))      //判断接收缓冲区满中断标志位
  364.     {
  365.     }
  366.     if (CAN2_CheckRBAlmostFull(isr))    //判断接收缓冲区将满中断标志位
  367.     {
  368.     }
  369.     if (CAN2_CheckPTBTransmit(isr))     //判断PTB发送中断标志位
  370.     {
  371.     }
  372.     if (CAN2_CheckSTBTransmit(isr))     //判断STB发送中断标志位
  373.     {
  374.     }
  375.     if (CAN2_CheckError(isr))           //判断错误中断标志位
  376.     {
  377.     }
  378.     if (CAN2_CheckArbitrateLost(err))   //判断仲裁丢失中断标志位
  379.     {
  380.     }
  381.     if (CAN2_CheckErrorPassive(err))    //判断被动错误中断标志位
  382.     {
  383.     }
  384.     if (CAN2_CheckBusError(err))        //判断总线错误中断标志位
  385.     {
  386.     }
  387.     if (CAN2_CheckRBUFOverflow())       //判断接收BUF上溢标志位
  388.     {
  389.         CAN2_ReleaseRBUF();             //写1到RREL来清除ROV只读标志位
  390.     }
  391.     //<<AICUBE_USER_CAN2_ISR_CODE1_END>>
  392. }
  393. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  394. // 在此添加用户函数实现代码  
  395. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
复制代码
我的版本是最新的:6.96T

截图202604081053377177.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-04-22 17:04:41
已绑定手机

22

主题

2500

回帖

3086

积分

论坛元老

积分
3086
发表于 2026-4-8 10:59:46 | 显示全部楼层
另外,我发现新版本的CAN发送函数,也是分开CAN1和CAN2的..............

我把STC的例子例子14和36下载到2块屠龙刀观察一下:

发现我2块屠龙刀,4组CAN,#2号CAN只能发送,接收没反应?
截图202604081059426891.jpg
截图202604081100413528.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-04-22 17:04:41
已绑定手机

22

主题

2500

回帖

3086

积分

论坛元老

积分
3086
发表于 2026-4-8 11:02:03 | 显示全部楼层
串口情况如下:
截图202604081102008435.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-4-8 11:05:24 | 显示全部楼层
wuzhe*** 发表于 2026-4-8 10:46
感谢您,我马上试一下!

好像我们版本不一样啊?

我用的也是V6.96T的版本,使能中断后在旁边的程序框里面就能看到生成代码的变化:


截图202604081101332694.jpg

STC32G12K128_CAN.zip

49.92 KB, 下载次数: 2

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 12:00 , Processed in 0.132508 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表