纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 37896|回复: 7

求问can总线的中断程序

[复制链接]
发表于 2012-10-9 19:44:02 | 显示全部楼层 |阅读模式
本帖最后由 xiaqing10 于 2012-10-9 19:55 编辑

看的是STM32的用户手册,上面说:
   在主程序中,开启了FIFO的中断响应使能后,程序抵用了CAN_Transmit函数发送CAN数据帧,由于CAN工作于环回模式,发送的数据帧环回回CAN接口,在中断服务程序中,对接收的帧进行处理。
  
不怎么理解上句话:
  或则说不怎么理解下面的这段代码:
  CAN_Transmit(&TxMessage);
  /* initialize the value that will be returned */
  ret = 0xFF;     
  /* receive message with interrupt handling */
  i=0;
  while((ret == 0xFF) && (i < 0xFFF))  
  {
    i++;
  }
  if (i == 0xFFF)
  {
    ret=0;  
  }
  /* disable interrupt handling */
  CAN_ITConfig(CAN_IT_FMP0, DISABLE);  
  return (TestStatus)ret;
  希望大家告诉下我中断怎么被触发了,也就是怎么接收了FIFO0中的数据了。   谢谢了!
回复

使用道具 举报

 楼主| 发表于 2012-10-9 19:46:53 | 显示全部楼层
或者说是因为有这样的一句话: CAN_ITConfig(CAN_IT_FMP0, ENABLE);
我可以这样理解么:是使能了FIFO0寄存器,当这个寄存器收到数据时就自动触发了中断。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-9 19:59:25 | 显示全部楼层
或者再说下自己对轮询和中断的理解:
轮询:一直用while((CAN_MessagePending(CAN_FIFO0) < 1) && (i != 0xFF)) 来检测FIFO0里面是否有报文,有的话就去读取(这里是调用CAN_Receive(CAN_FIFO0, &RxMessage))。
中断:CAN_ITConfig(CAN_IT_FMP0, ENABLE);即当FIFO0里面有数据则产生中断,然后由中断自己去调用读取FIFO0里面数据的程序。 也就是说中断比轮询少了个CAN_Receive()函数。
不知道上述理解是否正确,求指导。。。
回复 支持 反对

使用道具 举报

发表于 2012-10-9 20:24:11 | 显示全部楼层
CAN_ITConfig(CAN_IT_FMP0, ENABLE);使能CAN接收中断后,当接收到数据时程序会跳转到CAN接收中断处理函数中,在这个中断函数中应该调用CAN_Receive()函数将CAN数据拷贝到用户内存中来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-9 21:08:25 | 显示全部楼层
wdluo 发表于 2012-10-9 20:24
CAN_ITConfig(CAN_IT_FMP0, ENABLE);使能CAN接收中断后,当接收到数据时程序会跳转到CAN接收中断处理函数中 ...

那再请问下,这个中断函数中应该调用CAN_Receive()函数要自己再重写吗?
  我觉得需要,但是源程序中却找不到。

点评

不需要,有现成的库函数  发表于 2012-10-9 21:45
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-9 21:51:52 | 显示全部楼层
xiaqing10 发表于 2012-10-9 21:08
那再请问下,这个中断函数中应该调用CAN_Receive()函数要自己再重写吗?
  我觉得需要,但是源程序中却 ...

哦  原来如此。我说怎么找不到中断处理函数了,非常感谢了。
  因为最近才开始学这个,不懂的地方比较多,多多麻烦版主了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-10 12:50:30 | 显示全部楼层
wdluo 发表于 2012-10-9 20:24
CAN_ITConfig(CAN_IT_FMP0, ENABLE);使能CAN接收中断后,当接收到数据时程序会跳转到CAN接收中断处理函数中 ...

版主,你能告诉我上面这段代码实现什么功能吗? 就是这个while 和if
CAN_Transmit(&TxMessage);
   /* initialize the value that will be returned */
   ret = 0xFF;     
   /* receive message with interrupt handling */
   i=0;
   while((ret == 0xFF) && (i < 0xFFF))  
   {
     i++;
   }
  if (i == 0xFFF)
   {
     ret=0;  
   }
   /* disable interrupt handling */
   CAN_ITConfig(CAN_IT_FMP0, DISABLE);  
   return (TestStatus)ret;

点评

就一个延时功能而已  发表于 2012-10-10 15:13
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-10 15:16:32 | 显示全部楼层
xiaqing10 发表于 2012-10-10 12:50
版主,你能告诉我上面这段代码实现什么功能吗? 就是这个while 和if
CAN_Transmit(&TxMessage);
   /*  ...

哦,还真是延时。我还以为有其它功能呢,好的,谢谢了。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-26 00:40 , Processed in 1.202167 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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