一般教科書(shū)上提供的UART收發(fā)的程序往往是一段采用輪循(Polling)方式完成收發(fā)的簡(jiǎn)單代碼。但對于高速的AVR來(lái)講,采用這種方式大大降低了 MUC的效率。在使用AVR時(shí),應根據芯片本身的特點(diǎn)(片內大容量數據存儲器RAM,更適合采用高級語(yǔ)言編寫(xiě)系統程序),編寫(xiě)高效可靠的UART收發(fā)接口(低層)程序。下面是一個(gè)典型的ATmega128的軟件USART的接口程序。 #include #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 // 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接口代碼是一個(gè)非常好的、高效可靠,并且值得認真學(xué)習和體會(huì )的。其特點(diǎn)如下: 1. 它采用兩個(gè)8字節的接收和發(fā)送緩沖器來(lái)提高MCU的效率,如當主程序調用Putchar()發(fā)送數據時(shí),如果UART口不空閑,就將數據放入發(fā)送緩沖器中,MCU不必等待,可以繼續執行其它的工作。而UART的硬件發(fā)送完一個(gè)數據后,產(chǎn)生中斷,由中斷服務(wù)程序負責將發(fā)送緩沖器中數據依次送出。 2.數據緩沖器結構是一個(gè)線(xiàn)性的循環(huán)隊列,由讀、寫(xiě)和隊列計數器3個(gè)指針控制,用于判斷隊列是否空、溢出,以及當前數據在隊列中的位置。 3. 用編譯控制命令#pragma savereg-和#pragma savereg+,使得由CVAVR在生成的中斷服務(wù)程序中不進(jìn)行中斷保護(CVAVR生成中斷保護會(huì )將比較多的寄存器壓入堆棧中),而在中斷中嵌入匯編,只將5個(gè)在本中斷中必須要保護的寄存器壓棧。這樣提高了UART中斷處理的速度,也意味著(zhù)提高了MCU的效率。 4.由于在接口程序Putchar()、Getchar()和中斷服務(wù)程序中都要對數據緩沖器的讀、寫(xiě)和隊列計數器3個(gè)指針判斷和操作,為了防止沖突,在Putchar()、Getchar()中對3個(gè)指針操作時(shí)臨時(shí)將中斷關(guān)閉,提高了程序的可靠性。 建議讀者能逐字逐句地仔細分析該段代碼,真正理解和領(lǐng)會(huì )每一句語(yǔ)句(包括編譯控制命令的作用)的作用,從中體會(huì )和學(xué)習如何編寫(xiě)效率高,可靠性好,結構優(yōu)良的系統代碼。這段程序使用的方法和技巧,對編寫(xiě)SPI、I2C的串行通信接口程序都是非常好的借鑒。 作為現在的單片機和嵌入式系統的工程師,不僅要深入全面的掌握芯片和各種器件的性能,具備豐富的硬件設計能力;同時(shí)也必須提高軟件的設計能力。要學(xué)習和掌握有關(guān)數據結構、操作系統、軟件工程、網(wǎng)絡(luò )協(xié)議等方面的知識,具有設計編寫(xiě)大的復雜系統程序的能力。 |