(1) 整个串口通信相关程序包含 2 部分:uart_init 负责初始化串口,uart_putc 负责发送一个字节。
(1) 初始化串口的 Tx 和 Rx 引脚所对应的GPIO(查原理图可知 Rx 和 Rx 分别对应GPA0_1和GPA0_0)
可以看到,S5PV210 上面一共有 4 个 UART 外设。

可以看到,UART0 外设的RXD/TXD 对应的引脚名称如下。

因此,在我们的核心板原理图上可以找到,UART0 的 RXD/TXD 引脚的对应关系:
UART0 RXD -> GPA0_0
UART0 TXD -> GPA0_1

(2) GPA0CON(0xE0200000),bit[3:0] = 0b0010 bit[7:4] = 0b0010

(3) 初始化这几个关键寄存器:UCON0, ULCON0, UMCON0, UFCON0, UBRDIV0, UDIVSLOT0.

(1) ULCON0 = 0x3 // 0校验位、8数据位、1停止位

(2) UCON = 0x5 // 发送和接收都是polling mode


(3) UMCON0 = 0x0 // 禁止modem、afc

(4) UFCON0 = 0x0 // 禁止FIFO模式


(5) UBRDIV0 和 UDIVSLOT0 和波特率有关,要根据公式去算的




/* uart.c */
#define GPA0CON 0xE0200000
#define UCON0 0xE2900004
#define ULCON0 0xE2900000
#define UMCON0 0xE290000C
#define UFCON0 0xE2900008
#define UBRDIV0 0xE2900028
#define UDIVSLOT0 0xE290002C
#define UTRSTAT0 0xE2900010
#define UTXH0 0xE2900020
#define URXH0 0xE2900024
#define rGPA0CON (*(volatile unsigned int *)GPA0CON)
#define rUCON0 (*(volatile unsigned int *)UCON0)
#define rULCON0 (*(volatile unsigned int *)ULCON0)
#define rUMCON0 (*(volatile unsigned int *)UMCON0)
#define rUFCON0 (*(volatile unsigned int *)UFCON0)
#define rUBRDIV0 (*(volatile unsigned int *)UBRDIV0)
#define rUDIVSLOT0 (*(volatile unsigned int *)UDIVSLOT0)
#define rUTRSTAT0 (*(volatile unsigned int *)UTRSTAT0)
#define rUTXH0 (*(volatile unsigned int *)UTXH0)
#define rURXH0 (*(volatile unsigned int *)URXH0)
/**************************************************************************************/
#define ULCON0_FUNC_NO_PARITY_MODE (0b000 << 3) // 无校验
#define ULCON0_FUNC_NUMBER_STOP_0_BIT (0b0 << 2) // Stop bit: 0
#define ULCON0_FUNC_WORLD_LENGTH_8_BIT (0b11 << 0) // 8 位数据位
/**************************************************************************************/
#define UCON0_FUNC_CLOCK_SELECTION_PLCK (0b0 <<10) //选择PCLK
#define UCON0_FUNC_LOOPBACK_MODE_NORMAL (0b0 << 5) //正常模式
#define UCON0_FUNC_TX_MODE_POLLING (0b01 << 2) //轮询模式
#define UCON0_FUNC_RX_MODE_POLLING (0b01 << 0) //轮询模式
/**************************************************************************************/
#define UFCON0_FUNC_FIFO_DISABLE (0b0 << 0) //禁止 FIFO 模式
/**************************************************************************************/
#define UTRSTAT0_FUNC_TRANSMITTER_EMPTY (0b1 << 2) //发送缓冲区为空
#define BIT_LOCATION_UTRSTAT0_FUNC_TRANSMITTER_EMPTY (0b1 << 2) //发送缓冲器状态位
#define UTRSTAT0_FUNC_RECEIVE_BUFFER_DATA_READY (0b1 << 0) //接收缓冲区已接收到数据
#define BIT_LOCATION_UTRSTAT0_FUNC_RECEIVE_BUFFER_DATA_READY (0b1 << 0) //接收缓冲区状态位
/**************************************************************************************/
#define BIT_WIDTH_GPA0 (4)
#define GPA0_0_FUNC_INPUT (0x0 << 0 * BIT_WIDTH_GPA0)
#define GPA0_0_FUNC_OUTPUT (0x1 << 0 * BIT_WIDTH_GPA0)
#define GPA0_0_FUNC_UART0RXD (0x2 << 0 * BIT_WIDTH_GPA0)
#define GPA0_0_FUNC_GPA0_INT0 (0Xf << 0 * BIT_WIDTH_GPA0)
#define GPA0_1_FUNC_INPUT (0x0 << 1 * BIT_WIDTH_GPA0)
#define GPA0_1_FUNC_OUTPUT (0x1 << 1 * BIT_WIDTH_GPA0)
#define GPA0_1_FUNC_UART0TXD (0x2 << 1 * BIT_WIDTH_GPA0)
#define GPA0_1_FUNC_GPA0_INT1 (0Xf << 1 * BIT_WIDTH_GPA0)
#define BIT_LOCATION_GPA0_CON0 (0xf << 0 * BIT_WIDTH_GPA0)
#define BIT_LOCATION_GPA0_CON1 (0xf << 1 * BIT_WIDTH_GPA0)
/**************************************************************************************/
定义好了访问寄存器的宏之后,将来写代码时直接使用即可。
给 GPA0CON 的相应 bit 位赋值为相应值,用 C 语言位操作来完成。
// 初始化 TX RX 对应的 GPIO 引脚
rGPA0CON &= ~(BIT_LOCATION_GPA0_CON0 | BIT_LOCATION_GPA0_CON1);
rGPA0CON |= GPA0_0_FUNC_UART0RXD | GPA0_1_FUNC_UART0TXD;
依据上节中分析的值进行依次设置即可。
//几个关键寄存器的设置
rULCON0 = ULCON0_FUNC_NO_PARITY_MODE | ULCON0_FUNC_NUMBER_STOP_0_BIT | ULCON0_FUNC_WORLD_LENGTH_8_BIT;
rUCON0 = UCON0_FUNC_CLOCK_SELECTION_PLCK | UCON0_FUNC_LOOPBACK_MODE_NORMAL | UCON0_FUNC_TX_MODE_POLLING | UCON0_FUNC_RX_MODE_POLLING;
rUMCON0 = 0;
rUFCON0 = UFCON0_FUNC_FIFO_DISABLE;
(1)第一步,用 PCLK_PSYS 和目标波特率去计算 DIV_VAL: DIV_VAL = (PCLK / (bps x 16)) - 1
(2)第二步,UBRDIV0 寄存器中写入 DIV_VAL 的整数部分
(3)第三步,用小数部分乘以 16 得到 1 的个数,查表得 uBDIVSLOT0 寄存器的设置值

//波特率设置 DIV_VAL = (PCLK / (bps X 16) ) - 1
//PCLK_PSYS 用 66MHz 算 DIV_VAL = (66 X 10^6 / (115200 X 16)) - 1 = 34.807
//小数是 0.8,0.8 x 16 = 12.8
rUBRDIV0 = 34;
//12 0xDDDD(1101_1101_1101_1101b)
//13 0xDFDD(1101_1111_1101_1101b)
rUDIVSLOT0 = 0xDDDD;
(1) 写发送函数,主要发送前要用 while 循环等待发送缓冲区为空才能发送。
//串口接收程序,轮询方式,接收一个字节
void uart_putc(char c)
{
//串口发送一个字符,其实就是把一个字节丢到发送缓冲区中去
//因为串口控制器发送 1 个字节的速度远远低于 CPU 的速度,所以 CPU 发送1个字节前必须
//确认串口控制器当前缓冲区是空的(意思就是串口已经发完了上一个字节)
//如果缓冲区非空则位为0,此时应该循环,直到位为1
while ((rUTRSTAT0 & BIT_LOCATION_UTRSTAT0_FUNC_TRANSMITTER_EMPTY) != UTRSTAT0_FUNC_TRANSMITTER_EMPTY) ;
rUTXH0 = c;
}
源自朱有鹏老师.
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。
我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一
使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案
我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一