OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5239|回复: 7

UCOSiii 想使用CAN中断接收消息,中断进不去(OSIntNestingCtr 始终为0)

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-11-27
在线时间
9 小时
发表于 2019-11-29 12:02:25 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

1533

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6369
金钱
6369
注册时间
2015-8-25
在线时间
1004 小时
发表于 2019-11-29 12:02:26 | 显示全部楼层
本帖最后由 szczyb1314 于 2019-12-1 17:59 编辑
  1. #ifndef __CAN_H
  2. #define __CAN_H         
  3. #include "sys.h"            
  4. //////////////////////////////////////////////////////////////////////////////////         
  5. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  6. //ALIENTEK战舰STM32开发板
  7. //CAN驱动 代码          
  8. //正点原子@ALIENTEK
  9. //技术论坛:www.openedv.com
  10. //创建日期:2014/5/7
  11. //版本:V1.1
  12. //版权所有,盗版必究。
  13. //Copyright(C) 广州市星翼电子科技有限公司 2014-2024
  14. //All rights reserved       
  15. //********************************************************************************
  16. //V1.1修改说明 20150528
  17. //修正了CAN初始化函数的相关注释,更正了波特率计算公式
  18. //////////////////////////////////////////////////////////////////////////////////          

  19. //CAN接收RX0中断使能
  20. #define USE_CAN_INTR 0     //0:不用中断 1:使用中断

  21. //CAN选择接收FIFO
  22. #define CAN_RXFIFO_0_OR_1 0   //0:使用FIFO0 1:使用FIFO1
  23.                                                                                                                                                                               
  24. u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode);//CAN初始化

  25. u8 Can_Send_Msg(u8* msg,u8 len);                                                //发送数据

  26. u8 Can_Receive_Msg(u8 *buf);                                                        //接收数据
  27. #endif

  28. #include "can.h"
  29. #include "led.h"
  30. #include "delay.h"
  31. #include "usart.h"
  32. //////////////////////////////////////////////////////////////////////////////////
  33. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  34. //ALIENTEK战舰STM32开发板
  35. //CAN驱动 代码
  36. //正点原子@ALIENTEK
  37. //技术论坛:www.openedv.com
  38. //创建日期:2014/5/7
  39. //版本:V1.1
  40. //版权所有,盗版必究。
  41. //Copyright(C) 广州市星翼电子科技有限公司 2014-2024
  42. //All rights reserved
  43. //********************************************************************************
  44. //V1.1修改说明 20150528
  45. //修正了CAN初始化函数的相关注释,更正了波特率计算公式
  46. //////////////////////////////////////////////////////////////////////////////////

  47. //CAN初始化
  48. //tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq
  49. //tbs2:时间段2的时间单元.   范围:CAN_BS2_1tq~CAN_BS2_8tq;
  50. //tbs1:时间段1的时间单元.   范围:CAN_BS1_1tq ~CAN_BS1_16tq
  51. //brp :波特率分频器.范围:1~1024;  tq=(brp)*tpclk1
  52. //波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
  53. //mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回环模式;
  54. //Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);
  55. //则波特率为:36M/((8+9+1)*4)=500Kbps
  56. //返回值:0,初始化OK;
  57. //    其他,初始化失败;
  58. u8 CAN_Mode_Init(u8 tsjw, u8 tbs2, u8 tbs1, u16 brp, u8 mode)
  59. {
  60.     GPIO_InitTypeDef                 GPIO_InitStructure;
  61.     CAN_InitTypeDef                CAN_InitStructure;
  62.     CAN_FilterInitTypeDef          CAN_FilterInitStructure;

  63. #if USE_CAN_INTR
  64.     NVIC_InitTypeDef                  NVIC_InitStructure;
  65. #endif

  66.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟
  67.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟

  68.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  69.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  70.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽
  71.     GPIO_Init(GPIOA, &GPIO_InitStructure);                        //初始化IO

  72.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  73.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //上拉输入
  74.     GPIO_Init(GPIOA, &GPIO_InitStructure);                        //初始化IO

  75.     //CAN单元设置
  76.     CAN_InitStructure.CAN_TTCM = DISABLE;                        //非时间触发通信模式
  77.     CAN_InitStructure.CAN_ABOM = DISABLE;                        //软件自动离线管理
  78.     CAN_InitStructure.CAN_AWUM = DISABLE;                        //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
  79.     CAN_InitStructure.CAN_NART = ENABLE;                        //禁止报文自动传送
  80.     CAN_InitStructure.CAN_RFLM = DISABLE;                         //报文不锁定,新的覆盖旧的
  81.     CAN_InitStructure.CAN_TXFP = DISABLE;                        //优先级由报文标识符决定
  82.     CAN_InitStructure.CAN_Mode = mode;               //模式设置: mode:0,普通模式;1,回环模式;
  83.     //设置波特率
  84.     CAN_InitStructure.CAN_SJW = tsjw;                                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq         CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
  85.     CAN_InitStructure.CAN_BS1 = tbs1;                         //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq
  86.     CAN_InitStructure.CAN_BS2 = tbs2;                                //Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~        CAN_BS2_8tq
  87.     CAN_InitStructure.CAN_Prescaler = brp;      //分频系数(Fdiv)为brp+1
  88.     CAN_Init(CAN1, &CAN_InitStructure);                //初始化CAN1

  89.     CAN_FilterInitStructure.CAN_FilterNumber = 7;        //过滤器0(103ZET6有14个过滤器,现在用过滤器0)
  90.     CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;         //屏蔽位模式
  91.     CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;         //32位宽
  92.     CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;        //32位期望收到的ID
  93.     CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
  94.     CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; //32位MASK(屏蔽)的ID
  95.     CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

  96.     /*
  97.     CAN_FilterInitStructure.CAN_FilterIdHigh=0xFFFF;        //32位期望收到的ID:0xFFFF0000,即希望收到的STID+EXTID+IDE+RTR最好是0xFFFF0000
  98.     CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  99.     CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFF00;//32位MASK(屏蔽)的ID:OxFF00FF00,设置需要关心的ID,表示[31:24][15:8]是必须和期望的ID一致的,
  100.     CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFF00; //而另外的16位不关心,也认为是正确的ID,即最终要确定的映像为0xFFXX00XX,才是正确的。
  101.     */
  102.        
  103. #if CAN_RXFIFO_0_OR_1==0
  104.     CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //过滤器0关联到FIFO0
  105. #elif CAN_RXFIFO_0_OR_1==1
  106.     CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO1; //过滤器0关联到FIFO1
  107. #endif
  108.     CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //激活过滤器0

  109.     CAN_FilterInit(&CAN_FilterInitStructure);                        //滤波器初始化

  110. #if USE_CAN_INTR

  111. #if CAN_RXFIFO_0_OR_1==0
  112.     CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);                                //FIFO0消息挂号中断允许.
  113.     NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  114. #elif CAN_RXFIFO_0_OR_1==1
  115.     CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);                                //FIFO1消息挂号中断允许.
  116.     NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;
  117. #endif

  118.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
  119.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
  120.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  121.     NVIC_Init(&NVIC_InitStructure);
  122. #endif
  123.     return 0;
  124. }

  125. #if USE_CAN_INTR        //使能中断

  126. #if CAN_RXFIFO_0_OR_1==0
  127. void USB_LP_CAN1_RX0_IRQHandler(void)
  128. {
  129.     CanRxMsg RxMessage;
  130.     int i = 0;
  131.     CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

  132.     for(i = 0; i < 8; i++)
  133.         printf("rx0buf[%d]:%d\r\n", i, RxMessage.Data[i]);
  134.         printf("%d\r\n",RxMessage.FMI);
  135. }
  136. #elif CAN_RXFIFO_0_OR_1==1
  137. void CAN1_RX1_IRQHandler(void)
  138. {
  139.     CanRxMsg RxMessage;
  140.     int i = 0;
  141.     CAN_Receive(CAN1, CAN_FIFO1, &RxMessage);

  142.     for(i = 0; i < 8; i++)
  143.         printf("rx1buf[%d]:%d\r\n", i, RxMessage.Data[i]);
  144.         printf("%d\r\n",RxMessage.FMI);
  145. }
  146. #endif

  147. #endif

  148. //can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)
  149. //len:数据长度(最大为8)
  150. //msg:数据指针,最大为8个字节.
  151. //返回值:0,成功;
  152. //                 其他,失败;
  153. u8 Can_Send_Msg(u8* msg, u8 len)
  154. {
  155.     u8 mbox;
  156.     u16 i = 0;
  157.     CanTxMsg TxMessage;
  158.     TxMessage.StdId = 0x12;                        // 标准标识符
  159.     TxMessage.ExtId = 0x12;                        // 设置扩展标示符
  160.     TxMessage.IDE = CAN_Id_Standard;         // 标准帧
  161.     TxMessage.RTR = CAN_RTR_Data;                // 数据帧
  162.     TxMessage.DLC = len;                                // 要发送的数据长度

  163.     for(i = 0; i < len; i++)
  164.         TxMessage.Data[i] = msg[i];   //szc data0先发送data0先收到

  165.     mbox = CAN_Transmit(CAN1, &TxMessage);
  166.     i = 0;

  167.     while((CAN_TransmitStatus(CAN1, mbox) == CAN_TxStatus_Failed) && (i < 0XFFF))i++;        //等待发送结束

  168.     if(i >= 0XFFF)return 1;

  169.     return 0;
  170. }
  171. //can口接收数据查询
  172. //buf:数据缓存区;
  173. //返回值:0,无数据被收到;
  174. //                 其他,接收的数据长度;
  175. u8 Can_Receive_Msg(u8 *buf)
  176. {
  177.     u32 i;
  178.     CanRxMsg RxMessage;

  179. #if CAN_RXFIFO_0_OR_1==0

  180.     if( CAN_MessagePending(CAN1, CAN_FIFO0) == 0)return 0;                //没有接收到数据,直接退出

  181.     CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据
  182. #elif CAN_RXFIFO_0_OR_1==1

  183.     if( CAN_MessagePending(CAN1, CAN_FIFO1) == 0)return 0;                //没有接收到数据,直接退出

  184.     CAN_Receive(CAN1, CAN_FIFO1, &RxMessage);//读取数据
  185. #endif

  186.     for(i = 0; i < 8; i++)
  187.         buf[i] = RxMessage.Data[i];

  188.     return RxMessage.DLC;
  189. }
复制代码

我在迷你板上测试过的CAN的程序
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

26

主题

1533

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6369
金钱
6369
注册时间
2015-8-25
在线时间
1004 小时
发表于 2019-11-29 17:07:23 | 显示全部楼层
查查初始化,一般都是初始化那里没注意到
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-11-27
在线时间
9 小时
 楼主| 发表于 2019-11-29 17:57:16 | 显示全部楼层
szczyb1314 发表于 2019-11-29 17:07
查查初始化,一般都是初始化那里没注意到

初始化     和    不用UCOS的CAN初始化   一模一样,初学,看视频给中断加了两个函数。OSIntEnter();  和  OSIntExit();
回复

使用道具 举报

26

主题

1533

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6369
金钱
6369
注册时间
2015-8-25
在线时间
1004 小时
发表于 2019-11-30 08:26:54 | 显示全部楼层
那一切都是巧合 发表于 2019-11-29 17:57
初始化     和    不用UCOS的CAN初始化   一模一样,初学,看视频给中断加了两个函数。OSIntEnter();  和 ...

原子的例程里can是查询模式不是中断模式
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-11-27
在线时间
9 小时
 楼主| 发表于 2019-12-1 12:10:42 | 显示全部楼层
szczyb1314 发表于 2019-11-30 08:26
原子的例程里can是查询模式不是中断模式

有没有例程供菜鸟学习学习的,昨天看了一天还是没有理解
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-12-2 02:08:44 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-11-27
在线时间
9 小时
 楼主| 发表于 2019-12-2 18:29:38 | 显示全部楼层
szczyb1314 发表于 2019-12-1 17:58
我在迷你板上测试过的CAN的程序

感谢感谢,学习中ing
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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