查看: 605|回复: 0

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

[复制链接]
  • TA的每日心情
    擦汗
    2019-7-29 00:08
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 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 赞一个!

    查看全部评分

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

    本版积分规则

    热门推荐

    OLED 128*64自制可达10000000个选项的菜单(已更新)
    OLED 128*64自制可达10000
    OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
    Blinker使用求助
    Blinker使用求助
    求助Blinker使用,我按照官网的相关指南配置,写好代码后,蓝牙显示已连接,但是按下
    基于Arduino的捡乒乓球小车
    基于Arduino的捡乒乓球小
    本帖最后由 MT不吃鷄 于 2019-5-2 17:11 编辑 基于Arduino的捡乒乓球小车 先上演示
    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    【Arduino】66种传感器模块系列实验(74)--- 4位LED数码管模块
    【Arduino】66种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表