在通信领域内,有两种数据通信方式:并行通信和串行通信,串口的数据传输是以串行方式进行的,串口在数据通信中,一次只传输一个比特的数据,串行数据的传输速度用bps或波特率来描述。

常用术语:

1.单工(simplex):仅能进行一个方向的数据传输。

2.半双工(half duplex):数据可以在两个方向上进行传输,但这种传输绝对不能同时进行(同步)

3.全双工(full duplex):能够在两个方向同时进行数据的传输(异步)。

我们的开发板和PC之间输出数据都是靠高低电平来实现,我们就需要约定一个串口协议,包括起始位,停止位,数据长度,校验位(奇偶校验),以及bps,通过这个协议我们通过UART进行高低电平检测达到通信传输数据的目的。

硬件流控制:

来看看实际收发数据是如何进行的,首先我们发射端和接收端缓存区工作方式需要设置为轮询或中断或DMA(内存访问,不安全),并且为了防止数据发送产生粘包现象,我们需要对发送缓存区进行判空操作,对接受缓存区进行判满操作,可以通过UTRSTAT寄存器的状态来判断。

上图就是我们传输的全过程图,我们可以再芯片手册中找到对应的寄存器进行设置,最后我会通过一个代码实例来展示。

可以看到在UTRSTAT寄存器的第1位第0位分别表示发送区和接收区的状态,通过位运算我们就可以判断当前发射区和接收区的状态,从而让CPU知道什么时候该写数据接数据。

现在我们可以通过在超级终端中输入对应的字符来控制led灯的亮和灭:

#include <string.h>
#include <stdio.h>
void delay(int m)
{int i, j;for(i = 0; i < m; i++)for(j = 0; j < 256; j++);
}#define GPA1CON            *(volatile unsigned int *)0x11400020
#define ULCON           *(volatile unsigned int *)0x13820000
#define UBRDIV          *(volatile unsigned int *)0x13820028
#define UFRACVAL        *(volatile unsigned int *)0x1382002c
#define UCON            *(volatile unsigned int *)0x13820004
#define UTRSTAT         *(volatile unsigned int *)0x13820010
#define UTXH            *(volatile unsigned int *)0x13820020
#define URXH            *(volatile unsigned int *)0x13820024#define GPX2CON         *(volatile  unsigned int *)0x11000c40
#define GPX2DAT         *(volatile  unsigned int *)0x11000c44void led2_init()
{// GPX2CON = GPX2CON & 0x0fffffff | (1 << 28)GPX2CON    = GPX2CON & (~(0xf << 28)) | ( 0x1 << 28 );
}
void led2_on()
{GPX2DAT = GPX2DAT | (1 << 7);
}
void led2_off()
{GPX2DAT = GPX2DAT & (~(1 << 7));
}
void gpio_init()
{//设置GPA1_0复用 UART_2_RXD功能,GPA1_1复用 UART_2_TXD功能// GPA1CON   = GPA1CON & ( ~(0xff << 0)) | (0x2 << 0) | (0x2 << 4);GPA1CON    = GPA1CON & ( ~(0xff << 0)) | (0x22 << 0);
}
void uart_init()
{//设置串口协议:数据位(8)、停止位(1)、奇偶校验位(无): 0000011ULCON |= 0x3;//设置波特率:115200// DIV_VAL = (PCLK_UART)/ (bps *16) -1//         = 100MHZ / (115200*16)-1//         = 100000000 / 115200/16-1//         = 53.25// UBRDIV  = 53// UFRACVAL = 0.25*16 = 4UBRDIV = 53;UFRACVAL = 4;//设置发送和接受数据的 工作模式: 中断或轮询 0101UCON = 0x05;
}
void uart_send(char ch)
{// while( UTRSTAT & (0x1 << 1) != 0x2 );while( !(UTRSTAT & (0x1 << 1)) );UTXH = ch;
}
char uart_recv()
{// while( UTRSTAT & (0x1) != 1);while( !(UTRSTAT & (0x1)));return URXH & 0xff;
}void send(char *p)
{while(*p){uart_send(*p++);}
}int myStrcmp(char *s1, char *s2)
{}int main()
{char *p = "hello world";gpio_init();uart_init();led2_init();send(p);send("\r\n");int i = 0;while(1){char buf[12] = {0};for(i = 0; i < 12; i++){buf[i] = uart_recv();if( buf[i] == ' ')break;uart_send(buf[i]);}send("\r\n");if ( myStrcmp(buf, "led_on") == 0){led2_on();} else if( myStrcmp(buf, "led_off") == 0){led2_off();}}
}

主要还是通过芯片手册找到对应的寄存器进行相应的工作模式设置!!!

看门狗

看门狗,是一个定时器电路,一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗段,给WDT清零,如果超过规定的时间不喂狗,WDT定时超时,就会给出一个复位信号到MCU,让MCU复位,防止MCU死机,看门狗的作用就是防止程序发生死循环,或者说程序跑飞。

工作原理:

在系统运行以后就启动了看门狗的计数器,看门狗就会开始自动计数,到了一定的时间还不去喂狗,那么看门狗计数器就会溢出导致看门狗中断,造成系统复位。

一般我们需要对看门狗进行设置,需要通过下面这张图的步骤:

看一段代码:这段代码详细介绍了看门狗的设置过程。

void delay(int m)
{int i, j;for(i = 0; i < m; i++)for(j = 0; j < 256; j++);
}#define GPD0CON            *(volatile  unsigned int *)0x114000a0
#define GPD0DAT         *(volatile  unsigned int *)0x114000a4
//蜂鸣器设置
void beep_init()
{GPD0CON    = GPD0CON & (~(0xf << 0)) | ( 0x1 << 0 );
}
void beep_on()
{GPD0DAT = GPD0DAT | (1 << 0);
}
void beep_off()
{GPD0DAT = GPD0DAT & (~(1 << 0));
}/***   wdt频率 = plck / 预分频 / 二分频*  定时长  = (比较寄存器值 - 计数寄存器值) / wdt频率** */#define WTCON     *(volatile unsigned int *)0x10060000
#define WTDAT       *(volatile unsigned int *)0x10060004
#define WTCNT       *(volatile unsigned int *)0x10060008void wdt_init()
{//设置预分频值 255WTCON |= 0xff << 8;//设置二分频值 128WTCON |= 0x3 << 3;//设置 WTCNT 计数寄存器值 1000WTCNT = 10000;//设置 WTDAT 数据寄存器值WTDAT = 10000;//设置 超时 产生复位信号 0x1WTCON |= 0x1;//启动 wdt的 定时器WTCON |= 1 << 5;
}int main()
{wdt_init();beep_init();while(1){//喂狗,内部自动刷新cnt寄存器//WTDAT = 10000; //只有超时触发终端的时候,向DAT寄存器写数据,会自动搬移到 CNT寄存器WTCNT = 10000;   //CNT未 溢出产生复位信号时,必须通过 CNT重新装载,才能保证不产生复位信号beep_on();delay(5);beep_off();delay(15);}
}

ARM结构体系5:串行通信(双线UART)和看门狗相关推荐

  1. 嵌入式arm(五)裸机编程之简单的使用{看门狗}{PWM}{ADC}快速练习

    使用开发板:FS4412,Soc:Exynos4412,内核型号:cortex-A9,架构:armv7: 文档:开发板原理图,Soc数据手册: 环境:文件编写及编译:Linux:下载程序:超级终端hy ...

  2. ARM结构体系和接口技术

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.ARM简介 二.ARM体系架构 2.1.内核 寄存器 工作模式 异常 2.2.指令 简介 汇编指令 指令的01编码 ...

  3. ARM结构体系3:ARM指令的寻址和异常中断处理

    目录 ARM处理器的八种寻址方式 1.立即数寻址 2.寄存器寻址 3.寄存器间接寻址 4.寄存器移位寻址 5.基址变址寻址 6.多寄存器寻址 7.相对寻址 8.堆栈寻址 9.GNU汇编伪指令 异常中断 ...

  4. Linux——Linux驱动之基本理论常识总结(什么是Linux驱动?Linux驱动需要掌握哪些?ARM处理体系架构及前世今生)

     [系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <QT开发实战> <嵌入式通用开发实战> <从0到1学习嵌入式Linux开发> 目录 0 ...

  5. navicat premium 链接postgresql 无法加载表_POSTGRESQL 数据库结构体系 ||| 东来西去 三个角度看...

    POSTGRESQL 的数据库体系结构是了解POSTGRESQL 数据库的整体概念的一个开始,而数据库的结构体系这个词有点大,所以这里从三个角度出发来看POSTGRESQL 结构 1  从数据库的使用 ...

  6. 简述力法计算弹性固定无铰拱的原理_《隧道结构体系设计》PPT课件.ppt

    <<隧道结构体系设计>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<隧道结构体系设计>PPT课件.ppt(51页珍藏版)>请在装配图网上搜索. ...

  7. x64 结构体系下的内存寻址

    转载请注明出处:http://www.cnblogs.com/lanrenxinxin/p/4735027.html 在阅读NewBluePill源码的时候,看内存的那一块简直头疼,全是x64下的寻址 ...

  8. 柱承重式钢模块建筑结构体系适用高度研究

    作者:陈志华 冯云鹏 刘佳迪 刘洋 钟旭 模块建筑网 导语 摘要:模块建筑作为一种新兴的建筑体系,具有较高的预制化和装配化程度,符合建筑工业化以及绿色建筑的发展要求,但国内的模块建筑大多只应用于低多层 ...

  9. 如何将自适应设计理论及韧性结构体系技术应用于穿越活动断裂带的隧道建设

    如何将自适应设计理论及韧性结构体系技术应用于穿越活动断裂带的隧道建设 如何将自适应设计理论及韧性结构体系技术应用于穿越活动断裂带的隧道建设 问题描述: 问题背景: 最新进展: 重要意义: 如何将自适应 ...

最新文章

  1. Xamarin环境搭建
  2. 从落后的传统WAN转向SD-WAN—Vecloud
  3. VS 调试断点命中了,程序无法再断点处中断
  4. 让小程序在自有App中启动的技术来了:mPaaS小程序架构深度解析
  5. go get github.com/tealeg/xlsx timeout 超时
  6. AndroidStudio新建项目报错build failed
  7. matlab chirp函数模糊函数,8个OFDM-Chirp波形的时频域图及自(互)模糊函数图
  8. atitit.故障排除------有时会错误com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: soc
  9. Clob,Blob,InputStream,byte 互转
  10. Kettle详细使用教程
  11. 【运维面试】面试官: 你们公司的上线流程是怎么样的?
  12. php mysql 考勤系统_考勤问题思路和解决
  13. otg usb 定位_USB接口中的秘密——强大的OTG功能
  14. Failed to parse mapping resource......
  15. 【Java安全技术探索之路系列:Java可扩展安全架构】之八:JCP(一):JCP架构介绍
  16. 【百度网盘】 个人资源共享
  17. C语言基础---3.格式化输出总结---%d ,%s,%f %.3f,%m.ns 以及sprintf函数
  18. Eclipse 输入的汉字都变成了繁体
  19. 前端JSer装逼手册
  20. 软考嵌入式系统设计师2011年上午试题总结

热门文章

  1. 深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星
  2. 沙漠中的太空榜样,阿联酋的深空野心
  3. 六成应用开发不需要程序员,一大批程序员即将失业
  4. 使用酸性溶液对硅晶片进行异常各向异性蚀刻
  5. 聚观早报 |必应成为中国第一大桌面搜索引擎;快手上市后首次盈利
  6. 浅谈日本服务器与美国服务器对比
  7. 凤姐、兽一兽、王然三个80后女孩的不同人生
  8. python 数据分析 实际案例-Python数据分析案例实战
  9. 服务好“最后一公里”,高效CDN架构经验
  10. 新手蓝牙耳机选购指南:双12不想踩雷五款高性能蓝牙耳机不妨试试