在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UART系統(tǒng)配置步驟詳解

冬至子 ? 來源:兩猿社 ? 作者:IC猿 ? 2023-06-05 16:05 ? 次閱讀

00 模塊簡(jiǎn)介

CPU通過掛載到APB總線上的UART模塊,實(shí)現(xiàn)其與外部設(shè)備的串行通信。系統(tǒng)配置部分將 實(shí)現(xiàn)UART模塊與CPU的通信,APB總線的讀寫和模塊的功能配置,中斷信號(hào)的產(chǎn)生

AMBA總線中的APB總線由于功耗小,接口簡(jiǎn)單,適用于低帶寬且不需要更高性能總線的中低速外設(shè)。UART是此類常見外設(shè),通常使用APB總線與系統(tǒng)連接。

01 模塊接口與描述

1.jpg

2.jpg

02 實(shí)現(xiàn)

REG_IF模塊主要由 狀態(tài)信息同步APB總線讀寫FIFO讀寫使能狀態(tài)寄存器操作及中斷產(chǎn)生這幾部分構(gòu)成。

APB總線讀寫:通過APB總線實(shí)現(xiàn)與CPU的通信,通過配置寄存器方式實(shí)現(xiàn)數(shù)據(jù)收發(fā),控制UART模塊功能,讀取模塊工作狀態(tài)等。

FIFO讀寫使能:分別是RF_FIFO的讀使能控制和TX_FIFO的寫使能控制。

狀態(tài)寄存器操作及中斷產(chǎn)生:將TX、RX模塊反饋的工作狀態(tài)體現(xiàn)在狀態(tài)寄存器中,供CPU查詢,并產(chǎn)生中斷信號(hào)通知CPU進(jìn)行處理。

  • 狀態(tài)信息同步

配置模塊工作在系統(tǒng)時(shí)鐘域,將收到來自接收模塊和發(fā)送模塊的狀態(tài)指示信息,這部分信號(hào)需要在系統(tǒng)時(shí)鐘域進(jìn)行同步。

  • APB總線讀寫

前面我們講過APB讀寫時(shí)序。

APB讀:作為APB從設(shè)備,當(dāng)APB總線發(fā)起讀操作時(shí),需要在合適的時(shí)間將對(duì)應(yīng)地址的寄存器值送到總線(如下圖T3),確保主機(jī)能收到數(shù)據(jù)。此時(shí) PENABLE等于0,PSEL等于1,PWRITE等于0

圖片

apb讀

APB讀實(shí)現(xiàn)如下:

//read reg value
always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        prdata_o <= 32'h0;
    end
    elsebegin
        // APB read
        if(psel_i && (!penable_i) && (!pwrite_i)) begin
            case(paddr_i)
            4'h0:
                prdata_o <= uart_tx;
            4'h1:
                prdata_o <= uart_rx;
            4'h2:
                prdata_o <= uart_baud;
            4'h3:
                prdata_o <= uart_conf;
            4'h4:
                prdata_o <= uart_rxtrig;
            4'h5:
                prdata_o <= uart_txtrig;
            4'h6:
                prdata_o <= uart_delay;
            4'h7:
                prdata_o <= uart_status;
            4'h8:
                prdata_o <= uart_rxfifo_stat;
            4'h9:
                prdata_o <= uart_txfifo_stat;
            endcase
        end
    end
end

APB寫:類似的,當(dāng)APB總線上發(fā)起寫操作時(shí),從機(jī)需要在合適的時(shí)間接收總線上的數(shù)據(jù)(如下圖T4),放到對(duì)應(yīng)的寄存器地址。此時(shí) PENABLE等于1,PSEL等于1,PWRITE等于1

圖片

apb寫

APB寫實(shí)現(xiàn)如下:

//write reg value
always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        uart_tx     <= 32'h0;
        uart_baud   <= 32'hf152;
        uart_conf   <= 32'h34;
        uart_rxtrig <= 32'h1;
        uart_txtrig <= 32'h0;
        uart_delay  <= 32'h2;
    end
    elsebegin
        // APB write
        if(psel_i && penable_i && pwrite_i) begin
            case(paddr_i)
            4'h0:
                uart_tx     <= pwdata_i;
            4'h2:
                uart_baud   <= pwdata_i;
            4'h3:
                uart_conf   <= pwdata_i;
            4'h4:
                uart_rxtrig <= pwdata_i;
            4'h5:
                uart_txtrig <= pwdata_i;
            4'h6:
                uart_delay  <= pwdata_i;
            endcase
        end
    end
end
  • FIFO讀寫使能

RX_FIFO讀控制:

在cpu讀uart狀態(tài)寄存器(uart_status)時(shí),如果rx中斷有效(即狀態(tài)位的第1bit位有效),且FIFO不為空,RX_FIFO讀使能一個(gè)時(shí)鐘周期。

或在cpu讀接收數(shù)據(jù)寄存器(uart_rx)時(shí),RX_FIFO讀使能一個(gè)時(shí)鐘周期。

注意由于讀出FIFO數(shù)據(jù)需要1個(gè)時(shí)鐘周期,為了使cpu能及時(shí)讀到數(shù)據(jù),在讀狀態(tài)寄存器時(shí)其實(shí)是一個(gè)預(yù)取動(dòng)作。

// FIFO enable control
always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        rx_fifo_rinc <= 1'b0;
        state        <= 1'b0;
    end
    elsebegin
        case(state)
        1'b0: begin
            // when ARM read uart_status, judge interrupt bit ,if rx_int is
            // active, or ARM read uart_rx ,rx_fifo_rinc enable 1 clk
            if(psel_i && (!penable_i)&&(!pwrite_i)&&(paddr_i==4'h7)) begin
                if(uart_status[1] && !rx_fifo_rempty) begin
                    rx_fifo_rinc <= 1'b1;
                    state        <= 1'b1;
                end
            end
            // when ARM read data,rx_fifo_rinc enable 1 clk
            if(psel_i &&(!penable_i)&&(!pwrite_i)&&(paddr_i==4'h1)) begin
                rx_fifo_rinc <= 1'b1;
                state        <= 1'b1;
            end
        end
        1'b1: begin
            rx_fifo_rinc <= 1'b0;
            state        <= 1'b0;
        end
        endcase
    end
end

TX_FIFO寫控制:

在cpu寫uart_tx時(shí),說明需要UART模塊發(fā)送數(shù)據(jù),APB寫數(shù)據(jù)到寄存器需要1個(gè)時(shí)鐘周期,所以需要在1個(gè)時(shí)鐘之后再寫使能TX_FIFO。

always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        tx_fifo_winc <= 1'b0;
        state_en     <= 2'b0;
    end
    elsebegin
        case(state_en)
        2'b0: begin
            // ARM write uart_tx,tx_fifo_winc enable 1 clk after 1 clk
            if(psel_i && penable_i && pwrite_i && (paddr_i==4'h0)) begin
                state_en <= 2'b01;
            end
        end
        2'b01: begin
            state_en     <= 2'b10;
            tx_fifo_winc <= 1'b1;
        end
        2'b10: begin
            tx_fifo_winc <= 1'b0;
            state_en     <= 2'b0;
        end
        endcase
    end
end
  • 狀態(tài)寄存器操作及中斷產(chǎn)生

狀態(tài)寄存器指示4個(gè)狀態(tài):ST_ERROR,P_ERROR,RX_INT和TX_INT。由高到低在寄存器uart_status[3:0]。分別表示接收數(shù)據(jù)停止位出錯(cuò)、接收數(shù)據(jù)校驗(yàn)位出錯(cuò)、接收數(shù)據(jù)中斷位和發(fā)送數(shù)據(jù)中斷位。

其中接收數(shù)據(jù)中斷位有效表示RX_FIFO中數(shù)據(jù)量增加到觸發(fā)值,數(shù)據(jù)將滿(觸發(fā)值由cpu配置),通知cpu接收數(shù)據(jù);發(fā)送數(shù)據(jù)中斷位有效表示TX_FIFO中數(shù)據(jù)減少到觸發(fā)值,數(shù)據(jù)將空(觸發(fā)值由cpu配置),通知cpu數(shù)據(jù)將要發(fā)送完畢,需補(bǔ)充數(shù)據(jù)。

從接收模塊接收到的ST_ERROR,P_ERROR信號(hào)響應(yīng)也在此部分產(chǎn)生,表示已經(jīng)收到此狀態(tài)。

// uart_status register operate
always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        p_error_ack  <= 1'b0;
        st_error_ack <= 1'b0;
        uart_status  <= 32'h0;
        rx_state     <= 1'b0;
        tx_state     <= 1'b0;
    end
    elsebegin
        if(st_error_syn) begin
            uart_status[3]   <= 1'b1;
        end
        elsebegin
            if(neg_uart_status3) begin
                st_error_ack <= 1'b1;
            end
            elsebegin
                if(!st_error_syn2) begin
                    st_error_ack <= 1'b0;
                end
            end
        end
        if(p_error_syn) begin
            uart_status[2]   <= 1'b1;
        end
        elsebegin
            if(neg_uart_status2) begin
                p_error_ack  <= 1'b1;
            end
            elsebegin
                if(!p_error_syn2) begin
                    p_error_ack  <= 1'b0;
                end
            end
        end
        // when rx_fifo_cnt from less than to equal the rxtrig,
        // rx_int is active
        case(rx_state)
        1'b0: begin
            if(rx_fifo_cnt == (uart_rxtrig[3:0] - 1'b1)) begin
                rx_state      <= 1'b1;
            end
            elsebegin
                rx_state      <= 1'b0;
            end
        end
        1'b1: begin
            if(rx_fifo_cnt == uart_rxtrig[3:0]) begin
                uart_status[1] <= 1'b1;
                rx_state       <= 1'b0;
            end
            elsebegin
                rx_state       <= 1'b1;
            end
        end
        endcase
        // when tx_fifo_cnt from greater than to equal the txtrig,
        // tx_int is active
        case(tx_state)
        1'b0: begin
            if(tx_fifo_cnt == (uart_txtrig[3:0] + 1'b1)) begin
                tx_state       <= 1'b1;
            end
            elsebegin
                tx_state       <= 1'b0;
            end
        end
        1'b1: begin
            if(tx_fifo_cnt == uart_txtrig[3:0]) begin
                uart_status[0] <= 1'b1;
                tx_state       <= 1'b0;
            end
            elsebegin
                tx_state       <= 1'b1;
            end
        end
        endcase
        // ARM write 1 clean 0  uart_status
        if(psel_i && penable_i && pwrite_i && (paddr_i==4'h7)) begin
            uart_status <= uart_status & (~pwdata_i);
        end
    end
end

// produce interrupt to CPU
always @(posedge clk ornegedge rst_) begin
    if(!rst_) begin
	      uart_int_o <= 1'b0;
		end
	  elsebegin
	      if(|uart_status[3:0]) begin
            uart_int_o <= 1'b1;
        end
		    elsebegin
            uart_int_o <= 1'b0;
        end
		end
end

當(dāng)uart_status中任何一位狀態(tài)位1中斷信號(hào)將有效,cpu接收到中斷后查詢狀態(tài)寄存器uart_status,處理后對(duì)uart_status寄存器寫1清零,清掉狀態(tài)位,即清除中斷。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    2017

    瀏覽量

    61379
  • FIFO存儲(chǔ)
    +關(guān)注

    關(guān)注

    0

    文章

    103

    瀏覽量

    6039
  • UART接口
    +關(guān)注

    關(guān)注

    0

    文章

    124

    瀏覽量

    15370
  • 串口中斷
    +關(guān)注

    關(guān)注

    0

    文章

    67

    瀏覽量

    14019
  • 狀態(tài)寄存器
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    7156
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FPGA最小系統(tǒng)配置電路的設(shè)計(jì)資料

    FPGA最小系統(tǒng)配置電路的設(shè)計(jì)資料
    發(fā)表于 05-04 16:04

    NI MAX 系統(tǒng)配置問題

    NI MAX 系統(tǒng)配置出現(xiàn)問題顯示不可用,請(qǐng)問該如何解決
    發(fā)表于 06-26 19:36

    單片機(jī)系統(tǒng)配置及接口相關(guān)介紹

    單片機(jī)原理及應(yīng)用C語言版9ppt課件單片機(jī)原理及應(yīng)用 (C語言版)第9章單片機(jī)系統(tǒng)配置及接口 第9章 單片機(jī)系統(tǒng)配置及接口 目錄9.1鍵盤接口 9.2LED顯示接口 9.3A/D轉(zhuǎn)換接口 9.4D
    發(fā)表于 07-14 08:08

    硬實(shí)時(shí)RTlinux系統(tǒng)配置

    更多技術(shù)干貨,歡迎掃碼關(guān)注博主微信公眾號(hào):HowieXue,一起學(xué)習(xí)探討軟硬件技術(shù)知識(shí)經(jīng)驗(yàn),關(guān)注就有海量學(xué)習(xí)資料免費(fèi)領(lǐng)哦:硬實(shí)時(shí)RTlinux系統(tǒng)配置1. Linux內(nèi)核下載2. 下載與Linux
    發(fā)表于 09-14 06:43

    從I2C寫入系統(tǒng)配置內(nèi)存失敗可能是什么原因?是否按照正確的程序?qū)懭?b class='flag-5'>系統(tǒng)配置?

    我正在研究 ST25DV64KC NFC 芯片。我正在嘗試從 i2c 寫入系統(tǒng)配置內(nèi)存。腳步:1) 我通過發(fā)送當(dāng)前密碼命令打開了 i2c 安全會(huì)話。我已經(jīng)從動(dòng)態(tài)寄存器內(nèi)存中讀取
    發(fā)表于 12-08 08:16

    MP4播放器系統(tǒng)配置

    MP4播放器系統(tǒng)配置              系統(tǒng)配
    發(fā)表于 12-21 16:29 ?2099次閱讀

    LPC111x系統(tǒng)配置

    LPC111x系統(tǒng)配置,有需要的朋友下來看看。
    發(fā)表于 01-13 16:04 ?15次下載

    FPGA最小系統(tǒng)配置電路的設(shè)計(jì)

    FPGA最小系統(tǒng)配置電路的設(shè)計(jì),有興趣的同學(xué)可以下載學(xué)習(xí)
    發(fā)表于 05-04 11:31 ?37次下載

    《微機(jī)原理與匯編語言》應(yīng)用系統(tǒng)配置及接口技術(shù)

    《微機(jī)原理與匯編語言》應(yīng)用系統(tǒng)配置及接口技術(shù)
    發(fā)表于 12-12 22:07 ?0次下載

    ABB機(jī)器人系統(tǒng)配置cclink課件下載

    ABB機(jī)器人系統(tǒng)配置cclink課件下載
    發(fā)表于 05-19 09:36 ?3次下載

    FPGA CPLD可編程邏輯器件的在系統(tǒng)配置方法

    FPGA CPLD可編程邏輯器件的在系統(tǒng)配置方法(深圳市村田電源技術(shù)有限公司)-FPGA CPLD可編程邏輯器件的在系統(tǒng)配置方法? ? ? ? ? ? ? ? ? ?
    發(fā)表于 09-18 10:51 ?13次下載
    FPGA CPLD可編程邏輯器件的在<b class='flag-5'>系統(tǒng)配置</b>方法

    通信電源系統(tǒng)配置設(shè)計(jì)參數(shù)

    通信電源系統(tǒng)配置設(shè)計(jì)參數(shù)(安徽力普拉斯電源技術(shù)有限公司招聘)-該文檔為通信電源系統(tǒng)配置設(shè)計(jì)參數(shù)總結(jié)文檔,是一份不錯(cuò)的參考資料,感興趣的可以下載看看,,,,,,,,,,,,,,,,,
    發(fā)表于 09-22 16:41 ?4次下載
    通信電源<b class='flag-5'>系統(tǒng)配置</b>設(shè)計(jì)參數(shù)

    服務(wù)器Linux系統(tǒng)配置IP地址的方法

    服務(wù)器Linux系統(tǒng)配置IP地址的方法。
    的頭像 發(fā)表于 09-21 14:50 ?8739次閱讀

    簡(jiǎn)單的菜單系統(tǒng)配置開源設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《簡(jiǎn)單的菜單系統(tǒng)配置開源設(shè)計(jì).zip》資料免費(fèi)下載
    發(fā)表于 06-09 10:31 ?0次下載
    簡(jiǎn)單的菜單<b class='flag-5'>系統(tǒng)配置</b>開源設(shè)計(jì)

    C2000系統(tǒng)配置應(yīng)用說明

    電子發(fā)燒友網(wǎng)站提供《C2000系統(tǒng)配置應(yīng)用說明.pdf》資料免費(fèi)下載
    發(fā)表于 09-14 10:12 ?0次下載
    C2000<b class='flag-5'>系統(tǒng)配置</b>應(yīng)用說明
    主站蜘蛛池模板: 日本欧美一区二区三区视频 | 久久riav国产精品 | 亚洲欧美精品 | 草草影院www色极品欧美 | 四虎国产精品影库永久免费 | 国产女人视频 | 黄视频在线播放 | 天天干天天噜 | 天堂在线观看视频 | 草草影院ccyy国产日本欧美 | 性欧美日本 | 午夜视频免费国产在线 | 又粗又爽又色男女乱淫播放男女 | 久久九九色| 国产精品久久精品福利网站 | 欧美另类高清xxxxx | 免费视频现线观看 | jinv在线视频 | 欧美人交性视频在线香蕉 | 日韩毛片免费视频一级特黄 | 免费看 s色| 国产精品久线观看视频 | 天天拍天天干 | 亚洲第一永久在线观看 | 国产亚洲卡二卡3卡4卡乱码 | 女人被免费网站视频在线 | 欧美性精品 | 精品视频69v精品视频 | 最新亚洲情黄在线网站 | 国产精品天天在线 | 免费观看欧美一级片 | 91综合网 | 福利午夜在线 | 看黄色一级毛片 | 国产农村女人一级毛片了 | 国产色网址 | 午夜视频网站在线观看 | 色妹子在线 | 国产午夜视频在永久在线观看 | 久久大香线蕉综合爱 | 久久精品看片 |