Atmel Studiohtml
AvrDudegit
這個小項目主要是帶你們入門嵌入式開發領域。github
咱們的核心是Arduino Uno開發板,下面這張圖是Arduino的電路圖。我把它的幾個大塊標記出來,下面我一一來講明下。編程
選擇File -> Project -> GCC executable projectssh
而後須要配置avrdude, 選擇tool -> external tool開始配置avrdude函數
C:\avrdude\avrdude.exe
請填寫到avrdude的路徑。-F -V -c arduino -p ATMEGA328P -P COM6 -b 115200 -U flash:w:"$(ProjectDir)Debug\$(ItemFileName).hex":i
裏面的COM6請從device manager中找出當前的comm port.DDRB |= (1 << PB5); //配置PB5的data direction register PORTB |= (1 << PB5); //使PB5輸出高電平 PORTB &= ~(1 << PB5); //使PB5輸出低電平
在atmel328P的data sheet, section 24。有詳細的USART的描述,對於USART來講,首先確定是要配置波特率了,而後須要配置USART的一些傳輸模式,好比一次發8 bit 或者一次發7 bit,有沒有stop bit等等。工具
//配置USART UBRR0H = (uint8_t)(BAUDRATE_9600_UBRR >> 8); // 配置波特率 UBRR0L = (uint8_t)BAUDRATE_9600_UBRR; UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1 << RXCIE0); //enable接收和發送數據 UCSR0C = (3<<UCSZ00); //配置發送模式,8 bit 數據 1 bit stop bit
//發送數據 void USART_Transmit(uint8_t * Data, uint16_t Length) { uint16_t i; for (i = 0; i < Length; i++) { /* Wait for empty transmit buffer */ while (!( UCSR0A & (1<<UDRE0))); /* Put data into buffer, sends the data */ UDR0 = Data[i]; } }
//接收數據, 使用中斷接收數據 ISR(USART_RX_vect) { uint8_t ReceivedData; ReceivedData = UDR0; }
在command line interface的實現過程當中,有些蠻有趣的地方。優化
USART_StartCmdProcess
,用來記錄當前在receive buffer中有多少個命令。緣由是咱們是在中斷中把這個變量自加1,當編譯器編譯這段代碼的時候,若是沒有volatile的話,編譯器並不知道何時這個變量何時會加1,由於中斷在任什麼時候候均可能發生。所以在主函數裏面有if (變量 > 0),這個判斷會被編譯器認爲永遠不會發生(編譯器將這個判斷爲永遠false)。因此加了volatile就強制編譯器在編譯去真正判斷地判斷變量的值,簡單地說是不會優化主函數裏面地if (變量 > 0)。