0

我正在使用 avrgcc 和 avrdude 对 avr 微控制器进行编程。如果我指定了错误的控制器,那么 avrdude 会抛出错误消息,指出错误的设备签名。是否有一种 avrdude 方法,我可以从中找到它连接到哪个控制器,例如 Atmega8、Atmega324、Atmega644 等。然后根据收到的控制器回复更改 avrdude 命令很容易。

4

1 回答 1

1

作为第一次尝试,您可以尝试这个(诚然非常丑陋的解决方案):

SIGNATURE=`sudo avrdude -cusbtiny -p1200 -U signature:r:-:i -F 2>/dev/null 
| head -n1 
| sed "s/^:[0-9A-F]\{8\}\([0-9A-F]\{6\}\)[0-9A-F]*/\1/g" 
| sed "s/\([0-9A-F]\{2\}\)\([0-9A-F]\{2\}\)\([0-9A-F]\{2\}\)/0x\L\1 0x\L\2 0x\L\3/g"` 
&& cat /etc/avrdude.conf 
| grep "\(\<id\>\|$SIGNATURE\)" 
| grep -B 1 signature 
| head -n 1 
| sed "s/.*\"\([a-z0-9]*\)\".*/\1/g"

它在 bash 提示符下对我有用,ATtiny2313a 连接到 USBTinyISP,avrdude.conf 位于 /etc/。

让我们把它分开来做一个简短的解释。

获取设备签名

sudo avrdude -cusbtiny -p1200 -U signature:r:-:i -F 2>/dev/null

更改格式以匹配 avrdude.conf

签名位于 avrdude 输出的第一行:

| head -n1 

提取 6 个签名数字:

| sed "s/^:[0-9A-F]\{8\}\([0-9A-F]\{6\}\)[0-9A-F]*/\1/g" 

转换为小写,插入“0x”和“,”

| sed "s/\([0-9A-F]\{2\}\)\([0-9A-F]\{2\}\)\([0-9A-F]\{2\}\)/0x\L\1 0x\L\2 0x\L\3/g"

从avrdude.conf中提取对应的id

找到所有 id 行加上我们的一个签名行:

cat /etc/avrdude.conf 
| grep "\(\<id\>\|$SIGNATURE\)" 

现在为我们的签名提取相应的 id 行:

| grep -B 1 signature 
| head -n 1 

最后,我们删除除 id 之外的所有内容:

| sed "s/.*\"\([a-z0-9]*\)\".*/\1/g"

生成的输出应该可以与您的工具一起使用-希望对您有所帮助...

于 2014-03-27T12:10:44.013 回答