查看: 871|回复: 0

【原创】读取 UNO 的 AVR 熔丝等信息

[复制链接]
发表于 2019-3-21 18:25 | 显示全部楼层 |阅读模式
本帖最后由 t3486784401 于 2019-3-21 18:25 编辑

UNO 使用 AVR 控制器 M328P,在一些时候需要知道熔丝配置信息(例如确认工作状态)。
正常情况下这些信息需要 ISP 下载器(例如2313那个)来读取,但是 AVR 支持用户程序访问,
这索性用内联汇编写了段读取代码,直接用IDE下进去就能读出了。

至于这些信息怎么用,需要参考 AVR 手册,无非就是晶振选择、掉电检测、BOOT范围等等。
其中 Fuse: 熔丝位,Lock: 锁定位,Sign: 签名位(对应AVR型号),
最后一项 OSCCAL 是芯片校正字,在小规模下可以用作 AVR 的指纹(重复几率 1/256)。

  1. uint8_t ReadINFO(uint8_t idx)
  2. {
  3.     // Read INFO(idx=0~7)
  4.     const uint8_t CmdTable[16]=
  5.     {
  6.         // [0/2/4...]= SPMCSR
  7.         // [1/3/5...]= Z-PTR
  8.         _BV(SIGRD)|_BV(SPMEN), 0,   // Signature 1
  9.         _BV(SIGRD)|_BV(SPMEN), 2,   // Signature 2
  10.         _BV(SIGRD)|_BV(SPMEN), 4,   // Signature 3
  11.         _BV(SIGRD)|_BV(SPMEN), 1,   // OSCCal
  12.         _BV(BLBSET)|_BV(SPMEN), 2,  // Fuse Extended Byte
  13.         _BV(BLBSET)|_BV(SPMEN), 3,  // Fuse High Byte
  14.         _BV(BLBSET)|_BV(SPMEN), 0,  // Fuse Low Byte
  15.         _BV(BLBSET)|_BV(SPMEN), 1,  // Lock Bits
  16.     };
  17.     uint8_t cmd= CmdTable[idx*2];
  18.     uint8_t adr= CmdTable[idx*2+1];
  19.     uint8_t dat= 0;
  20.     // Save/Restore Z data
  21.     __asm__ __volatile__("push r30\n" "push r31\n");
  22.     // Z=addr, dat=(Z)
  23.     while(SPMCSR&_BV(SPMEN));           // Wait until idle
  24.     __asm__ __volatile__("clr r31\n" "mov r30, %0\n" :"+r"(adr));
  25.     SPMCSR= cmd;
  26.     __asm__ __volatile__("lpm %0, Z" :"=r"(dat));
  27.     // Save/Restore Z data
  28.     __asm__ __volatile__("pop r31\n" "pop r30\n");
  29.     return dat;
  30. }
复制代码


运行结果:
2019-03-21_180744.png

附上完整代码: ReadCFG-M328P.rar (13.43 KB, 下载次数: 5)

评分

参与人数 1贡献 +1 收起 理由
coloz + 1 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

Blynk与m5stack basic以及uiflow的交互玩法
Blynk与m5stack basic以及
Blynk与m5stack basic以及uiflow的交互玩法 [准备工作我们假设玩家已经熟悉下面的准备
足彩
足彩
喜欢足彩的可以找我 实力收米 百分百惊喜
编译出现open NUL: The system cannot find the file specified
编译出现open NUL: The sy
电脑系统win10,新装IDE1.8.1版本出现编译不过的问题,提示open NUL: The system canno
Arduino Ter什么时候上市购买
Arduino Ter什么时候上市
一直没人问 那我就来问问好了 深爱 Arduino 但目前的开发板资源有限 简单的就比如现有
Arduino MEGA 与UNO 通过nRF24L模块通讯
Arduino MEGA 与UNO 通过n
之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表