hermantao 2019-06-27
这个小项目主要是带大家入门嵌入式开发领域。
我们的核心是Arduino Uno开发板,下面这张图是Arduino的电路图。我把它的几个大块标记出来,下面我一一来说明下。
选择File -> Project -> GCC executable project
然后需要配置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)。第三步:通过 arduino 软件选择对应的网络端口就可以进行固件更新了,不过更新的时候要注意不能将 Arduino.begin() 和 ArduinoOTA.handle() 这两个关键函数给更新掉