日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]一般教科書上提供的UART收發(fā)的程序往往是一段采用輪循(Polling)方式完成收發(fā)的簡單代碼。但對于高速的AVR來講,采用這種方式大大降低了 MUC的效率。在使用AVR時,應根據(jù)芯片本身的特點(片內(nèi)大容量數(shù)據(jù)存儲器RAM,更適

一般教科書上提供的UART收發(fā)的程序往往是一段采用輪循(Polling)方式完成收發(fā)的簡單代碼。但對于高速的AVR來講,采用這種方式大大降低了 MUC的效率。在使用AVR時,應根據(jù)芯片本身的特點(片內(nèi)大容量數(shù)據(jù)存儲器RAM,更適合采用高級語言編寫系統(tǒng)程序),編寫高效可靠的UART收發(fā)接口(低層)程序。下面是一個典型的ATmega128軟件USART的接口程序。

#include mega128.h>

#define RXB8 1

#define TXB8 0

#define UPE 2

#define OVR 3

#define FE 4

#define UDRE 5

#define RXC 7

#define FRAMING_ERROR (1<

#define PARITY_ERROR (1<

#define DATA_OVERRUN (1<

#define DATA_REGISTER_EMPTY (1<

#define RX_COMPLEte (1<

// USART0 Receiver buffer

#define RX_BUFFER_SIZE0 8

char rx_buffer0[RX_BUFFER_SIZE0];

unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;

// This flag is set ON USART0 Receiver buffer overflow

bit rx_buffer_overflow0;

// USART0 Receiver interrupt service routine

#pragma savereg-

interrupt [USART0_RXC] void uart0_rx_isr(void)

{

char status,data;

#asm

push r26

push r27

push r30

push r31

in r26,sreg

push r26

#endasm

status=UCSR0A;

data=UDR0;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)

{

rx_buffer0[rx_wr_index0]=data;

if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;

if (++rx_counter0 == RX_BUFFER_SIZE0)

{

rx_counter0=0;

rx_buffer_overflow0=1;

};

};

#asm

pop r26

out sreg,r26

pop r31

pop r30

pop r27

pop r26

#endasm

}

#pragma savereg+

#ifndef _DEBUG_TERMINAL_IO_

// Get a character from the USART0 Receiver buffer

#define _ALTERNATE_GETCHAR_

#pragma used+

char getchar(void)

{

char data;

while (rx_counter0==0);

data=rx_buffer0[rx_rd_index0];

if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;

#asm("cli")

--rx_counter0;

#asm("sei")

return data;

}

#pragma used-

#endif

// USART0 Transmitter buffer

#define TX_BUFFER_SIZE0 8

char tx_buffer0[TX_BUFFER_SIZE0];

unsigned char tx_wr_index0,tx_rd_index0,tx_counter0;

// USART0 Transmitter interrupt service routine

#pragma savereg-

interrupt [USART0_TXC] void uart0_tx_isr(void)

{

#asm

push r26

push r27

push r30

push r31

in r26,sreg

push r26

#edasm

if (tx_counter0)

{

--tx_counter0;

UDR0=tx_buffer0[tx_rd_index0];

if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;

};

#asm

pop r26

out sreg,r26

pop r31

pop r30

pop r27

pop r26

#endasm

}

#pragma savereg+

#ifndef _DEBUG_TERMINAL_IO_

// Write a character to the USART0 Transmitter buffer

#define _ALTERNATE_PUTCHAR_

#pragma used+

void putchar(char c)

{

while (tx_counter0 == TX_BUFFER_SIZE0);

#asm("cli")

if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))

{

tx_buffer0[tx_wr_index0]=c;

if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;

++tx_counter0;

}

else

UDR0=c;

#asm("sei")

}

#pragma used-

#endif

// Standard Input/Output functions

#include

// Declare your global variables here

void main(void)

{

// USART0 initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART0 Receiver: On

// USART0 Transmitter: On

// USART0 Mode: Asynchronous

// USART0 Baud rate: 9600

UCSR0A=0x00;

UCSR0B=0xD8;

UCSR0C=0x06;

UBRR0H=0x00;

UBRR0L=0x67;

// Global enable interrupts

#asm("sei")

while (1)

{

// Place your code here

};

}

這段由CVAVR程序生成器產(chǎn)生的UART接口代碼是一個非常好的、高效可靠,并且值得認真學習和體會的。其特點如下:

l. 它采用兩個8字節(jié)的接收和發(fā)送緩沖器來提高MCU的效率,如當主程序調(diào)用Putchar()發(fā)送數(shù)據(jù)時,如果UART口不空閑,就將數(shù)據(jù)放入發(fā)送緩沖器中,MCU不必等待,可以繼續(xù)執(zhí)行其它的工作。而UART的硬件發(fā)送完一個數(shù)據(jù)后,產(chǎn)生中斷,由中斷服務程序負責將發(fā)送緩沖器中數(shù)據(jù)依次送出。

2.數(shù)據(jù)緩沖器結(jié)構是一個線性的循環(huán)隊列,由讀、寫和隊列計數(shù)器3個指針控制,用于判斷隊列是否空、溢出,以及當前數(shù)據(jù)在隊列中的位置。

3. 用編譯控制命令#pragma savereg-和#pragma savereg+,使得由CVAVR在生成的中斷服務程序中不進行中斷保護(CVAVR生成中斷保護會將比較多的寄存器壓入堆棧中),而在中斷中嵌入?yún)R編,只將5個在本中斷中必須要保護的寄存器壓棧。這樣提高了UART中斷處理的速度,也意味著提高了MCU的效率。

4.由于在接口程序Putchar()、Getchar()和中斷服務程序中都要對數(shù)據(jù)緩沖器的讀、寫和隊列計數(shù)器3個指針判斷和操作,為了防止沖突,在Putchar()、Getchar()中對3個指針操作時臨時將中斷關閉,提高了程序的可靠性。

建議讀者能逐字逐句地仔細分析該段代碼,真正理解和領會每一句語句(包括編譯控制命令的作用)的作用,從中體會和學習如何編寫效率高,可靠性好,結(jié)構優(yōu)良的系統(tǒng)代碼。這段程序使用的方法和技巧,對編寫SPI、I2C的串行通信接口程序都是非常好的借鑒。

作為現(xiàn)在的單片機和嵌入式系統(tǒng)的工程師,不僅要深入全面的掌握芯片和各種器件的性能,具備豐富的硬件設計能力;同時也必須提高軟件的設計能力。要學習和掌握有關數(shù)據(jù)結(jié)構、操作系統(tǒng)、軟件工程、網(wǎng)絡協(xié)議等方面的知識,具有設計編寫大的復雜系統(tǒng)程序的能力。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

上海2025年8月26日 /美通社/ -- 在全球數(shù)字經(jīng)濟加速演進的時代浪潮中,海量數(shù)據(jù)資源正成為企業(yè)發(fā)展的雙刃劍。超66%的企業(yè)面臨"數(shù)據(jù)沉睡"危機——分散于供應鏈、財務、客戶運營等數(shù)十個系統(tǒng)的業(yè)務...

關鍵字: AI 模型 軟件 數(shù)據(jù)分析

加快開發(fā)進程;提升質(zhì)量、安全性、性能與成本效益 利用耐世特在底盤領域的專業(yè)知識和線控技術產(chǎn)品組合 美國密西根州奧本山2025年8月11日 /美通社/ --?耐...

關鍵字: MOTION 軟件 運動控制 NI

從自然汲取,向未來創(chuàng)造 上海2025年8月8日 /美通社/ -- 2025 世界機器人大會將于8月8-12日在北京亦創(chuàng)國際會展中心拉開帷幕,F(xiàn)esto(A112展位­)將以"從自然汲取,向未來創(chuàng)造&q...

關鍵字: FESTO 機器人 BSP 軟件

引言:穿越變革浪潮,迎接智能金融時代 上海2025年7月28日 /美通社/ -- 在全球科技變革的浪潮中,生成式AI正加速驅(qū)動各行業(yè)變革,金融行業(yè)尤為顯著。在強監(jiān)管與用戶需求升級的雙重壓力,行業(yè)亟需重構服務模...

關鍵字: 軟件 生成式AI 模型 數(shù)字化

寧波2025年7月28日 /美通社/ -- 日前,在第四屆寧波市專利創(chuàng)新大賽的聚光燈下,中之杰智能的創(chuàng)新技術"一種基于電子周轉(zhuǎn)箱的生產(chǎn)管理方法及系統(tǒng)"強勢斬獲專利優(yōu)秀獎。這枚沉甸甸的獎章背后...

關鍵字: 軟件 電子 智能工廠 BSP

杭州2025年7月28日 /美通社/ -- 近日,大華股份與北京北大軟件工程股份有限公司(以下簡稱"北大軟件")簽署戰(zhàn)略合作協(xié)議。雙方將重點圍繞長江禁漁等領域,發(fā)揮各自在產(chǎn)品、技術、平臺等方面的經(jīng)驗和...

關鍵字: 軟件 數(shù)字化

成都 2025年7月16日 /美通社/ -- 由立嘉會議展覽有限公司主辦的"2025第四屆成渝地區(qū)裝備制造業(yè)博覽會"將于9月11日至13日在成都世紀城新國際會展中心盛大舉辦。本屆博覽會以&...

關鍵字: BSP 軟件 供應鏈 智能制造

上海 2025年7月14日 /美通社/ -- 近日,微創(chuàng)軟件與全球領先的工業(yè)級綠色智能系統(tǒng)解決方案提供商——上海電氣集團股份有限公司旗下直屬子公司上海電氣數(shù)字科技有限公司,以下簡稱"電氣數(shù)科"宣布深...

關鍵字: 電氣 軟件 數(shù)字化 BSP

全新的集成解決方案確保企業(yè)以安全、負責任的方式應用 AI智能體及其他生成式AI技術。 借助以上工具,企業(yè)可以對智能體執(zhí)行"紅隊測試"和審計,并檢測"影子智能體"...

關鍵字: IBM 軟件 智能體 AI

從傳統(tǒng)機械制造邁向數(shù)字化、智能化的轉(zhuǎn)型之路,軟件定義汽車(SDV)的出現(xiàn),無疑成為這場變革的關鍵驅(qū)動力,預示著產(chǎn)業(yè)拐點即將來臨。那么,支撐軟件定義汽車發(fā)展的支柱究竟是什么呢?

關鍵字: 軟件 傳感器 智能化
關閉