ARM裸机开发-串口通信
一、在使用EXYNOS4412的串口发送和接收的时候,首先要对EXYNOS4412的串口进行配置,我们使用轮询方式时的配置有哪些?
1、配置GPIO,使对应管脚作为串口的发送和接收管脚
GPA0CON寄存器[7:4][3:0] 0x22
GPA0PUD寄存器[3:0] 0 禁止上下拉电阻
2、配置串口单元本身寄存器
ULCON0 0xE2900000
数据位:8位
停止位:1位
校验位:无
使用的正模式,非红外。
3、UCON0 0xE2900004
串口的收发模式:轮询
串口的时钟使用的PCLK UFCON0 0xE2900008
禁止FIFO
UMCON0 0xE290000C
禁止Modem
UBRp0 0xE2900028
UpSLOT0 0xE290002C
UBRp0 = PCLK或者SCLK_UART/波特率/16 - 1 的整数部分
UpSLOT0 查表,怎么查?
PCLK或者SCLK_UART/波特率/16 - 1 的小数部分 * 16 取整
查表
PCLK=100000000
波特率是115200
UBRp0 = 35
UpSLOT0 = 0x0080
发送数据流程(轮询方式)
uart0_putc()
判断UTRSTAT0的BIT1,如果BIT1是0等待如果BIT1是1,就把要发送的一个字节数据写到发送寄存器(UTXH0,0xE2900020)
接收数据流程(轮询方式)
uart0_getc
判断UTRSTAT0的BIT0,如果BIT0是0等待如果BIT0是1,从URXH0 0xE2900024读取一个字节的数据。
编程时:
0xE2900000地址单元写3
0xE2900004地址单元写5
0xE2900008地址单元写0
0xE290000C地址单元写0
0xE2900028地址单元写35
0xE290002C地址单元写0x80
uart.h
1 #ifndef _UART_H_
2 #define _UART_H_
3
4 #define GPA0CON (*(volatile unsigned int *)0xE0200000)
5 #define GPA0PUD (*(volatile unsigned int *)0xE0200008)
6
7 #define ULCON0 (*(volatile unsigned int *)0xE2900000)
8 #define UCON0 (*(volatile unsigned int *)0xE2900004)
9 #define UFCON0 (*(volatile unsigned int *)0xE2900008)
10 #define UMCON0 (*(volatile unsigned int *)0xE290000C)
11 #define UTRSTAT0 (*(volatile unsigned int *)0xE2900010)
12 #define UTXH0 (*(volatile unsigned int *)0xE2900020)
13 #define URXH0 (*(volatile unsigned int *)0xE2900024)
14 #define UBRp0 (*(volatile unsigned int *)0xE2900028)
15 #define UpSLOT0 (*(volatile unsigned int *)0xE290002C)
16
17 #define PCLK (66500000)
18
19 //函数原型声明
20 extern void uart0_init(void);
21 extern void uart0_puts(const char *);
22 extern void uart0_putc(char);
23 extern char uart0_getc(void);
24 extern void uart0_gets(char *,int);
25
26 #endif // _UART_H_
uart.c
1 #include "uart.h"
2
3 //初始化串口寄存器
4 void uart0_init(void){
5 //配置GPIO口 根据CPU 手册中设置下面的寄存器
6 //GPA0CON GPA0PUD
7 ULCON0 = 3;
8 UCON0 = 5;
9 UFCON0 = 0;
10 UMCON0 = 0;
11 UBRp0 = 35;
12 UpSLOT0 = 0x0080;
13 GPA0CON = 34;
14 GPA0PUD = ~0xF;
15 }
16 //发送一个字符
17 void uart0_putc(char c){
18 //判断状态位
19 while(!(UTRSTAT0 & (1<<1)));
20 //发送字符
21 UTXH0 = c;
22 }
23 //接收一个字符
24 char uart0_getc(void){
25 while(!(UTRSTAT0 & 1));
26
27 return URXH0;
28 }
29
30 //接收一串字符
31 void uart0_gets(char *str,int len){
32 char* tmp = str;
33 int in = len;
34 //int i;
35 while(--len){
36 *tmp = uart0_getc();
37 if(*tmp == '\r'){
38 uart0_putc('\n'); //若此处为 \r 则不会输出,若为 \n 则在下一行跳跃输出字符的长度,然后输出字符串
39 uart0_putc('\r');
40 break;
41 }
42 if(*tmp == 127){ //127 是 ubuntu下 kermit软件中的 BACKSPACE按键 需要实现的效果就是当按下回车键的时候终端的上一个数据会被删掉,
43 len++; //由于此分支的 127 输入到了 *tmp 中,此时的127是无用的,所以要进行 len++ ,但是有一个问题,我们的退格的目的是删除上一个字母,所以127的上一个字符也没用了,需要对len做两次自加进行还原 但是又出现一个问题,如果已经删到第0个元素就不能再自加两次了,这样会造成 len 越来越大。因此要在下面做一个判断
44 if(len < in){
45 len++;
46 }
47 if(tmp == str){
48 continue;
49 }
50
51 uart0_putc('\b');
52 uart0_putc(' ');
53 uart0_putc('\b');
54 --tmp;
55 continue;
56 }
57 uart0_putc(*tmp);
58 tmp++;
59 }
60 *tmp = 0;
61 }
62
63 //发送一串字符
64 void uart0_puts(const char *str){
65 if(str == 0){
66 return;
67 }
68 while(*str){
69 uart0_putc(*str);
70 if(*str == '\n'){
71 uart0_putc('\r');
72 }
73 str++;
74 }
75 }
main.c
1 #include "uart.h"
2
3 void main(void){
4 char val[30];
5 uart0_init();
6 while(1){
7
8 //uart0_gets(val);
9 uart0_puts("\nstart\n");
10 uart0_gets(val,30);
11 uart0_puts(val);
12
13 // uart0_puts(uart0_getc());
14 }
15 }
makefile
1 PROG=uart
2 OBJS=main.o uart.o
3
4 AS=arm-linux-as
5 CC=arm-linux-gcc
6 LD=arm-linux-ld
7 OBJCOPY=arm-linux-objcopy
8 AFLAGS=-march=armv5te
9 CFLAGS=-march=armv5te -nostdlib
10 LDFLAGS=-nostartfiles -nostdlib -Ttext=0x20008000 -e main
11
12 $(PROG): $(OBJS)
13 $(LD) $(LDFLAGS) -o $(PROG) $(OBJS)
14 $(OBJCOPY) -O binary $(PROG) $(PROG).bin
15 cp uart.bin /tftpboot
16
17 %.o:%.s
18 $(AS) $(AFLAGS) -o $@ $<
19
20 %.o:%.c
21 $(CC) $(CFLAGS) -c -o $@ $<
22 clean:
23 @rm -vf $(OBJS) $(PROG) $(PROG).bin
对嵌入式物联网感兴趣的小伙伴,可以多了解一下相关信息。(看过来)
相关文章:
ARM裸机开发-串口通信
一、在使用EXYNOS4412的串口发送和接收的时候,首先要对EXYNOS4412的串口进行配置,我们使用轮询方式时的配置有哪些? 1、配置GPIO,使对应管脚作为串口的发送和接收管脚 GPA0CON寄存器[7:4][3:0] 0x22 GPA0PUD寄存器[3:0] 0 禁止上…...
Dubbo分布式服务框架,springboot+dubbo+zookeeper
一Dubbo的简易介绍 1.Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需…...
网络:UDP out of order;SIP;CPU out-of-order 执行
文章目录 问题SIP如果使用UDP出现乱序网络CPU问题 最近遇到虚拟机收到的UDP包发生乱序。从协议上说,这个乱序是标准,及特性所允许的,期望的。所以上层应用需要适应这种乱序,如果不能适应,可能需要做协议转换,专用TCP,让TCP来处理这种乱序的可能。 产生乱序的原因: 是网…...
我心中的TOP1编程语言—JavaScript
作为一名研发工程师(程序员),平时工作中肯定会接触或了解很多编程语言。每个人都会有自己工作中常用的语言,也会有偏爱的一些编程语言。而我心中的最爱,毫无疑问,就是 JavaScript。 JavaScript 是一门编程…...
CentOS环境下的Maven安装
CentOS 安装 Maven 镜像地址 镜像地址:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/ 下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.8/binaries/ 下载maven 将下载好的压缩包拷贝到根目录下 解压 tar -zxvf ap…...
表的增删改查
1、创建表 mysql> create table employee ( -> id int(1) comment 员工编号, -> name varchar(6) comment 员工名字, -> gender varchar(2) comment 员工性别, -> salary int (4) comment 员工薪资); Query OK, 0 rows affected (0.01 sec) 2、…...
Tauri 应用中发送 http 请求
最近基于 Tauri 和 React 开发一个用于 http/https 接口测试的工具 Get Tools,其中使用了 tauri 提供的 fetch API,在开发调试过程中遇到了一些权限和参数问题,在此记录下来。 权限配置 在 tauri 应用中,如果想要使用 http 或 fe…...
基于霍夫变换的航迹起始算法研究(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 一、设计内容 利用Hough变换处理量测得到的含杂波的二维坐标,解决多目标航迹起始问题。使用Matlab进行仿真&#x…...
如何使用Excel公式将(d:1,a:4,c:2,b:3)快速分割成8列并按顺序排列
Excel是一款功能强大的电子表格软件,可以帮助我们处理各种数据。在处理数据时,有时候需要将一列数据按照特定的格式进行分割和重新排列。本文将介绍如何使用Excel公式将"(d:1,a:4,c:2,b:3)"快速分割成8列,并按照指定顺序排列为&quo…...
遥控泊车系统技术规范
目 录 1. 版本履历... 3 2. 文档使用范围... 3 3. 术语缩写... 3 4. 系统架构... 4 5. 功能需求... 4 5.1 功能清单... 4 6.2 功能关系描述(如有)... 4 5.3 功能1. 4 5.3.1 功能总体状态动态说…...
qt 线程状态机实现并发自动任务
一、状态机类 头文件 MyStateMachine.h#ifndef MYSTATEMACHINE_H #define MYSTATEMACHINE_H#include <QStateMachine> #include "ActionTask.h" #include...
社交机器人培育
论文: 自我繁殖的假新闻:机器人和人工智能使印度冲突地区的社会两极分化永久化 Self-Breeding Fake News: Bots and Artificial Intelligence Perpetuate Social Polarization in India’s Conflict Zones 论文链接:https://jps.library.ut…...
CUnit在ARM平台上的离线搭建(让CUnit编译安装成功之后的可执行文件.so变成ARM下的—ARM aarch64)(实用篇)
前言:1 CUint-2.1-3.tar.bz2压缩安装包下载并解压2 进入CUint-2.1-3目录并且通过指令./bootstrap*产生configure *执行文件3 执行./configure*命令4 make编译5 make install 安装 前言: 在X86架构上的Linux操作系统上面进行cmake编译(Cyclon…...
整数序列(山东大学考研机试题)
水仙花数(中南考研机试题) 链接:3644. 水仙花数 - AcWing题库 /* 暴力枚举罢了 */ #include<iostream> using namespace std; const int N1e3100; int book[N]; int pow3(int k){return k*k*k; } int main() {int m,n;for(int i100;i<999;i){int t1,t2,t3;t1 i%10;t…...
k8s集群安装
目录 一 主机准备 1.1 设备配置 ⚠️注意1 ⚠️注意2 1.2 环境准备 1.3docker安装 二 安装kubeadm、kubectl、kubelet 2.1 添加镜像源 2.2 安装 三 master节点部署 四 node节点加入集群 五 CNI网络插件calico 六 其他节点使用kubectl 1.拷贝文件 2.添加到环境变量…...
【webrtc】ProcessThreadAttached
RegisterModule 调用所在的线程指针传递给ProcessThreadAttached ProcessThreadAttached 调用不是在worker thread 而是在 registers/deregister 这个module或者 start stop 这个module的时候 ** ** pacedsender是一个moudle -实现了...
Orange pi3初调试
因为树莓派沦为理财产品1年前出手殆尽后,现在唯一一个B性能不足一直没动力调试,沦为吃灰工具。 偶然之间多多给推了个orange产品预售,看了下pi3的参数,这不和赚了差价的3B一个性能吗?果断定了个预售款,在差…...
手机里的视频怎么转换成MP4格式?简单的转换方法分享
MP4格式是一种广泛使用的视频格式,几乎所有设备和操作系统都支持MP4格式的视频播放。无论是使用 iPhone、iPad、安卓手机、电视等各种设备,都可以播放 MP4 格式的视频。这种广泛的兼容性使得 MP4 成为一种非常方便的视频格式,我们可以随时随地…...
Matlab数学建模实战——(Lokta-Volterra掠食者-猎物方程)
1.题目 问题1 该数学建模的第一问和第二问主要是用Matlab求解微分方程组,直接编程即可。 求解 Step1改写 y(1)ry(2)f Step2得y的导数 y(1).2y(1)-ay(1)*y(2)y(2).-y(2)a*y(1)*y(2) Step3编程 clear; a0.01; F(t,y)[2*y(1)-a*y(1)*y(2);-y(2)a*y(1)*y(2)]; […...
windows下软件推荐
起源与目的 选择任何一个系统作为主力系统都是要好好考虑的。 在去年新买了一块1T的SSD后,就好好想了想这个问题。 Arch Linux, Ubuntu, Windows, macOS, deepin都是在考虑范围的。 不过我考虑到使用体验,最终还是选择了windows。 不选择macOS主要是不喜…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
