硬體準備:
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...