nRF52832学习记录(三、芯片ID,内部温度传感器,随机数发生器)

举报
矜辰所致 发表于 2022/09/25 06:21:21 2022/09/25
【摘要】 唯一ID nRF52XX 每一个芯片都提供一个 64位的唯一ID号,可用来作为芯片识别,加密等引用; 设备唯一ID保存在 寄存器 FICR(工厂信息配置寄存器),官方文档中: DEVICE ID 为只...

唯一ID

nRF52XX 每一个芯片都提供一个 64位的唯一ID号,可用来作为芯片识别,加密等引用;
设备唯一ID保存在 寄存器 FICR(工厂信息配置寄存器),官方文档中:
在这里插入图片描述
DEVICE ID 为只读寄存器,读取示例:

uint32_t id[2];
id[0]=NRF_FICR->DEVICEID[0];//低32位
id[1]=NRF_FICR->DEVICEID[1];//高32位

内部温度传感器
在这里插入图片描述
TEMP寄存器保存了温度的值,0.25度 steps 意思是,每一个刻度代表0.25度,比如数值为10转换成温度就是2.5度。内部温度读取示例:

/*这里是一些前提定义*/
...
#define  NRF_TEMP     ((NRF_TEMP_Type     *) NRF_TEMP_BASE)
...
...
/**
  * @brief Temperature Sensor. (TEMP)
  */

typedef struct {                                    /*!< TEMP Structure                                                        */
  __O  uint32_t  TASKS_START;                       /*!< Start temperature measurement.                                        */
  __O  uint32_t  TASKS_STOP;                        /*!< Stop temperature measurement.                                         */
  __I  uint32_t  RESERVED0[62];
  __IO uint32_t  EVENTS_DATARDY;                    /*!< Temperature measurement complete, data ready event.                   */
  __I  uint32_t  RESERVED1[128];
  __IO uint32_t  INTENSET;                          /*!< Interrupt enable set register.                                        */
  __IO uint32_t  INTENCLR;                          /*!< Interrupt enable clear register.                                      */
  __I  uint32_t  RESERVED2[127];
  __I  int32_t   TEMP;                              /*!< Die temperature in degC, 2's complement format, 0.25 degC pecision.   */
  __I  uint32_t  RESERVED3[700];
  __IO uint32_t  POWER;                             /*!< Peripheral power control.                                             */
} NRF_TEMP_Type;
...

...
//初始化内部温度传感器
nrf_temp_init(); 
...
...
u32 temp_get(){
	u32 temp;//不考虑0下度数
	//开始温度测量
	NRF_TEMP->TASKS_START = 1;
	/*等待温度测量完成 */
    while (NRF_TEMP->EVENTS_DATARDY == 0){
	}
	NRF_TEMP->EVENTS_DATARDY = 0;//清除临时寄存器
	
 	temp = (nrf_temp_read() / 4);	
 	
 	NRF_TEMP->TASKS_STOP = 1; //停止测量
    return temp;
}

随机数产生器
在这里插入图片描述
随机数发生器 RNG 通过触发START任务进行启动,新的随机数连续产生,在准备好时 写入 VALUE 寄存器。每次新的随机数写入到 VALUE寄存器,都会触发一个 VALRDY 事件。

和温度传感器一样,可以单次获取数值进行应用,具体的分析方式参考上面的额温度传感器,下面的例子是读取一个随机数:

...
/*如果要做更复杂的应用,比如多个随机数需要保存读取之类的需要使用库函数*/
err_code = nrf_drv_rng_init(NULL);
APP_ERROR_CHECK(err_code);
...

uint8_t GET_RNG(void)
{
	uint8_t value;
	NRF_RNG->CONFIG=1;    
	NRF_RNG->TASKS_START=1;   
	NRF_RNG->EVENTS_VALRDY=0; 
	while(NRF_RNG->EVENTS_VALRDY==0){
	} 
	value=NRF_RNG->VALUE;              
	NRF_RNG->TASKS_STOP=1;             
	NRF_RNG->INTENCLR=0;               
	NRF_RNG->CONFIG=0;                 
	return value;
}

文章来源: blog.csdn.net,作者:矜辰所致,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_42328389/article/details/120185154

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。