999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

QNX系統中基于AM3352的多串口通信驅動設計

2018-09-07 02:31:52
單片機與嵌入式系統應用 2018年9期

,

(國電南京自動化股份有限公司,南京210032)

引 言

圖1 多串口電路設計

串口通信具有穩定可靠、簡單易實現的特點,因此在自動化領域有著廣泛的應用。以一個智能變電站的通信管理服務器為例,需要設計一路調試口和多路規約通信口,同時還要支持多個串口外設,由于CPU本身提供的串口資源有限,往往不能滿足上述的設計需求,而通過在FPGA上設計出支持串口協議的IP核則可以很容易地對串口進行擴展,解決CPU串口資源不足的問題。

1 原理設計

本方案用AM3352作為主控CPU,AM3352是一款基于ARM Cortext-A8內核的微處理器,主頻最高支持720 MHz,運算能力高達1 600 DMIPS,具有豐富的外圍接口,帶6路異步串口,能搭配DDR3,支持大容量的eMMC和NAND FLASH。圖1 給出了基于AM3352的多串口電路設計示意圖,AM3352提供了6路本機串口UART0~UART5,另2路串口通過FPGA進行擴展。為FPGA設計了支持串口協議的IP核,對IP核進行實例化,實現了擴展串口UART7~UART8。AM3352 利用GPMC接口連接FPGA,實現對擴展串口的控制,同時將中斷請求資源GPIO3_16、GPIO3_17分別分配給UART7和UART8,由FPGA通過中斷的方式通知CPU讀取接收緩存區存放的數據。

在串口IP核里按圖2設計了寄存器組和存儲器,存儲器Tx_Mem和Rx_Mem用于緩存發送數據和接收數據,寄存器Tx_Len存儲有效發送數據長度用于CPU通知FPGA要發送的字節數,寄存器Rx_Len存儲有效接收數據長度,用于FPGA告訴CPU放在接收緩存區Rx_Mem可被讀取的字節數,寄存器BUGR用于擴展串口通信速率的設置,寄存器IER用于中斷使能的配置,寄存器IFR標識中斷源,中斷響應后應由中斷服務程序對其相應位置0予以清除中斷。

圖2 擴展串口地址空間分配

2 QNX系統簡介

QNX是類UNIX操作系統,由加拿大QSSL公司(QNX Software System Ltd.)開發的分布式實時操作系統。它采用獨特的微內核結構,由內核實現進程通信、進程調度、中斷處理和底層網絡通信,因此內核非常小,運行速度極快。將驅動程序、應用程序、網絡協議和文件系統的運行地址空間同內核的運行地址空間進行分離,使得應用程序無法直接訪問內核空間,這種封閉的微內核結構保證了任何外部模塊的故障都不會影響內核的運行,從而使系統的穩定性大大提高。同時,QNX支持裁剪和擴展,能針對用戶需求定制不同的功能模塊,實現靈活的嵌入式開發。

3 硬件配置

由于要通過GPMC模塊控制FPGA來實現對擴展串口的訪問控制,因此需要在驅動工作前完成對GPMC接口的配置,配置代碼放在startup里,由startup設置GPMC接口的位寬、控制時鐘、訪問時序等,將GPMC_AD0~GPMC_AD15設置成地址數據復用的工作模式,并把起始地址0x100 0000的16 MB地址空間分配給擴展串口設備。具體配置代碼如下:

out32(GPMC_CONFIG1_0, 0x2a001200);

/*NOR設備,GPMC_CLK配置成50 MHz*/

out32(GPMC_CONFIG2_0, 0x000a0a00);/*CS時序控制*/

out32(GPMC_CONFIG3_0, 0x00020201);/*ADV時序控制*/

out32(GPMC_CONFIG4_0, 0x04020602);/*OE WE時序控制*/

out32(GPMC_CONFIG5_0, 0x00040a0a);/*讀寫訪問時序*/

out32(GPMC_CONFIG6_0, 0x030201c0);

out32(GPMC_CONFIG7_0, 0x00000F41);

/*16M地址空間,CS有效電平,基地址0x1000000*/

由于要用GPIO3_16、GPIO3_17產生中斷請求信號,接下來需要對中斷資源進行配置。AM3352提供了128個中斷信號,而GPIO3位于第62個中斷源,所以要對中斷信號62進行級聯,將級聯后的起始中斷號設置成130,從而可知GPIO3_16對應的中斷號是146,GPIO3_17對應的中斷號是147。此外,還需要向系統提供中斷相關的callout函數,在此定義了id callout函數interrupt_id_am335x_gpio用于系統獲取中斷號、屏蔽和并清除中斷,定義了eio callout函數interrupt_eoi_am335x_gpio用于中斷服務程序結束后重新開放中斷,定義了mask callout函數interrupt_mask_am335x_gpio用于屏蔽中斷,定義了unmask callout函數interrupt_unmask_am335x_gpio用于開放中斷。具體的中斷信息結構體按下面代碼定義:

const static struct startup_intrinfo intrs[] =

{

{

_NTO_INTR_CLASS_EXTERNAL, /* vector base*/

128,

/* number of vectors*/

_NTO_INTR_SPARE, /* cascade vector*/

0, /* CPU vector base*/

0, /* CPU vector stride*/

0, /* flags*/

{INTR_GENFLAG_LOAD_SYSPAGE, 0, &interrupt_id_am335x},

{INTR_GENFLAG_LOAD_SYSPAGE | INTR_GENFLAG_LOAD_INTRMASK, 0, &interrupt_eoi_am335x},

&interrupt_mask_am335x, /*maskcallout*/

&interrupt_unmask_am335x, /*unmask callout*/

0, /*config callout*/

&am335x_intc_base

},

/* GPIO3 interrupt*/

{

130, /*vector base*/

32, /* number of vectors*/

62, /* cascade vector*/

0, /*CPU vector base*/

0, /* CPU vector stride*/

0, /* flags*/

{ 0, 0, &interrupt_id_am335x_gpio},

{ INTR_GENFLAG_LOAD_INTRMASK, 0, &interrupt_eoi_am335x_gpio},

&interrupt_mask_am335x_gpio, /* mask callout*/

&interrupt_unmask_am335x_gpio, /* unmask callout*/

0,

/* config callout*/

&am335x_gpio3_base

},

};

中斷請求到來后,內核首先調用第一級id callout函數, 返回第一級ID,因為有級聯,內核會自動調用級聯id callout函數返回級聯ID,緊接著調用通過InterruptAttach綁定在級聯ID上的中斷服務函數interrupt handler處理用戶任務,最后調用eoi callout重新開放中斷。如果是通過調用InterruptAttachEvent進行中斷綁定,內核會先調用mask callout屏蔽中斷, 此時必須由驅動程序在中斷響應函數里調用InterruptUnmask即unmask callout,重新使能中斷。

4 QNX下的串口驅動

4.1 驅動工作原理

串口工作過程見圖3。串口屬于字符設備,由io-char進行統一管理。用戶進程通過write將數據寫到數據發送隊列obuf,驅動調用函數tto將obuf隊列里的數據發送給串口,從而實現了數據的發送。接收過程則由中斷發起,CPU響應中斷,最終進入串口驅動提供的中斷服務程序讀取串口數據,并調用函數tti將讀取的數據寫到數據接收隊列ibuf,用戶進程便可通過read讀取ibuf隊列中的數據。

圖3 串口驅動工作原理

4.2 驅動初始化

初始化程序將串口設置成RAW工作模式,然后解析命令行參數,從命令行參數獲取波特率、時鐘等參數,接著創建字符串設備并注冊設備名,使設備在命名空間中產生相應的名稱,隨后對串口進行配置、設置通信速率, 調用InterruptAttach綁定中斷服務函數并開啟中斷,之后系統便進入消息循環處理,等待并響應中斷請求。為了區分串口,在設備描述結構體里定義了dev_id成員用于記錄設備ID,由設備創建函數create_device對ID賦值。驅動初始化流程見圖4。

圖4 初始化流程圖

4.3 接收過程

接收過程由中斷服務程序實現。對于擴展串口,FPGA將接收到的數據緩存到Rx_Mem,將有效數據長度寫到Rx_Len,同時通過GPIO3_16或GPIO3_17向CPU發出中斷請求信號,CPU響應中斷請求并進入中斷服務程序,在中斷服務程序里調用系統函數tti將接收緩存區Rx_Mem中的有效數據放到數據接收隊列ibuf,隨后應用程序便可通過read讀取ibuf中的數據。

對于本機串口,數據準備好后由串口控制器產生中斷請求,CPU響應中斷請求并進入中斷服務程序,由中斷服務程序調用tti函數,讀取接收保持寄存器RHR里的數據并送到接收隊列ibuf供應用程序讀取。

4.4 發送數據及tto函數

發送數據由系統調用tto函數實現。tto函數通過調用系統函數tto_getchar從obuf隊列獲取待發送的數據,對于本機串口需將待發送數據寫到發送保持寄存器THR啟動數據發送,對于擴展串口需要將待發送數據寫到發送緩存區Tx_Mem,然后將有效數據長度寫到Tx_Len寄存器啟動FPGA發送數據。

tto函數除了實現發送數據外,還實現了串口參數設置命令STTY、流控制命令CTRL和設備狀態檢測命令LINESTATUS。很多設備都帶有打印機,為了避免打印機出現打印亂碼,需要在驅動里實現LINESTATUS命令對打印機端口CTS進行監視,這樣打印服務程序就可以通過調用devctl(fd,DCMD_CHR_LINESTATUS,&dat,4,NULL)檢測打印機是否準備就緒,待打印機準備好后方能向打印口寫數據。

5 腳本配置

驅動程序編寫好后還需要配置腳本文件,通過腳本啟動串口設備。腳本配置如下:

devc-seromap-F-S-u1-b115200-c48000000 0x44E09000^2,72 0x48022000^2,73 0x48024000^2,74 0x481A6000^2,44 0x481A8000^2,45 0x481AA000^2,46 0x1000000^2,146 0x1000300^2,147

運行腳本后便在/dev下生成了對應于串口UART0~UART7的設備文件ser1~ser8。為了方便系統調試,往往將UART0配置成console,因此需在上面腳本后添加“reopen/dev/ser1”。

結 語

許學芳、羅銘(工程師),主要研究方向為電力系統主設備繼電保護。

主站蜘蛛池模板: 精品一区二区三区水蜜桃| 欧美成人a∨视频免费观看| 国产一区二区网站| 97精品国产高清久久久久蜜芽| 国产99久久亚洲综合精品西瓜tv| 欧美成人精品欧美一级乱黄| 成人小视频网| 99伊人精品| 国产剧情一区二区| 国产精品无码久久久久久| 日韩高清在线观看不卡一区二区| 18禁影院亚洲专区| 欧美日本不卡| 女人天堂av免费| 日本午夜在线视频| 欧美人在线一区二区三区| 好久久免费视频高清| 少妇极品熟妇人妻专区视频| 中文字幕久久波多野结衣| 亚洲国产欧美自拍| 国产又黄又硬又粗| 无码国产伊人| 亚洲日韩精品无码专区97| 无码精油按摩潮喷在线播放 | 夜夜操天天摸| 国产精品久久自在自2021| 极品国产在线| 制服丝袜亚洲| 国产人前露出系列视频| 青青草欧美| 亚洲娇小与黑人巨大交| 性69交片免费看| 欧美国产在线看| 国产尹人香蕉综合在线电影| 无码中字出轨中文人妻中文中| 中文字幕乱妇无码AV在线| 99热这里只有精品免费| 伊人天堂网| 尤物成AV人片在线观看| 成人噜噜噜视频在线观看| 91欧美亚洲国产五月天| 亚洲精品另类| 亚洲熟女中文字幕男人总站| 成年人国产网站| 免费在线成人网| 亚洲国产清纯| 国产呦精品一区二区三区网站| 亚洲一区第一页| 亚洲午夜18| 国产精品自在拍首页视频8| 国产在线观看一区精品| 亚洲91精品视频| 中文字幕有乳无码| 一级毛片免费不卡在线| 国产大片黄在线观看| 国产人人射| 色综合日本| 日韩麻豆小视频| 亚洲精品天堂在线观看| 亚洲国产精品不卡在线| 欧美A级V片在线观看| 国产91熟女高潮一区二区| 亚洲中文字幕手机在线第一页| 内射人妻无码色AV天堂| 999在线免费视频| 色有码无码视频| 久久国产香蕉| 另类欧美日韩| 91免费片| 午夜精品国产自在| 国产精品55夜色66夜色| 日本人妻一区二区三区不卡影院 | 日韩在线观看网站| 黄色福利在线| 国产精品吹潮在线观看中文| 91精品综合| 久夜色精品国产噜噜| 天天色综网| 亚洲日韩久久综合中文字幕| 97国产在线视频| 国产日韩精品一区在线不卡| 亚洲天堂久久|