RTEMS BBB(八) UART擴充套件 準備

2021-07-06 03:09:30 字數 2222 閱讀 1185

硬體準備:

uart的介紹:通用非同步收發傳輸器(universal asynchronous receiver/transmitter),通常稱作uart,是一種非同步收發傳輸器,將資料進行串並轉換。具體來說,就是將cpu發來的並行資料轉成序列資料發出去,將串列埠接收到的串列埠資料轉成並行資料發給cpu。

beagleboneblack的監控口預設為j1區的uart0

p9區有uart1,2和4,現在我們要拓展使用乙個uart1,測試它的收發,並且和led結合起來

將p9區24口,26口,以及gnd連線到串列埠轉usb模組

注意到每個介面有最多8個mode,而每個mode的選擇是由control module register決定的

因此在datasheet中檢視兩組暫存器的使用:cmr和uart

首先在memory map中查到cmr和uart的基位址

再檢視cmr的暫存器列表偏移量位址

再看對應暫存器的賦值方法。注意到beaglebone上的uart為16550。涉及到的暫存器有

lcr lsr dll dlm rbr thr

軟體準備:

看懂console-config.c

void beagle_console_init(void)

while ((console_lsr & console_lsr_temt) == 0)

;console_lcr = 0x80 | 0x03;

console_dll = 0x00;

console_dlm = 0x00;

console_lcr = 0x03;

console_mcr = 0x03;

console_fcr = 0x07;

console_lcr = 0x83;

console_dll = div;

console_dlm = (div >> 8) & 0xff;

console_lcr = 0x03;

console_acr = 0x00;

init_needed = 0;}}

/*初始化函式:對於控制(control)暫存器,可以賦值;對於狀態(status)暫存器,唯讀,用於判斷語句。對於ns16550來說,先用 console_sysc=2(module is reset)使uart重置,然後當重置完成console_syss=1(reset complete)繼續執行。

當lsr的 thre 位為 1(傳送器就緒)時,置lcr最高位為 1*/(允許除數暫存器),賦值83(無奇偶校驗,1 位停止位, 8 位字元長度),dll 設為 div。置lcr 最高位為 0,acr(手冊中對應mode definition register)置0。當lsr 的 temt 為 1(傳送器為空)時;當lcr 最高位為 0 時,置 mcr 為 3(rts 請求傳送訊號有效dtr 資料終端就緒訊號有效),置 fcr 為 7(允許fifo 緩衝工作,清除接收和傳送緩衝器)。*/

static uint8_t beagle_uart_get_register(uintptr_t addr, uint8_t i)

}v = (uint8_t) *reg_r;

return v;

}static void beagle_uart_set_register(uintptr_t addr, uint8_t i, uint8_t val)

這兩段應該是完成暫存器位址的傳遞,條件是lsr的最低位( rdr 位)為 0(接收緩衝器無資料)

static void uart_write_polled( char c )

static void _bsp_put_char( char c )

}這兩段是uart的寫或者說傳送函式,當 lsr 的 bi 為 1(進入中止狀態),把c賦值給 thr(傳送保持暫存器)發出去。

static int _bsp_get_char(void)

else

}這一段是 uart 的讀或者說接收函式,當 lsr 的 rdr 位為 1,表示接收緩衝器有資料時,返回 rbr 的值。

console_tbl console_configuration_ports = ,

};bsp_output_char_function_type bsp_output_char = _bsp_put_char;

bsp_polling_getchar_function_type bsp_poll_char = _bsp_get_char;

這兩段涉及到函式的後續呼叫和引數傳遞

完成以上準備後 下面就是程式設計了。

RTEMS BBB(九) UART擴充套件 程式設計

下面就涉及到rtems的語法和以c語言為主的驅動程式設計 rki的shell介面之前已經提過,現在增加 cmd檔案測試 完成暫存器的位址對映 include include include define control module registers1 volatile uint32 t 0x44...

scrapy 編寫擴充套件 (八)

在scrapy使用過程中,很多情況下需要根據實際需求定製自己的擴充套件,小到實現自己的pipelines,大到用新的scheduler替換預設的scheduler。擴充套件可以按照是否需要讀取crawler大致分為兩種,對於不需要讀取的,比如pipelines的編寫,只需要實現預設的方法porces...

scrapy 編寫擴充套件 (八)

在scrapy使用過程中,很多情況下需要根據實際需求定製自己的擴充套件,小到實現自己的pipelines,大到用新的scheduler替換預設的scheduler。擴充套件可以按照是否需要讀取crawler大致分為兩種,對於不需要讀取的,比如pipelines的編寫,只需要實現預設的方法porces...