自己動手寫的UART2驅動

2021-05-26 06:37:33 字數 1560 閱讀 3075

昨天發現新唐的bsp中沒有提供uart2的定義 即其操作,只定義了uart0和uart1及其驅動操作。但是涉及的板子中又弄了3路串列埠,當然uart2在其中。

第一反應就是查閱新唐的資料,nuc1**的前期設計文件中,有些說可以支援uart2,但是又有很多定義的地方都reserve了,就是本該uart2相關的位卻為保留位。心裡沒譜。

沒譜也沒辦法,咬咬牙開始吧。

檢視bsp有關定義,在drvuart.h和 drvuart.c中只 #define了uart0 和uart1,以及drvgpio.c中的drvgpio_func中也制定一樂func_uart0, 和func_uart1,根本不見func_uart2的蹤影。可是在新唐的**上關於nuc100re3an又是有3路串列埠的(這一點是堅定我信心的!!)

因此萌生自己寫關於uart2的驅動的決心。專案只要求往外發,所以暫時只實現這部分功能,對於接收先不予以處理(接收要麻煩些)。

1、在串列埠初始化中先要drvgpio_initfunction()物件應的管腳使能,func_uart2對應的管腳是和func_can1管腳復用的(都是gpd14、15)。所以

#define func_uart2 func_can1

這樣直接drvgpio_initfunction(func_uart2),就將相應uart2的pin腳使能為rx2、tx2了。

2、然後要對uart進行配置,uart0和1是呼叫drvuart_open(uart_port1,(str_uart_t)¶m);

開始編寫自己的uart2驅動檔案 my_uart2.h 和my_uart2.c。

(1) 關鍵之處在於uart2的基位址,檢視datasheet, 

#define my_apb2_base           ((     uint32_t)0x40100000)

#define my_uart2_base                (my_apb2_base + 0x54000)

(2)將原先關於uart2的結構體中的保留位改寫為uart2相關位。

typedef struct

my_sysclk_apbclk_t;

typedef struct

my_sysclk_t;

#define my_sysclk              ((my_sysclk_t *) sysclk_base)

(3)實現開啟以及 傳送字串函式

int32_t my_drvuart_open(uart_port port, str_uart_t *sparam);

void sendchar_to_uart2(int ch);

void send_string_to_uart2(char * str);

以下是直接可用的**:my_uart2.h

my_uart.c

這是執行結果:

自己動手寫驅動程式

一 編碼思維導圖 二 編寫 memdev.c include include include include include struct cdev mdev 1.靜態分配cdev dev t devno int dev1 regs 5 int dev2 regs 5 loff t mem lsee...

自己動手寫docker 2

2.1 linux namespace linux 支援的namespace namespace api的基本系統呼叫 不完整的ex,以下為呼叫後截圖為 package main import log os os exec syscall func main syscall.credential c...

自己動手寫作業系統的理由

自己動手寫作業系統的理由 想來想去,是的,我就是這麼想的 1.在學習別人的東西時,有些在搞懂之前好像很神秘,但搞懂之後發現也就那麼回事,往往伴隨而來的是失落。而如果自己動手去設計一些東西時,你一定會在這個過程中收穫創造的成就感。2.目前我的能力只限於單個模組幾千行這個層次,我想進入更高的系統層次。3...