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所示,右边的那个三极管集电极什么都不接,所 ...
随机推荐
- DDD战略设计相关核心概念的理解
前言 本文想再讨论一下关于领域.业务.业务模型.解决方案.BC.领域模型.微服务这些概念的含义和关系.初衷是我发现现在DDD领域建模以及解决方案落地过程中,常常对这些概念理解不清楚或者有歧义,导致我们 ...
- springboot 项目 docker化部署
最近公司项目需要docker化,项目所使用的框架是springboot,linux环境.第一次接触docker化方面的技术.做的时候,所接触的新知识比较多,留下此文,以便以后用到的时候快速入手. 修改 ...
- 阶乘问题(大数阶乘)简单 n! (一个大数与一个小数相乘的算法 、一个大数与一个小数的除法算法 *【模板】 )
sdut oj 简单n! Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定一个数n(0 <= n <= 150), ...
- 倒排列表求交集算法 包括baeza yates的交集算法
#ifndef __INTERSECT_HPP__ #define __INTERSECT_HPP__ #include "probe.hpp" namespace themas ...
- CodeForces242D:Connected Components (不错的并查集)
We already know of the large corporation where Polycarpus works as a system administrator. The compu ...
- Prime Cryptarithm
链接 分析:对于三位数我们限定为[100,999],两位数我们限定为[10,99],然后我们依次判断是否满足乘法式且各个数位是否在数列中,若都满足+1 /* PROB:crypt1 ID:wangha ...
- margin-负值
总结:margin负值的影响: 当元素(块级元素)没有设置宽度时:margin负值会增加元素的宽度,当设置宽度时,margin负值只会影响元素的位置. 就是负的边距好像能减小元素在文档流中的尺寸一样, ...
- javascript ==等于与===恒等于
==判断是否等于,只判断数值 ===代表恒等于,不仅判断数值,而且判断类型 var a=5; var b="5"; (a b 只是数值上相等,但是类型并不相等) a==b //tr ...
- bzoj3653
主席树+dfs序 b在a上方时可以O(1)算出来,子树中就用主席树查询区间和,权值线段树的下标是深度,值是子树size-1,每次查询就行了...线段树合并挂了 #include<bits/std ...
- Spring AOP schema找不到报错 原
转自:https://my.oschina.net/zetaplusae/blog/144821 使用jersey+spring构建RESTful服务,并将应用部署在不能连接外网的服务器上.部署时,报 ...