微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32 NRF24L01+USART搞定有线和无线通信

stm32 NRF24L01+USART搞定有线和无线通信

时间:11-19 来源:互联网 点击:
前言

一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法。这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据接收的适配器。这里基于stm32分别设计了现场部分和适配器部分,这里只是基本通信功能实现的讲解,一些复杂的技术比如加密、可靠等要根据具体的应用来设计~

总体说明

这里采用stm32作为MCU,采用nRF24L01作为2.4G通信模块。其中适配器中仅仅采用了USARTNRF24L01两个主要部分,负责将下位机通过2.4G发送过来的数据通过串口发送给上位机,或者将上位机的通过串口传来的数据通过2.4G发送给下位机来实现远程监控(没有采用uc-os操作系统,也没有界面,要用串口和上位机相连);其中下位机比较复杂,因为一般下位机是一个集成的系统,包括从各种传感器收集数据、向各种类型的驱动电路发送控制命令、将数据输给打印机或显示器、和无线通信或有线通信设备进行互相通信来实现数据传输等,这里的下位机比较简单:采用uc-os实时操作系统+uc-gui负责界面显示,外接7寸TFT液晶显示屏,和适配器类似也包括USART和NRF24L01通信部分,但是因为有了操作系统和可视化交互界面,所以也有点不同,接下来开始介绍。

适配器部分

这里介绍的流程是以main函数为基准,广度拓宽知识点,最后main函数说完,整个工程的细节也就大致能了解了~

1 int main(void){2   uint8_t a=0;//LED高低电压控制3   /* System Clocks Configuration */4   RCC_Configuration();                                              //系统时钟设置    5   /*嵌套向量中断控制器 6       说明了USART1抢占优先级级别0(最多1位) ,和子优先级级别0(最多7位) */ 7   NVIC_Configuration();                                              //中断源配置8   /*对控制LED指示灯的IO口进行了初始化,将端口配置为推挽上拉输出,口线速度为50Mhz。PA9,PA10端口复用为串口1的TX,RX。9   在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口B, 因此要对这个端口的时钟10   进行使能,同时由于用到复用IO口功能用于配置串口。因此还要使能AFIO(复用功能IO)时钟。*/11   GPIO_Configuration();                                              //端口初始化12   SPI2_NRF24L01_Init();                                           //SPI2及NRF24L01接口初始化  13   USART_Config(USART1);                                              //串口1初始化14   /*NRF24L01设置为接收模式*/15   RX_Mode(); 16 17    while (1)18   {19     if(usart_rec_flag==1) //判断是否收到一帧有效数据20     {                                                  21         usart_rec_flag=0;22         NRF_Send_Data(TxBufferRF,sizeof(TxBufferRF));23         if(a==0){GPIO_SetBits(GPIOB, GPIO_Pin_5);a=1;}          //LED1  明暗闪烁                24         else{GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=0;}25     }26     if(rf_rec_flag==1)27     {28           rf_rec_flag=0;29            for(i=0;i<32;i++)//发送字符串30         {31             USART_SendChar(USART1,TxBufferUSART[i]);32         //    Delay(0x0ff00);33         }34     }35   }36 }

第4行RCC初始化主要是系统时钟和外设时钟配置,这里注意要使能RCC_APB2Periph_USART1,当时忘了使能这个结果串口出现异常,我还以为是初始化和中断向量什么的弄错了呢,浪费了很长时间。

1 /*--2 系统时钟配置为72MHZ+外设时钟配置*/ 3 void RCC_Configuration(void){4    SystemInit(); 5    RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 RCC_APB2Periph_GPIOA  RCC_APB2Periph_GPIOB RCC_APB2Periph_AFIO  , ENABLE);  6 }

第7行中断向量初始化设置,主要是设置串口接收中断和NRF24L01中断的,这样设置好了之后当串口中断被触发时其对应的中断子程序将被执行(这个科班的大概都知道这里就不多说了),所以我们就要在stm32f10x_it.c里实现他们各自的中断子程序了(这个一会再详细介绍,咱们先把整个框架了解下)。另外说一句,这里的的优先级组将影响主优先级和子优先级数量具体请参考stm32f10X_的固件库的NVIC.

1 void NVIC_Configuration(void){2  /*  结构声明*/3   NVIC_InitTypeDef NVIC_InitStructure;4   EXTI_InitTypeDef EXTI_InitStructure;        5   6   /* 优先级组 1  */    7   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);           8   9   /* Enable the USART1 Interrupt */10   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                     //设置串口1中断11   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;             //抢占优先级 012   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                //子优先级为013   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                    //使能14   NVIC_Init(&NVIC_InitStructure);                                              15 16                                                                     17   NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                    //NRF24L01 中断响应18   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;            //抢占优先级 019   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //子优先级为120   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                    //使能21   NVIC_Init(&NVIC_InitStructure);                                                22 23   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);       //NRF24L01 IRQ  PA024   25   EXTI_InitStructure.EXTI_Line = EXTI_Line0;                       //NRF24L01 IRQ PA026   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;               //EXTI中断27   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;           //下降沿触发28   EXTI_InitStructure.EXTI_LineCmd = ENABLE;                           //使能29   EXTI_Init(&EXTI_InitStructure);    30 }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top