STM32F1 + NRF24L01 无线低功耗人体传感器

这里写目录标题

  • 简述
  • 硬件接口
  • 外设使用
  • NRF24L01低功耗设计
  • STM32F103低功耗设计
  • 代码
    • NRF24L01驱动
    • 外部中断和RTC中断配置

简述

使用STM32F103C8T6 、NRF24L01 、红外热释电传感器组成一个低功耗无线人体传感器,系统采用低功耗设计,在STM32停机模式,整机工作电流37uA,可用电池供电。

硬件接口

SPI接口

STM32引脚 NRF24L01
PB8 NRFIRQ
PB9 NRFCS
PB10 NRFCE
PB13 NRF_SCK
PB14 NRF_MISO
PB15 NRF_MOSI

红外热释电接口
红外热释电为集成感应探头,使用3.3V供电,输出高电平代表有人

STM32引脚 红外热释电
PB11 热释电输出IO口

外设使用

外设 作用
系统滴答定时器 用于软件延时
SPI接口 用于驱动NRF24L01
RTC 停机模式下的定时唤醒
外部中断 停机模式下的中断唤醒

NRF24L01低功耗设计

关于NRF24L01的使用,网上有很多的教程和例程,在这里NRF24L01的SPI驱动使用了原子哥的精英版例程。
针对低功耗设计,只需要修改NRF24L01的配置寄存器的PWR_UP位,1代表上电,0代表掉电。
NRF24L01进入掉电之后,STM32的SPI相关脚位必须都输出高电平,否则会在引脚之间存在漏电。实际测试过用模拟输入方式也会有30左右uA的漏电。
NRF24L01进入掉电模式后,输入电流约为1uA。

STM32F103低功耗设计

STM32F103支持三种低功耗模式,可以查看STM32F103的参考手册
STM32F1 + NRF24L01 无线低功耗人体传感器_第1张图片
睡眠模式,功耗较高,没有实际测试。
停机模式,在1.8V供电区域的的所有时钟都被停止, PLL、 HSI和
HSE RC振荡器的功能被禁止, SRAM和寄存器内容被保留下来(见参考手册)。"SRAM和寄存器保留"这点个人感觉是和待机模式区别最大的一点,停机模式唤醒之后,从进入停机的指令后继续运行;而待机是程序重新运行,相当于重新上电。
在进入停机模式时,可以选择电压调节器开启或处于低功耗模式。低功耗模式会进一步降低功耗,但会增加下次唤醒的启动时间。可以根据实际情况进行选择。
还有注意的一点,从停机模式唤醒后,系统的时钟为内部时钟,如需切换到外部时钟,需要重新初始化时钟。
待机模式,待机模式是功耗最低的,该模式是在Cortex-M3深睡眠模式时关闭电压调节器。1.8V供电区域被断电。 PLL、 HSI和HSE振荡器也被断电。 SRAM和寄存器内容丢失。换言之,就是端口全部不会保持待机前的状态(除WKUP引脚)

代码

完全代码可以在CSDN上下载链接,这里列出部分驱动代码

NRF24L01驱动

SPI接口初始化,直接使用原子哥的代码,改了端口和引脚

//初始化24L01的IO口
void NRF24L01_Init(void)
{
    	
	GPIO_InitTypeDef GPIO_InitStructure;
  	SPI_InitTypeDef  SPI_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB端口时钟
    	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_9;	//PB9 10推挽 	  	
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化指定IO
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;   
	GPIO_InitStructure

你可能感兴趣的:(stm32,嵌入式)