搞硬件,确实没有容易二字。最近做一个板子,准备用Arduino开发,但是又不想用现成的Arduino板子,就自己参考Arduino UNO设计了一个。理论上应该半小时搞定的事情,没成想搞了大半天,把坑记录一下,避免重复踩坑。
1. 烧录引导程序
空白的AVR芯片,要先烧录引导程序,才能用Arduino开发。
用USBtinyISP连接好自制的板子,在Arduino中烧录引导程序,结果报错。仔细一查Arduino UNO用的是ATMEGA328P,而我焊的是AEMEGA328PB,烧写时芯片签名验证失败。
ATMEGA328P的签名是0x1e 0x95 0x0f
AEMEGA328PB的签名是 0x1e 0x95 0x16
关于这两个芯片的区别,可以参考AT15007: Differences between ATmega328/P and ATmega328PB
在网上搜索了一下,用328PB也不是不可以,比如说改avrdude.conf文件中的签名,或者安装MiniCore的板子库,两种方法我都试了,没成功,懒得折腾了。把Arduino UNO上的328P拆下来换到自制板子上,烧写引导程序成功。
2. 上传程序
烧录引导程序后,就可以用串口上传程序了,结果还是报错:
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x01
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x01
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x01
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x01
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x01
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x01
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x01
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x01
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x01
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x01
Problem uploading to board. See https://support.arduino.cc/hc/en-us/sections/360003198300 for suggestions.
折腾了半天,发现还是硬件设计上欠考虑了,只预留了串口的RX、TX和GND,RST管脚也要通过一个电容接到USB转串口芯片的DTR,因为下载过程中会对MCU进行复位。这个好办,我的Arduino UNO拆了MCU,正好可以用来上传程序,接好RX、TX、GND、+5V和RST,还是报错,最后怀疑是RX和TX串接电阻的原因,因为Arduino UNO上已经串了1K电阻,我自制的板子上也串了1K电阻,应该是电平不对,把自制板上的1K电阻短接,终于上传成功。
贴一个MiniCore的最小系统图,其中D1、R2和D2不是必须的。
用USB转串口上传程序的图如下:
Arduino Reset --> 0.1µF Capacitor --> DTR PIN
Arduino TX (Pin 1) --> RXD
Arduino RX (Pin 0) --> TXD
Arduino 5V --> +5V
Arduino GND --> GND
CP2102是3.3V电平,如果MCU是5V电平,可能会有问题,把MCU的RX和TX串接电阻改成0欧和1K,应该也可以,未验证。