zoukankan      html  css  js  c++  java
  • NRF52 UICR寄存器读写

    通常NRF52系列芯片的UICR寄存器可以保存一些重要的用户数据,而写到此寄存器的数据掉电后是不会丢失的, 读写此寄存器的方法如下:

    写入方法1:

    MDK开发环境直接按以下方式编写。

    const uint32_t UICR_ADDR_0x80 __attribute__((at(0x10001080))) __attribute__((used)) = 0x12345678;

    const uint32_t UICR_ADDR_0x84 __attribute__((at(0x10001084))) __attribute__((used)) = 0xAAAAAAAA;

    const uint32_t UICR_ADDR_0x88 __attribute__((at(0x10001088))) __attribute__((used)) = 0x55555555;

    const uint32_t UICR_ADDR_0x8C __attribute__((at(0x1000108C))) __attribute__((used)) = 0x33333333;

    如果是SES开发环境(如下使用SES_ARM编译器),需用以下方式编写。

     然后在工程的.ld文件里增加以下内容:

    MEMORY
    {

      UICR (r) : ORIGIN = 0x10001080, LENGTH = 0x04

    }

    SECTIONS

    {

    .uicr_customer :
    {
    KEEP(*(.uicr_customer))
    } > UICR

    }

    这种方法在booltloader 代码里可以找到其应用,bootloader的起始地址存在UICR->NRFFW[0]寄存器里,根据代码注释所描述,当向芯片flash里写入bootloader 的Hex文件时,编译器会将bootloader的起始地址编译到HEX里,然后再写到UICR->NRFFW[0]寄存器。

    写入方法2:

    static void uict_write_test(void)

    {

           NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen;

           while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}

           for(uint8_t i=0;i<32;i++)NRF_UICR->CUSTOMER[i] = 0x33445566;

           NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren;

           while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}

    }

    此函数需放在softdevice 初始化之前调用,读出时也一样。

    还可以通过nrfjprog命令写入/读出数据 ,看看写入的数是否正确,命令如下:

    写入方法3:

    直接使用nrfjprog 命令操作UICR寄存器。

  • 相关阅读:
    设备树DTS 学习:学习总结(应用篇)
    设备树DTS 学习: 4-uboot 传递 dtb 给 内核
    设备树DTS 学习:3-驱动开发中常用的 DTS api
    分布式系统阅读笔记(十五)-----协调和一致性
    朴素贝叶斯分类算法
    朴素贝叶斯分类算法
    分布式系统阅读笔记(十四)-----时钟和全局状态
    分布式系统阅读笔记(十四)-----时钟和全局状态
    K-最近邻算法
    K-最近邻算法
  • 原文地址:https://www.cnblogs.com/lim11/p/11134885.html
Copyright © 2011-2022 走看看