日韩在线免费播放-日韩在线免费av-日韩在线免费-日韩在线毛片-国产高清不卡视频-国产高清不卡

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > ARM裸機開發-串口通信

ARM裸機開發-串口通信 時間:2019-08-06      來源:未知

一、在使用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

上一篇:網絡編程

下一篇:Shell腳本

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 加勒比海盗 电影| 同性gay| 在线黄色免费网站| 诺斯费拉图2024| 十大名茶排名表| 除暴2 电影| 大秦帝国第一部免费观看46集| 四级词汇电子版| 美女下面流水| 贪玩的小水滴300字作文| 成龙游戏| 广濑大介| 瑜伽焰口全集 简体字| 456电影在线| 爱情陷阱| 孤岛飞鹰演员表| 相声剧本(适合学生)| 王瑞儿视频| 电影《东莞往事》在线观看免费| 哗鬼住正隔篱| 草原儿女| 河东舞曲的士高| so xo minh ngoc| 感恩节电影恐怖片| ms培养基配方表| 抗日老电影400部| 圣洁四人行| 李子京| 《欲望中的女人》| 书柜效果图大全2023款| 尹馨演过的三部电影| 游泳池play高h| 黄色污污视频| 搜狐视频安装| 视频污污| 《爱的温暖》电影在线观看| 夏的词语| 张纪中个人简历| 疯狂愚蠢的爱| 斯科| 好好说话电视剧免费观看完整版40集|