ARM第五天(串列埠下)

2021-07-25 03:36:26 字數 4826 閱讀 3571

ulcon0 設定資料格式

ucon0 設定接收傳送模式(輪詢)暫停訊號,回環,時鐘源

ufcon0

umcon0

ubrdiv0 設定波特率1

udivslot0 設定波特率2

utrstat0 狀態暫存器 bit[1] bit[0]

utxh0 傳送緩衝暫存器

urxh0 接民緩衝暫存器

串列埠 tpad pc

傳送 接收(顯示在螢幕上)

接收 傳送(鍵盤)

#ifndef __uart_h__

#define __uart_h__

#define gpa0con (*((volatile unsinged int*)

0xe0200000))

#define gpa0pud (*((volatile unsinged int*)

0xe0200008))

#define ulcon0 (*((volatile unsinged int*)

0xe2900000))

#define ucon0 (*((volatile unsinged int*)

0xe2900004))

#define ufcon0 (*((volatile unsinged int*)

0xe2900008))

#define umcon0 (*((volatile unsinged int*)

0xe290000c))

#define utrstat0 (*((volatile unsinged int*)

0xe2900010))

#define utxh0 (*((volatile unsinged int*)

0xe2900020))

#define urxh0 (*((volatile unsinged int*)

0xe2900004))

#define ubrdiv0 (*((volatile unsinged int*)

0xe2900028))

#define udivsl0t0 (*((volatile unsinged int*)

0xe290002c))

//宣告函式原型

extern void uart0_init(void);

extern void uart0_putc(char c);

extern void uart0_puts(const char *str);

extern char uart0_getc(void);

#endif __uart_h__

uart.m

#include "uart.h"

void uart0_init(void)

char uart0_getc(void)

}//2,接收字元,讀urxh0

return (urxh0 & 0xff);

}void uart0_putc(char c)

//傳送字元

utxh0 = c;

}void uart0_puts(const char *str)

while(*str)//

}

main.c

#include "uart.h"

void main(void)

}

思考:如何獲取字串?

在標頭檔案中增加宣告

extern

void uart0_gets(char buf,int len);

uart.m檔案

void uart0_gets(char buf,int len)

buf[i] = 0;//給字串乙個結束符號『\0』,因為『\0』的assic碼為0

}

main.c

#include "uart.h"

#define int buf_len = 10;

#define char buf[buf_len];

void main(void)

}

如何實現輸入乙個字元,顯示乙個字元?修改uart.m中的uart0_gets函式:

void uart0_gets(char buf,int len)

buf[i] = 0;//給字串乙個結束符號『\0』,因為『\0』的assic碼為0

}

main.c

#include "uart.h"

#define int buf_len = 10;

#define char buf[buf_len];

void main(void)

}

如何實現當輸入回車時,結束掉輸入?

void uart0_gets(char buf,int len)

}buf[i] = 0;//給字串乙個結束符號『\0』,因為『\0』的assic碼為0

}

如何實現按delete鍵時,刪除字元?

顯示端的處理:

1,游標先左移一次

2,輸出乙個空格鍵

3,游標再次左移一次

void uart0_gets(char buf,int len)

uart0_putc('\b');//輸出乙個刪除鍵(把游標左移一位)

uart0_putc(' ');//輸出乙個空格

uart0_putc('\b');//輸出乙個刪除鍵(把游標左移一位)

i--;

continue;

}uart0_putc( buf[i]);

if(buf[i] =='\r')//結束輸入

}buf[i] = 0;//給字串乙個結束符號『\0』,因為『\0』的assic碼為0

}

如何把上面的串列埠相關的函式與前面的led做成乙個shell?通過輸入shell命令來開啟或關閉led燈

要實現的功能為?

shell#led   

//點燈

shell#ledoff

//關燈

led.h

//暫存器定義略

extern

void led_init(void);

extern

void led_on(void);

extern

void led_of(void);

led.c檔案

#include "led.h"

void led_init(void)

void led_on(void)

void led_off(void)

strcmp.h

#ifndef __strcmp_h__

#define __strcmp_h__

extern

int my_strcmp(const

char *str1,const

char *str2);

#endif

strcmp.c

#include "strcmp.h"

//兩個字串比較,相等返回0,不等,返回非0

my_strcmp(const char *str1,const char *str2)

str1++;

str2++;

}return (int(*str1 - *str2));

}

main.c

#include "uart.h"

#include "strcmp.h"

#include "led.h"

#define int buf_len = 10;

#define char buf[buf_len];

void main(void)

else}}

}

makefile檔案略

以上**存在乙個問題,如果有很多命令的時候,採用if 比較會變得非常繁瑣,增加命令很不方便。

採用結構體優化後的**,先定義標頭檔案,cmd.h檔案如下:

#ifndef __cmd_h__

#define __cmd_h__

typedef void (*cb_t)(void); //函式指標

typedef struct _cmd

cmd_t

//返回的是乙個結構體的位址,通過結構呼叫callback

extern

const cmd_t *find_cmd(const

char *name);

#endif

cmd.c

#include "cmd.h"

#include "led.h"

void cmd_ledon(void)

void cmd_ledoff(void)

const cmd_t cmd_tb1 =

, ,

};cmd_t *find_cmd(const

char *name)

國慶第五天

直接在寢室待了乙個上午 一 matlab 試了一下昨天安裝的matlab2010b發現檔案都打不開,報這個錯 undefined function or method uiopen for input arguments of type char 二 c 1.找到了個之前 裡的乙個問題 把本週開頭和...

集訓第五天

今天學習了乙個快速指數冪取餘的演算法。就拿一道題來說明 description 上初中的時候我們就學會了冪乘運算,可是我們卻不知道對於高階的冪乘,出結果的方法比較慢,那麼你有什麼更好的方法嗎?input 第1行,乙個整數n 1 n 1000 表示要計算的資料組數 第2 n 1行,每行兩個整數,第1個...

實習第五天

今天是第一周的最後一天,最近的專案中乙個類似qq聊天系統為最重要的任務,師傅交給 我的任務是用layer完成三個介面,新增好友介面 查詢好友介面以及傳送好友新增請求介面。先說明一下layer的基本頁面模板 lang en charset utf 8 傳送好友請求title rel styleshee...