ARM裸机开发-串口通信

这篇具有很好参考价值的文章主要介绍了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

对嵌入式物联网感兴趣的小伙伴,可以多了解一下相关信息。(看过来)文章来源地址https://www.toymoban.com/news/detail-511609.html

到了这里,关于ARM裸机开发-串口通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 串口通信实现-串口发送(vivado&verilog版)

    串口系列知识分享: (1)串口通信实现-串口发送 (2)串口通信发送多字节数据 (3)串口通信实现-串口接收 (4)UART 通信-使用VIO进行板级验证 (5)串口接收-控制LED闪烁 (6)使用串口发送实现ACX720开发板时钟显示 (7)串口发送+RAM+VGA传图 此文介绍uart串口协议(串口发

    2024年02月14日
    浏览(45)
  • STM32-串口通信(串口的接收和发送)

    本文在于记录自己的学习过程中遇到的问题和总结,各种情况下串口通信在STM32的实际使用方面占有很大的比重,本文主要对 串口通信 做一个简要的总结。 在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输 并行数据 ,是 全双工 , 异步时钟控制 ,设备之间是

    2024年02月03日
    浏览(76)
  • 串口通信-发送和接收数据

    目录 通信方式 硬件电路 软件部分 USART外设(同步/异步收发器) 波特率 引脚复用 初始化基本流程 发送 接收 语言简述 常用的函数 使用的结构体 引脚模式 打印数据的三种方法 使用printf 在实际的串口中,只能发送二进制数,也就是十六进制的最直接数据。如果想发送字符,

    2024年02月12日
    浏览(61)
  • STM32串口通信—串口的接收和发送详解

    目录 前言: STM32串口通信基础知识: 1,STM32里的串口通信 2,串口的发送和接收 串口发送: 串口接收: 串口在STM32中的配置: 1. RCC开启USART、串口TX/RX所对应的GPIO口 2. 初始化GPIO口 3. 串口初始化 4. 串口使能 5. 串口发送数据 串口接收的两种实现方式: 1,轮询方式: 2,中断

    2024年04月08日
    浏览(111)
  • 09 AB 10串口通信发送原理

            通用异步收发传输器( Universal Asynchronous Receiver/Transmitter, UART)是一种异步收发传输器,其在数据发送时将并行数据转换成串行数据来传输, 在数据接收时将接收到的串行数据转换成并行数据, 可以实现全双工传输和接收。它包括了 RS232、 RS449、 RS423、RS422 和

    2024年02月20日
    浏览(38)
  • Android串口开发之使用JNI实现ANDROID和串口通信

    导语:Android串口通信在物联网、智能家居等领域具有广泛的应用。本文将详细介绍如何使用JNI技术实现Android设备与串口的通信,包括串口的打开、设置参数和读写数据等过程。 在开始介绍Android串口开发之前,我们需要了解以下几个概念: JNI:JNI(Java Native Interface)是一种

    2024年02月07日
    浏览(48)
  • 串口通信——串口助手发送正数/负数(以ascii码的形式发送或者以16进制形式发送),最后展示出发送的数

    1.串口助手发送一个数(发送的形式是ascii码),最后除以100展示这个数,如发送一个-29987,最后要展示出-299.87。 2.串口助手发送一个数(发送的形式是16进制),最后除以100展示这个数,如发送一个-3,最后要展示出-0.03。 其中串口是USART1,其端口是GPIOA,引脚是PIN9、PIN10,

    2023年04月23日
    浏览(58)
  • 在linux中进行arm交叉编译体验tiny6410裸机程序开发流程

    在某鱼上找了一个友善之臂的Tiny6410开发板用来体验一下嵌入式开发。这次先体验一下裸机程序的开发流程,由于这个开发板比较老旧了,官方文档有很多过期的内容,所以记录一下整个过程。 按照光盘A中的文档《04- Tiny6410 Linux开发指南.pdf》的 1.3.5 节描述,用光盘中的 a

    2024年02月15日
    浏览(35)
  • SpringBoot+jSerialComm实现Java串口通信 读取串口数据以及发送数据

    记录一下使用SpringBoot+jSerialComm实现Java串口通信,使用Java语言开发串口,对串口进行读写操作,在win和linux系统都是可以的,有一点好处是不需要导入额外的文件。 案例demo源码:SpringBoot+jSerialComm实现Java串口通信 读取串口数据以及发送数据 之前使用RXTXcomm实现Java串口通信,这

    2024年02月05日
    浏览(42)
  • SpringBoot+RXTXcomm实现Java串口通信 读取串口数据以及发送数据

    记录一下使用SpringBoot+RXTXcomm实现Java串口通信,使用Java语言开发串口,对串口进行读写操作。 案例源码:SpringBoot+RXTXcomm实现Java串口通信 读取串口数据以及发送数据 RXTXcomm.jar这个包支持的系统较多,但是更新太慢,在win系统下使用没有问题,但是在centos的工控机系统里使用

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包