S5PV210裸机(三):串口

news2024/10/5 2:14:29

本文主要探讨210串口相关知识。

同步通信和异步通信
        发送和接收方同时钟工作叫同步,否则叫异步
        同步通信频率固定,双方通信频率不固定,,接收方收到起始信号开始接收信息

电平信号和差分信号
        电平信号和差分信号是描述通信线路传输方式
        电平信号传输线中有参考电平线(GND),信号值由信号线电平和参考电平电压差决定
        差分信号传输线中没有参考电平,只有信号线,1和0由信号线之间电压差决定
        电平信号通信线间电平差异易受干扰,传输易失败
        差分信号不易受干扰,传输稳定(常用)发送快

并行接口和串行接口
        电平信号:电平线+信号线可传递1位二进制(常用)
        差分信号:2信号线(彼此差分)发送1位二进制(8位需16线)
        异步串行差分接口常用(USB)

串口通信
        串口通信特点:异步、电平信号、串行
        异步:发送方和接收方之间没有统一时钟信号
        电平信号:电平信号传输
        串行通信:每次同时传输1位二进制位

RS232电平和TTL电平
        电平信号是信号线电平与考线电平压差值区别1,0
        RS232中-3V~-15V表示1;+3~+15V表示0
        TTL电平+5V表示1,0V表示0
        RS232电平定义大,接收干扰大、距离远,TTL相反
        RS232接口传输距离小于15米,TTL用在芯片之间

波特率、起始位、数据位、奇偶校验位、停止位
        波特率是串口通信速率,每秒钟传输二进制位。(B = 9600,t = 1/9600 = 104us)
        通信双方设定相同波特率才能通信,否则接收信息解析会出错
        串口通信收发是周期性的,由起始位+数据位+奇偶校验位+停止位组成
        起始位表示发送方开始;数据位是有效信息位;奇偶校验位是校验数据位;停止位表示结束标志
        起始位是串口通信标准指定,由通信线电平变反映(内置)
        数据位是发送的有效数据(8)
        奇偶校验位是据位进行奇偶校验(1)
        停止位是串口通信标准指定,由通信线电平变化反映(1)
        串口通信是异步通信,通信双方约定好通信参数,参数包括:波特率、数据位、奇偶校验位、停止位

串口通信原理
        单工就是单方向,双工是双方同时收发,同时只能单方向收发是半双工
        通信线:Rx,Tx,GND
        SoC内串口引脚输出TTL电平(X210未使用),每个串口有3线(Tx、Rx、GND)可提供外设使用
        串口通信发送方隔一段时间(波特率)将信息(1,0)放到通信线上,逐二进制位发送
        接收方定时读取通信线上电平高低来区分1,0依次读取数据位、奇偶校验位、停止位,停止位
        DB9接口中有9通信线,3线为GND、Tx、Rx其余6和流控(不使用)有关

210串口
        串口包含发送器和接收器,串口控制器接在APB总线上
        发送器由发送缓冲区和发送移位器构成,发送信息时将二进制信息流一帧帧(8位)写入发送缓冲区,发送移位器自动读取一帧数据发送到Tx通信线上
        接收器由接收缓冲区和接收移位器构成,接收信息时,Rx通信线上的信息通过接收移位器将该二进制信息流保存到接收缓冲区,缓冲区满时产生中断给CPU,CPU读取数据

FIFO模式和DMA模式和IrDA模式(210)
        典型串口发送和接收缓冲区大小为1字节,发送和接收只能处理1帧数据,中断信号太多,影响CPU的处理其他事务
        FIFO扩展发送或接收缓冲区(轻量级)
        DMA是DSP的一种技术,交换数据时不需要CPU参与,模块独立完成,大量数据发送或接收
        IrDA是发送方固定间隔时间向接收方发送红外信号,接收方每隔固定时间去判断有无红外线信号来接收

210串口相关
        时钟:PCLK_PSYS,66MHz

       
        
        Tx和Rx的GPIO,Rx为GPA0_1,Rx为GPA0_0,GPA0CON(0xE0200000)bit[3:0] = 0b0010     bit[7:4] = 0b0010    


关键寄存器UCON0 ULCON0 UMCON0 UFCON0
ULCON0 = 0x3        // 0校验位、8数据位、1停止位
UCON0 = 0x5            // 发送和接收都是polling mode
UMCON0 = 0x0        // 禁止modem、afc
UFCON0 = 0x0        // 禁止FIFO模式


波特率 

        寄存器: UBRDIV0 UDIVSLOT0

 

        UBRDIVn设置波特率,UDIVSLOTn校准波特率
        DIV_VAL: DIV_VAL = (PCLK / (bps x 16)) - 1
        UBRDIV0为DIV_VAL整数
        小数*161并查表得uBDIVSLOT0值

demo1:

        编写210串口

start.S

#define WTCON           0xE2700000
#define SVC_STACK       0xd0037d80

.global _start
_start:
        //关看门狗
        ldr r0, =WTCON
        ldr r1, =0x0
        str r1, [r0]

        //设置SVC栈
        ldr sp, =SVC_STACK

        //开/关icache
        mrc p15,0,r0,c1,c0,0;                   // 读出cp15的c1到r0中
        orr r0, r0, #(1<<12)                    // bit12 置1  开icache
        mcr p15,0,r0,c1,c0,0;

        bl main
        b .

mian.c

void delay_time()

{
  volatile unsigned int i = 900000;    
  while (i--);              
}

int main()
{
  //init uart
  init_uart();
  //send data
  while(1)
  {
    send_data('w');
    delay_time();
  }
  return 0;
}

uart.c

#define  GPA0CON0       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 rGPA0CON0       (*(volatile unsigned int *)GPA0CON0)
#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)

void init_uart()
{
  //set GPIO uart mode(TX,RX)
  rGPA0CON0 &= ~(0xff); 
  rGPA0CON0 |= ((1 << 2) | (1<< 6));
  //set uart polling mode
  rUCON0 = 0x5;
  //set uart,prohibit afc 
  rUMCON0 = 0x0;
  //set uart,prohibit fifo
  rUFCON0 = 0x0;
  //set clock device frequence
  //DIV_VAL = (PCLK / (bps x 16)) -1
  //DIV_VAL = (66000000 / (115200*16)) -1 = 34.8
  rUBRDIV0 = 34;
  //0.8 * 16 = 13,check 210 table
  rUDIVSLOT0 = 0xdfdd;
}

void send_data(char cdata)
{
  //judge send buff is'not or is empty,then send data 
  while (!(rUTRSTAT0 & (1 << 1)));
  rUTXH0 = cdata;
}

char get_data()
{
  //judge get buff is'not or is empty,then get data
  while (!(rUTRSTAT0 & 1));
  return (rURXH0 & 0x0f);
}

Makefile

uart.bin: start.o uart.o main.o
        arm-linux-ld -Ttext 0x0 -o uart.elf $^
        arm-linux-objcopy -O binary uart.elf uart.bin
        arm-linux-objdump -D uart.elf > uart_elf.dis
        gcc mkv210_image.c -o mkx210
        ./mkx210 uart.bin 210.bin
%.o : %.S
        arm-linux-gcc -o $@ $< -c -nostdlib
%.o : %.c
        arm-linux-gcc -o $@ $< -c -nostdlib
clean:
        rm *.o *.elf *.bin *.dis mkx210 -f

demo2:

        串口移植printf

start.S

#define WTCON           0xE2700000
#define SVC_STACK       0xd0037d80

.global _start
_start:
        //关看门狗
        ldr r0, =WTCON
        ldr r1, =0x0
        str r1, [r0]

        //设置SVC栈
        ldr sp, =SVC_STACK

        //开/关icache
        mrc p15,0,r0,c1,c0,0;                   // 读出cp15的c1到r0中
        orr r0, r0, #(1<<12)                    // bit12 置1  开icache
        mcr p15,0,r0,c1,c0,0;

        bl main
        b .

main.c

#include "stdio.h"

void delay_time()

{
  volatile unsigned int i = 900000;    
  while (i--);              
}

int main(void)
{
	uart_init();
	
	int num = 18;
	putc('h');
	putc('e');
	putc('l');
    putc('l');
    putc('o');
	while (1)
	{
		printf("test for printf, a = %d.\n", a);
        delay_time();
	}
	
	return 0;
}

uart.c

#define  GPA0CON0       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 rGPA0CON0       (*(volatile unsigned int *)GPA0CON0)
#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)

void init_uart()
{
  //set GPIO uart mode(TX,RX)
  rGPA0CON0 &= ~(0xff); 
  rGPA0CON0 |= ((1 << 2) | (1<< 6));
  //set uart polling mode
  rUCON0 = 0x5;
  //set uart,prohibit afc 
  rUMCON0 = 0x0;
  //set uart,prohibit fifo
  rUFCON0 = 0x0;
  //set clock device frequence
  //DIV_VAL = (PCLK / (bps x 16)) -1
  //DIV_VAL = (66000000 / (115200*16)) -1 = 34.8
  rUBRDIV0 = 34;
  //0.8](//0.8) * 16 = 13,check 210 table
  rUDIVSLOT0 = 0xdfdd;
}

void putc(char cdata)
{
  //judge send buff is'not or is empty,then send data 
  while (!(rUTRSTAT0 & (1 << 1)));
  rUTXH0 = cdata;
}

char getc()
{
  //judge get buff is'not or is empty,then get data
  while (!(rUTRSTAT0 & 1));
  return (rURXH0 & 0x0f);
}

 

Makefile

CC    = arm-linux-gcc
LD     = arm-linux-ld
OBJCOPY  = arm-linux-objcopy
OBJDUMP  = arm-linux-objdump
AR    = arm-linux-ar
INCDIR  := $(shell pwd)
#C预处理器的flag,flag就是编译器可选的选项
CPPFLAGS  := -nostdlib -nostdinc -I$(INCDIR)/include
#C编译器的flag
CFLAGS    := -Wall -O2 -fno-builtin
#导出变量到全局,提供子给Makefile使用
export CC LD OBJCOPY OBJDUMP AR CPPFLAGS CFLAGS
objs := start.o  uart.o main.o 
objs += lib/libc.a
uart.bin: $(objs)
  $(LD) -Ttext 0x0 -o uart.elf $^
  $(OBJCOPY) -O binary uart.elf uart.bin
  $(OBJDUMP) -D uart.elf > uart_elf.dis
  gcc mkv210_image.c -o mkx210
  ./mkx210 uart.bin 210.bin
lib/libc.a:
  cd lib;  make;  cd ..
%.o : %.S
  $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -c
%.o : %.c
  $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -c
clean:
  rm *.o *.elf *.bin *.dis mkx210 -f
  cd lib; make clean; cd ..

printf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1062731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

长剖与贪心+树上反悔贪心:1004T4

长剖的本质是一种贪心。&#xff08;启发式合并本质也是类似哈夫曼树的过程&#xff09; 在此题中&#xff0c;首先肯定变直径&#xff0c;然后选端点为根。然后选叶子。而每个叶子为了不重复计算&#xff0c;可以只计算其长剖后所在链的贡献。&#xff08;本题精髓&#xff0…

Postman使用实例

Postman使用实例 实体类Emp package com.example.springboot_postman.pojo;import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import javax.persistence.*; import j…

【C语言】善于利用指针(一)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C语言初步学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a; 1. 什么是指针 1.1 概念 1.2 图解 1.3 示例 2. 指针和指针类型 2.1 指针的定义 2.2 指针的解引…

Kubernetes Deployment的运行

Deployment提供了一种更加简单的更新Replication Controller和Pod的机制&#xff0c;更好地解决了Pod的编排问题。本节将详细介绍如何通过Deployment实现Pod的管理。 15.1.1 什么是Deployment Deployment的中文意思为部署、调集&#xff0c;它是在Kubernetes的1.2版本中新增…

【kubernetes】基于prometheus的监控

目录 1 监控解决方案2 prometheus2.1 容器监控2.2 节点监控2.3 资源对象监控2.4 metrics--server 3 prometheus-operator vs kube-prometheus vs helm3.1 prometheus-operator3.2 kube-prometheus3.3 helm 参考文档 1 监控解决方案 从实现方案来说&#xff0c;监控分为3个部分…

计算机网络基础(二):物理层、数据链路层及网络层

一、物理层 1.物理层 物理层面的通信标准可以概括划分为与网络基础设施有关的标准和与被传输物理信号有关的标准两类。 网络基础设施的标准&#xff1a;鉴于物理层面的消息互通也是物理层应该兑现的服务&#xff0c;因此物理层的标准还会包括针脚的用途、线缆的材料与设计等…

vertx的学习总结7之用kotlin 与vertx搞一个简单的http

这里我就简单的聊几句&#xff0c;如何用vertx web来搞一个web项目的 1、首先先引入几个依赖&#xff0c;这里我就用maven了&#xff0c;这个是kotlinvertx web <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apac…

华为云云耀云服务器L实例评测|基于canal缓存自动更新流程 SpringBoot项目应用案例和源码

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 在之前的博客中&#xff0c;介绍过canal的安装和配置&#xff0c;参考博客 拉取创建canal镜像配置相关参数 & …

【数据库——MySQL】(14)过程式对象程序设计——游标、触发器

目录 1. 游标1.1 声明游标1.2 打开游标1.3 读取游标1.4 关闭游标1.5 游标示例 2. 触发器2.1 创建触发器2.2 修改触发器2.3 删除触发器2.4 触发器类型2.5 触发器示例 参考书籍 1. 游标 游标一般和存储过程一起配合使用。 1.1 声明游标 要使用游标&#xff0c;需要用到 DECLAR…

<C++> String

目录 一、标准库中的string类 1. string类 2. string类的常用接口说明 2.1 string类对象的常见构造 2.2 string类对象的容量操作 2.3 string类对象的访问及遍历操作 2.4 string类对象的修改操作 2.5 string类非成员函数 总结 前言 C语言中&#xff0c;字符串是以 \0 结尾的一些…

用JMeter对HTTP接口进行压测(一)压测脚本的书写、调试思路

文章目录 安装JMeter和Groovy为什么选择Groovy&#xff1f; 压测需求以及思路准备JMeter脚本以及脚本正确性验证使用Test Script Recorder来获取整条业务线上涉及的接口为什么使用Test Script Recorder&#xff1f; 配置Test Script Recorder对接口进行动态化处理处理全局变量以…

2. 资源管理

2. 资源管理 文章目录 2. 资源管理2.1 资源管理介绍2.2 YAML语言介绍2.3 资源管理方式2.2.1 命令式对象管理2.2.2 命令式对象配置2.2.3 声明式对象配置 2.4. 模拟使用普通用户来操作 2.1 资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通…

二十九、【进阶】MySQL索引的概述和索引查询

1、索引概述 2、 普通查询和索引查询 &#xff08;1&#xff09;基础演示 无索引查询&#xff1a;在查询信息时&#xff0c;比如查询年龄age45的员工&#xff0c;系统会遍历字段为age的列&#xff0c;在找到age45的员工后&#xff0c;依旧会向下扫描&#xff0c;直到表末&…

如何使用 Dijkstra 算法找到从源到所有顶点的最短路径--附C++/Java源码

给定一个图和图中的源顶点,找到从源到给定图中所有顶点的最短路径。 例子: 输入: src = 0,图形如下图所示。 输出: 0 4 12 19 21 11 9 8 14解释:从 0 到 1 的距离 = 4。 从 0 到 2 的最小距离 = 12。0->1->2 从 0 到 3 的最小距离 = 19。0 ->1-

Python基础语法(3)

目录 一、函数 1.1 函数是什么 1.2 函数语法格式 1.3 函数参数 1.4 函数返回值 a. 一个函数中可以有多个 return 语句 b. 执行到 return 语句&#xff0c;函数就会立即执行结束&#xff0c;回到调用位置 c. 一个函数是可以一次返回多个返回值的。使用 , 来分割多个返回值…

Jmeter基础篇

1.性能测试指标 【虚拟用户数】&#xff1a;线程用户 【并发数】&#xff1a;指在某一时间&#xff0c;一定数量的虚拟用户同时对系统的某个功能进行交互&#xff0c;一般通过集合点实现 【事务】:事务代表一个完整的功能&#xff0c;一个接口可以是事务&#xff0c;多个接口…

MyBatisPlus(十一)包含查询:in

说明 包含查询&#xff0c;对应SQL语句中的 in 语句&#xff0c;查询参数包含在入参列表之内的数据。 in Testvoid inNonEmptyList() {// 非空列表&#xff0c;作为参数List<Integer> ages Stream.of(18, 20, 22).collect(Collectors.toList());in(ages);}Testvoid in…

【C语言】转圈报数问题(三种方法--指针,数组)

题目&#xff1a;有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来第几号的那位。 方法一&#xff1a; #include <stdio.h> #define N 10int main() {int …

systemverilog function的一点小case

关于function的应用无论是在systemverilog还是verilog中都有很广泛的应用&#xff0c;但是一直有一个模糊的概念困扰着我&#xff0c;今天刚好有时间来搞清楚并记录下来。 关于fucntion的返回值的问题&#xff1a; function integer clog2( input logic[255:0] value);for(cl…

实验三十五、LM117 稳压电源的设计

一、题目 利用 LM117 设计一个稳压电路&#xff0c;要求输出电压的调节范围为 5 ∼ 20 V 5\sim20\,\textrm V 5∼20V&#xff0c;最大负载电流为 400 mA 400\,\textrm{mA} 400mA。利用 Multisim 对所设计电路进行仿真&#xff0c;并测试所有性能指标。 二、仿真电路 仿真电…