c8051单片机注意事项:
一定要注意交叉开关问题:外设要想正确分配到指定引脚,一定要用配置工具确定分配到指定引脚;如果手动分配一定要仔细验证。这方面有个深刻的教训。
有个项目用c8051f020,用到2个串口,硬件已经确定好了,我主要负责软件,要想让UART0/1分别分配到指定的(P0.0~p0.1)/(P0.4~p0.5),根据配置工具测试发现必须配置串口0、SMBUS 、串口1而SPI0禁用。但SMBUS板子上引出暂未使用,所以当时采用手动配置交叉开关,模块一个一个调试,所以就没有使能smbus,这就造成了后面的串口1无论如何都用不起来,同样的2个串口(TTI-微型打印机;TTL-CP2102,波特率也相同,都可以用串口1做公用的波特率发生器)。后来仔细检查各项配置,才发现这个隐藏很深的低级疏漏,耽误了一天半时间。
附注串口的配置:
1 除了对应的交叉开关使能,其它前面的外设交叉开关也要正确使能;
2 TX设置成推挽输出。
3选择串口的工作模式,波特率的产生方式(串口1可用定时器1(默认)/定时器2;串口2可用定时器1(默认)/定时器4作为波特率发生器,即定时器1可以作为串口1和串口2的公用波特率发生器)、波特率是否/2。
4 根据波特率和指定的定时器设置定时器的工作方式(一般选择8位自动重装)、时间基准源、初值(高8位由波特率产生,低8位等于高8位)。
5 发送完成标志位置1触发进入手动发送或进入中断。
串口中断发送注意事项:
用串口1和PC进行自定义协议数据通讯,在测试握手包(没有握手成功连续发送,直到PC收到返回确认信息才停止发送)的发现发送18字节的握手包,第6 、12、17字节丢失,用非中断发送就不会出现;后来分别怀疑是波特率问题(准确的波特率计算公式)、串口调试助手软件问题(选用公认好用的调试助手软件)、其它中断干扰问题(关闭其它中断)、数据线电磁干扰问题(直接接到PC不经过HUB,电源适配器线)并一一排除与这些不相关。最终发现是由于在波特率很高、主频很高(SYSCLE22118400HZ)、在主程序里面不停发送而无恰当延时造成的,并且如果延时不够还是会出现更少字符的丢失、校验码不正确的现象,直到延时给的足够,一切问题消失。
一般我们是将接收用中断来做,发送用轮询来做(其实效率也不低操作方便,适合阻塞式先后逻辑的发送场合);中中断发送的方法:自定义结构体(包含指针、发送和接收数据的长度、收发完成标志),每次在要发送的地方给结构体赋值(指针总指向公用缓冲区的首地址,收发的长度信息,及标志清零),在中断中根据长度和收发缓冲区控制收发,需要注意的是添加超时重发处理(自定义超时结构体(超时标记、超时定时、超时计数器),在定时中断中累加计数器并设置标记,在发送中清零计数器,在开始发送的时候判断超时标记和重发次数),此种方法适合双机通讯(需要定义协议和通讯状态控制);定时器定时发送法:也有的根据波特率计算单个字符发送的时间设置定时器的初值,在定时器中根据开始发送标志、数据指针、发送长度、控制发送长度,发送完成标志等信息发送单个字节,在要发送的地方设置要发送标志、发送指针和长度启动发送,根据发送完成标志判断是否发送完成。
c8051单片机注意事项:的更多相关文章
- Silicon C8051F340之时钟系统
一.背景 做个记录,以备下次快速开发. 二.正文 C8051F340有一个可编程内部高频振荡器.一个可编程内部低频振荡器.一个外部振荡器驱动电路 和一个4倍时钟乘法器.其中可编程内部高频振荡器在系统复 ...
- 【转载】51单片机data,bdata,idata,xdata使用注意事项
"51单片机编程在不同内存空间data xdata bdata定义变量的注意事项": 关键词:51 单片机 编程 不同 内存空间 data xdatabdata 定义 变量 注意事 ...
- LPC43xx系列使用IAP的注意事项
LPC43xx系列使用IAP的注意事项 Tags: LPC43xx IAP 单片机 LPC43xx IAP函数的调用 一般MCU的IAP是,厂商固化一段代码在芯片的某个区域,然后告诉你这个代码的入口地 ...
- delphi 串口 关于RS485总线通信协议开发注意事项
http://blog.csdn.net/shjhuang/article/details/9426739 关于RS485总线通信协议开发注意事项 1 前言 近段时间发现我们系统在进行设备 ...
- 51单片机C语言学习笔记8:单片机C51编程规范
1.单片机C51编程规范- 前言 为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范. 2.单片机C51编程规范-范围 本标准规定了程序设计人员进行程序设计时必须遵循的规范.本 ...
- AVR单片机的BOOT区
BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存 ...
- 单片机成长之路(51基础篇) - 007 CH340CH341最全说明
比较全的CH340,CH341应用说明 CH340 以前用USB转串口时图方便一般也都是直接买现成的USB转串口模块,但是后面设计需要,不等不将CH340这个模块集成到电路板中,经过多次失败,终于得到 ...
- 单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区
BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存 ...
- 单片机I/O口的结构的详解
1.什么是源型 漏型?什么是上拉电阻?下拉电阻?什么是 线驱动输出 集电极开路输出,推挽式输出? 我们先来说说集电极开路输出的结构.集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所 ...
随机推荐
- 无节操cocos2d-js游戏
1. <看谁抽得快> 2. <拍苍蝇> 3. <月饼达人> 4. <亲吻小游戏> 下面这些是本人做的,需要源代码的可以回复我 ps:全部采 ...
- RSA前端JS加密,后端JAVA解密实现
用RSA非对称加密方式实现.后台生成rsa密钥对,然后在页面设置rsa公钥,提交时用公钥加密密码,生成的密文传到后台,后台再用私钥解密,获取密码明文.这样客户端只需要知道rsa加密方式和公钥,前台不知 ...
- file类简单操作
file类可表示文件或文件夹 import java.io.File; import java.io.FilenameFilter; import java.io.IOException; impor ...
- id、NSObject *、id<NSObject>、instancetype
1. id 与 NSObject * (1) id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的 ...
- UILabel与UIFont的用法和属性的一些总结
初始化一个UILabel对象,并初始化大小 UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 100) ...
- Delphi服务端和PHP客户端通过Socket通信
在开始之前看下效果 PHP页面作为客户端发送请求给作为服务端的Delphi应用程序 PHP客户端页面打开如下 Delphi服务端应用程序打开如下 每次PHP页面刷新一下,Delphi的文本框都显示&q ...
- 用secureCRT ssh登陆不显示用户名和路径解决方案 分类: 软件工具学习 2015-03-18 16:52 36人阅读 评论(0) 收藏
方法1 每次开始的时候输入 bash 虽然只能保存一次,但是简便. 方法2 用 vi ~/.bash_profile 编辑这个文件, 有时会提示这个文件不存在,直 ...
- Swift(二)控制流
要处理条件逻辑,使用 if 和 switch ,要处理循环逻辑,使用 for-in, for, while, 和 do-while .包着条件或者循环的括号可加可不加.处理逻辑体的花括弧是必须加的. ...
- UUIDUtils
package com.cc.hkjc.util; import java.util.UUID; /** * 字符串工具类 * * @author:匿名 * */public class UUID ...
- BZOJ_1295_[SCOI2009]最长距离_dij
BZOJ_1295_[SCOI2009]最长距离_dij Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那 ...