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所示,右边的那个三极管集电极什么都不接,所 ...
随机推荐
- 3144: [Hnoi2013]切糕
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1526 Solved: 827[Submit][Status] ...
- 更多的使用自定义元素(CustomElement)。
更多的使用自定义元素(CustomElement).
- Java 内存区域与内存溢出异常
一.Java虚拟机内存划分 1.程序计数器 线程私有 可以看做是当前线程所执行的字节码的行号指示器.字节码解释器工作时是通过改变这个计数器的值来选取下一条需要执行的字节码指令. Java虚拟机是通过多 ...
- IOS中UIActionSheet使用方法详解
一.初始化方法 - (instancetype)initWithTitle:(NSString *)title delegate:(id<UIActionSheetDelegate>)de ...
- Jackson 对象与json数据互转工具类JacksonUtil
1,User对象 package com.st.json; import java.util.Date; /** * @Description: JSON序列化和反序列化使用的User类 * @aut ...
- javascript 树形菜单
1. [代码][JavaScript]代码 var ME={ini:{i:true,d:{},d1:{},h:0,h1:0,h2:0},html:function(da,f){var s='& ...
- Objective-C 中Socket常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte[])
最近项目中要用到socket通讯,由于涉及到组包问题,所以需要数据类型之间的来回转换,现在分享出来 如果想要请教Socket的问题请留言,我会随时回答的 1. int类型转16进制hexstring ...
- maven实战(5)-- settings.xml的配置
哈哈 查看maven的官方文档最权威:http://maven.apache.org/settings.html
- NOIP2006题解
传送门 考查题型 模拟 dp T1 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并 ...
- LRU原理和Redis实现——一个今日头条的面试题
看了评论,发现有些地方有问题,更新了图和一些描述,希望可以更清晰一些,也欢迎关注,还会有干货文章 -------- 很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 R ...