STM32F103 CAN中断发送功能的再次讨论
转自:http://yiyutingmeng.blog.163.com/blog/static/124258578201191584629146/
我在之前的一篇博客日志中,写过关于CAN发送功能如何使用,但是当时由于时间匆忙,赶项目,按照对USART中断发送的理解,在数据成功发送出去的情况下,写了那篇误人子弟的日志,在这里向大家道歉,实在不好意思,现在我重新阐述下CAN中断发送原理。
1、USART发送中断与CAN发送中断的区别
USART发送中断,是因为发送缓冲区为空,CAN发送中断的中断源是成功(或者abort)发送一次,正是这种区别误导了我。
2、我之前的CAN中断发送的处理方法是,将数据填充到发送缓冲区,由CAN中断提取进行发送,为了启动CAN的发送,我写了一句话CAN->sTxMailBox[0].TIR |= 1;就是启动发送,我以为在这以后CAN执行的动作是:产生中断,将数据从发送缓冲区提取,发送,进入完成中断,判断有无数据,没有就关闭中断,否则继续发送。但是CAN实际执行的动作是:发送,进入发送完成中断,提取数据,发送,进入完成中断,判断有无数据,没有就关闭中断,否则继续发送。由此可见,CAN实际上是多发送了一次数据,这个数据就是当前CAN寄存器里面的数据,而这次发送,应用层和CAN中断程序里都没有参与,所以是不被发现的,这也据解释了为什么对方收到的数据比我发送的数据多,在A发送大量数据的时候,B做应答,但是每次都请求发送,由于速度快,B每次实际发送了同样的数据给A,A所以收到 很多相同的数据。
3、解决办法,就是应用层调用CAN发送数据时,将数据填充到缓冲区,使能中断,但是不请求发送,因为使能中断,在中断里面发送,发送完毕后关闭中断。这里有两点需要注意:1是第一次的时候没有所谓的发送完成中断,所以程序开始要产生一个发送完成中断,以启动发送中断,第二就是为了使用中断发送,在发送中断函数里,要判断当前是否有数据发送,有的话可以清除中断标志,没有的话只能关闭中断,不能清除中断,否则下次据没法发送了。
STM32F103 CAN中断发送功能的再次讨论的更多相关文章
- MM32F0020 UART1中断接收和UART1中断发送
目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1和NVIC中断 3.编写MM32F0020 UART1使能中断发送函数 4.编写MM32F0020 UART1中断接收和中断 ...
- MM32F0140 UART1中断接收和UART1中断发送
目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1和NVIC中断 3.编写MM32F0140 UART1使能中断发送函数 4.编写MM32F0140 UART1中断接收和中断 ...
- .NET开发邮件发送功能的全面教程(含邮件组件源码)
今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1) 邮件基础理论知识 2) ...
- .NET开发邮件发送功能
.NET开发邮件发送功能 今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1) 邮件基础理论知 ...
- STM32F103外部中断编程
STM32F103外部中断编程 中断,顾名思义就是停下手头的活,去干另外一件急活,干完急活然后回来继续干手头的活. 单片机和人一样,有时候也有更急的程序需要执行,执行完之后再回来执行之前正在执行的 ...
- 用ASP.NET Core 1.0中实现邮件发送功能-阿里云邮件推送篇
在上篇中用MailKit实现了Asp.net core 邮件发送功能,但一直未解决阿里云邮件推送问题,提交工单一开始的回复不尽如人意,比如您的网络问题,您的用户名密码不正确等,但继续沟通下阿里云客户还 ...
- redmine邮件发送功能配置详解
redmine的邮件发送功能还是很有用的.像项目有更新啦,任务分配啦,都能邮件发送的相关责任人.我自己在linux服务器上安装并启动了redmine后,邮件一直发送了不了.查了网上的资料,都是讲修改下 ...
- java 模拟消息的发送功能
import java.util.HashMap; import java.util.Iterator; import java.util.Map; /* * 完成消息的发送功能 * 在发送消息之前, ...
- Swift - 短信发送功能的实现
使用MessageUI.framework框架可以实现短信发送功能,步骤如下: (1)首先判断设备是否有发送短信功能 (2)如果设备允许发送短信,创建一个MFMessageComposeViewCon ...
随机推荐
- MYSQL注入天书之盲注讲解
Background-2 盲注的讲解 何为盲注?盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面.此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注.从ba ...
- RMAN中建立Catalog 用数据库的例子
RMAN中可以备份metadata到control文件,也可以备份metadata到数据库中,此数据库称为catalog database. 本文参考网上文章,建立一个例子: 使用机器: 机器1:ta ...
- django学习笔记(4)
Part 4: Forms and generic views ====> Write a simple form$ edit polls\templates\polls\detail.html ...
- 3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 链接 分析: 对给定的串建立AC自动机,然后数位dp.数位dp的过程中,记录当前在AC自动机的哪个点上,保证不能走到出现了给定串的点. 代码: #include& ...
- CodeForces 593D Happy Tree Party [LCA+并查集]
题意:给一棵树,每条边有一个权值,给两种操作,第一种是询问y向下整除从a到b的最短路径中每条边的权值后y的值,第二种是改变某条边的权值. 思路:y的最大值为1e18,最多除大于等于2的数不超过60次即 ...
- taglib报错The content of element type "taglib" must match "(tlib-version,...)
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE taglib PUBLIC "-// ...
- 菜鸟vimer成长记——第2.4章、cmd-line模式
cmd-line模式又有3个类型:Ex 命令(ex commands).查找模式(Search patterns).Filter 命令(Filter commands).本文主要重点的是Ex 命令和S ...
- iframe的简单使用方法
1.父页面调用子页面的元素(a代表iframe的id或者class,b代表子页面) $('a').contents().find("b") 2.子页面调用父页面的元素(c代表父页面 ...
- Kickstart Round H 2018
打了ks好久都没有更新 诶,自己的粗心真的是没救了,A题大数据都能错 A #include <iostream> #include <cstdio> #include < ...
- opengl矩阵向量
如何创建一个物体.着色.加入纹理,给它们一些细节的表现,但因为它们都还是静态的物体,仍是不够有趣.我们可以尝试着在每一帧改变物体的顶点并且重配置缓冲区从而使它们移动,但这太繁琐了,而且会消耗很多的处理 ...