昨天發現新唐的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...