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)。