技术标签: 嵌入式裸机开发
串口作用:数据传输、充当控制台
串口通讯,分为同步通讯和异步通讯,我们通常使用的都是异步串口。通讯时,双方先约定好数据帧的格式,即波特率,数据位,停止位,奇偶校验位等。
波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。常用的波特率有38400,115200。
起始位:当线路空闲时候,电平为高。一旦检测到一个下降沿,则视为一个起始位。然后接收方按照约定好的格式,接收这一帧数据。
数据位:一帧中实际有效数据的位数。
停止位:表示这帧数据的结束。
校验位:用于检测数据传输是否正确的位。
串口硬件连接
我们通常使用的RS232的9帧串口,其中最为重要的是2,3,5脚
2:RXD:接收数据
3:TXD:发送数据
5:GND:接地
S3C2440提供了三个独立的串口端口,它们都可以通过查询、中断、DMA方式传输数据
串口驱动程序设计:串口初始化、数据发送、数据接收
串口初始化步骤:
1.配置gpio引脚功能
2.1 设置数据模式
2.2 设置工作模式
3.设置波特率
其中设置gpio引脚功能、设置数据模式、设置工作模式可通过设置相应的寄存器的相应位来完成。
与设置波特率有关的寄存器为UBRDIVn,该寄存器的值应为:
使用的时钟为PCLK,波特率一般取115200
ps:2440设置波特率时,只考虑(UART clock/(buad rate*16))-1的整数部分,而S3C6410,S5pv210不仅考虑整数部分,还考虑小数部分。如210与设置波特率有关的寄存器有UBRDIVn,UDIVSLOTn两个。UBRDIVn存放整数部分,UDIVSLOTn存放与小数部分有关的数值。
对于程序员来说,发送数据只需要将数据写入buffer register,硬件会自动将数据一位位地发送出去。但如果在写入buffer register前,该寄存器并不是空的,则意味着前一数据还在发送中,我们需要等待该数据发送完毕再开始新的发送。判断buffer register是否有数据可通过UTRSTATn寄存器得知
UTRSTATn[0]可用于判断是否有接收到数据,当该位为1时表明接收buffer寄存器有有效数据(数据手册上只说该位会自动置1,并没有说读取该数据后自动清零,但根据程序的功能可推断出该位会在数据被读取后自动清零,UTRSTATn[1],UTRSTATn[2]同理)。
发送数据的buffer register为UTXHn
串口接收到的数据存放在URXHn里
最后还要强调几点关于非FIFO模式下UART中断的一些注意事项:
代码:
#define GPHCON (*(volatile unsigned long*)0x56000070)
#define ULCON0 (*(volatile unsigned long*)0x50000000)
#define UCON0 (*(volatile unsigned long*)0x50000004)
#define UBRDIV0 (*(volatile unsigned long*)0x50000028)
#define UTRSTAT0 (*(volatile unsigned long*)0x50000010)
#define UTXH0 (*(volatile unsigned long*)0x50000020)
#define URXH0 (*(volatile unsigned long*)0x50000024)
#define PCLK 50000000
#define BAUD 115200
void uart_init()
{
//1.配置引脚功能
GPHCON &= ~(0xf<<4);
GPHCON |= (0xa<<4);
//2.1 设置数据格式
ULCON0 = 0b11;
//2.2 设置工作模式
UCON0 = 0b0101;
//3. 设置波特率
UBRDIV0 =(int)(PCLK/(BAUD*16)-1);
}
void putc(unsigned char ch)
{
while (!(UTRSTAT0 & (1<<2)));
UTXH0 = ch;
}
unsigned char getc(void)
{
unsigned char ret;
while (!(UTRSTAT0 & (1<<0)));
// 取数据
ret = URXH0;
if ( (ret == 0x0d) || (ret == 0x0a) ) /*回显功能,即接收到数据,会将该数据发送回去在pc端显示,0d是回车键,0a是换行键*/
{
putc(0x0d);
putc(0x0a);
}
else
putc(ret);
return ret;
}
数学函数(原型声明所在头文件为math.h、stdlib.h、string.h、float.h)intabs(inti)返回整型参数i的绝对值doublecabs(structcomplexznum)返回复数znum的绝对值doublefabs(doublex)返回双精度参数x的绝对值longlabs(longn)返回长整型参数n的绝对值doub...
Laravel-admin 这个后台很好用,几乎省去了html和js的困扰,让后台CURD变得优雅简洁。这是一个自定义面的Demo路由定义: $router-&gt;get('mails/send', '[email protected]'); $router-&gt;post('mails/send', '[email protected]');控制中写法...
去年在咸鱼上买了个游娱宝盒的黑群晖,装着以前笔记本用的2.5"2T的盘在跑.最近想要一个移动硬盘,网上看来看去都不便宜,后来灵机一动,干嘛不买一个大一点的3.5"的盘换下这个2.5"的盘,再买个盒子.不就移动硬盘也有了,NAS空间也大了么?简直一箭双雕.硬盘买回来,怎么换是个问题,毕竟之前NAS上的数据都还想要的.期间根据网上的教程,尝试多次,耗时几天,方勉强成功,坑是非常的多.记录一下:过程新旧盘对拷,新盘是4T的,比旧盘大,要是Windows的话,直接用ghost硬盘对拷就行了,但是群晖是Li
报错:以下是网上找的解决而方案,意思就是没有配置jdk。但是我配置过了,还是会出现。然后尝试让配置文件再生效一次,结果就好了。source /etc/profile也就是说它有时候,反应不过来,可以试试再让配置生效一次再去查看。...
将jquery.js和index.html放在src/main/resource源目录下输入地址 ,发现找不到资源http://localhost:8088/jquery.js1.默认地址查看源码WebMvcAutoConfiguration.java中的WebMvcAutoConfigurationAdapter静态内部类WebMvcAutoConfigurationA...
完整版请参考:http://483v7j.coding-pages.com/2020/07/11/Pension_Calculation/https://mazhaoxin.github.io/2020/07/11/Pension_Calculation/其实我一直很好奇等退休了能拿到多少退休金,那些退休金相当于现在的多少钱。虽然看起来有些遥远,并且应该也有不少人做过类似的计算,但正好最近有个机会需要我动手算一下,于是详细地了解并记录如下。这里只研究企业职工养老金的情况,公务员和事业单位.
在Python中,一个模块被另一个程序第一次引入时,其主程序将全部运行。如果想在模块引入的时候,模块中的某一程序块不执行,那么此时可以用__name__属性来使该程序块仅仅在该模块自身运行时执行。每个模块都有一个__name__属性,当其值时__main__时,表明该模块自身在运行,否则时被引入。...
网上有直接可以运行执行文件可下,但是还是想感觉一下ffmpeg在windows编译的过程.都说不容易,到底有多难呢?这么大一份代码,了解它如何编译后,会对它的框架有一个大致的认识.我的这个编译没有加入任何扩展库,很原始的,很简单的.等我把这个编译完成后,会加入第三方库的,譬如librtmp,x264等.1 linux中编译1 获取代码wget http://ffmpeg.org/release
《Morphable Model For The Synthesis Of 3D Faces》翻译AbstractIntroduction1.1前期及相关工作Databases功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可...
关系型数据库将数据和数据的关系存储到数据库中。数据库(DataBase) ,简称DB数据库管理系统(DBMS)常见的关系型数据库管理系统包括:mysql、sqlserver、oracle、db2等关系型数据库的选择:1. 成本的角度选择2. 数据量或用户数的角度选择3. 安全性的角度选择 DBMS的作用:对数据进行存储、管理、保证数据的一致性和完整性、数据的备份还原的功能。Oracle数据库认证OCAOCPOCM表(table) : 是存储数据最基本的单元
STM32F407 + LAN8720A + LWIP 实现TCP客户端环境说明:开发板:某宝买的,STM32F407IGSTM32CUBEMX5.6HAL Lib Version 1.25(一)配置时钟(二)配置调试串口(三)配置以太网ETH(1)基础配置顺序依次说明:LAN8720A使用的是RMII接口进行配置寄存器自动重连使能MAC地址LAN8720A的物理地址(类似IIC的从设备地址),可配置为0或者1,由LAN8720A的RXER/PHYAD0引脚控制
1:控件调整位置代码实现:以textview为例TextView mTextView = new TextView(context);mTextView.setPadding(left, top, right, bottom);// 通过自定义坐标来放置你的控件或者TextView mTextView = new TextView(context);RelativeLayo