一定要注意交叉开关问题:外设要想正确分配到指定引脚,一定要用配置工具确定分配到指定引脚;如果手动分配一定要仔细验证。这方面有个深刻的教训。

有个项目用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单片机注意事项:的更多相关文章

  1. Silicon C8051F340之时钟系统

    一.背景 做个记录,以备下次快速开发. 二.正文 C8051F340有一个可编程内部高频振荡器.一个可编程内部低频振荡器.一个外部振荡器驱动电路 和一个4倍时钟乘法器.其中可编程内部高频振荡器在系统复 ...

  2. 【转载】51单片机data,bdata,idata,xdata使用注意事项

    "51单片机编程在不同内存空间data xdata bdata定义变量的注意事项": 关键词:51 单片机 编程 不同 内存空间 data xdatabdata 定义 变量 注意事 ...

  3. LPC43xx系列使用IAP的注意事项

    LPC43xx系列使用IAP的注意事项 Tags: LPC43xx IAP 单片机 LPC43xx IAP函数的调用 一般MCU的IAP是,厂商固化一段代码在芯片的某个区域,然后告诉你这个代码的入口地 ...

  4. delphi 串口 关于RS485总线通信协议开发注意事项

    http://blog.csdn.net/shjhuang/article/details/9426739 关于RS485总线通信协议开发注意事项 1       前言 近段时间发现我们系统在进行设备 ...

  5. 51单片机C语言学习笔记8:单片机C51编程规范

    1.单片机C51编程规范- 前言  为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范. 2.单片机C51编程规范-范围 本标准规定了程序设计人员进行程序设计时必须遵循的规范.本 ...

  6. AVR单片机的BOOT区

    BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存 ...

  7. 单片机成长之路(51基础篇) - 007 CH340CH341最全说明

    比较全的CH340,CH341应用说明 CH340 以前用USB转串口时图方便一般也都是直接买现成的USB转串口模块,但是后面设计需要,不等不将CH340这个模块集成到电路板中,经过多次失败,终于得到 ...

  8. 单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区

    BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存 ...

  9. 单片机I/O口的结构的详解

    1.什么是源型 漏型?什么是上拉电阻?下拉电阻?什么是 线驱动输出 集电极开路输出,推挽式输出? 我们先来说说集电极开路输出的结构.集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所 ...

随机推荐

  1. virtualbox创建centos7虚拟机

    安装Virtualbox 下载安装: 直接到官网上下载,https://www.virtualbox.org/wiki/Downloads 然后一键傻瓜式的安装即可. 设置默认虚拟电脑位置: 管理=& ...

  2. 使用Mock.js进行独立于后端的前端开发

    Mockjs能做什么? 基于 数据模板 生成模拟数据. 基于 HTML模板 生成模拟数据. 拦截并模拟 ajax 请求. 能解决的问题 开发时,前后端进度不同步,后端还没完成数据输出,前端只好写静态模 ...

  3. bashdb bashdebug

    sudo  apt-get install bashdb bashdb  --debug 一.列出代码和查询代码类: l 列出当前行以下的10行 - 列出正在执行的代码行的前面10行 . 回到正在执行 ...

  4. Safair css hack

    一下方式不会影响chrome浏览器样式 _::-webkit-full-page-media, _:future, :root .class{ /*此处放css样式*/ }

  5. Mac OS X 开发环境搭建之利用 Parallel Desktop 安装 CentOS 7 [转载]

    背景 在企业级软件系统中,数据库的地位是比较高的,而且一般都要求支持多种数据库,如 Oracle. DB2.MySQL 等,它们的最新版本大多都不再支持 Mac OS X 系统,所以装一个 Linux ...

  6. Javascript中两种最通用的定义类的方法

    在Javascript中,一切都是对象,包括函数.在Javascript中并没有真正的类,不能像C#,PHP等语言中用 class xxx来定义.但Javascript中提供了一种折中的方案:把对象定 ...

  7. java 正则表达式 -Regular Expression

    正则表达式(Regular Expression),可以说就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式.正则表达式定义了字符串的模式,可以用来搜索.编辑或处理文本,不仅限于某一种语言(P ...

  8. 书写优雅的shell脚本(五)- shell中(())双括号运算符

    在使用shell的逻辑运算符"[]"使用时候,必须保证运算符与算数之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(())"结构 ...

  9. web 基本概念辨异 —— URI 与 URL

    两者的相同点: 都是唯一的,对资源(R:Resource)起到唯一的标识作用: 两者的不同点: URL 是 URI 的子集(URI 是父类,URL 是子类),是一种特定的实现形式: URI 可以是身份 ...

  10. I.MX6 不一定要设置BOOT_MODE进入烧录模式

    /************************************************************************* * I.MX6 不一定要设置BOOT_MODE进入 ...