stm32 NRF24L01+USART搞定有线和无线通信
时间:11-19
来源:互联网
点击:
第11行的GPIO初始化,主要是对通用IO口的属性设置和初始化,这里一定要对串口所需的A9和A10配置好!
1 void GPIO_Configuration(void){2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1控制--PB53 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出4 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;5 GPIO_Init(GPIOB, &GPIO_InitStructure); 6 7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出9 GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口 10 11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX12 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //复用开漏输入13 GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口 14 }
第12行的SPI2_NRF24L01_Init();主要是驱动NRF24L01的接口初始化,因为NRF24L01采用的是SPI通信,所以这里免不了SPI的设置和相关操作了,不过幸好都封装好了~像以前在51上做SPI就得自己模拟SPI,没有示波器调试起来甚是坑~此外这里我已经把NRF24L01的整个驱动都封装在NRF24L01.c这个文件里了,当想用的时候只要在中断向量里设置其中断接收函数,并在it.c里实现其接收函数;一般主函数里用到的是其初始化函数SPI2_NRF24L01_Init();和RX_Mode();,当在过程中想利用NRF24L01向外发数据时只要调用函数void NRF_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes):
1 /****************************************************************************2 * 名 称:NRF_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes)3 * 功 能:将保存在接收缓存区的32字节的数据通过NRF24L01+发送出去4 * 入口参数:data_buffer 待发送数据5 Nb_bytes 待发送数据长度6 * 出口参数:无7 * 说 明:数据小于32,把有效数据外的空间用0填满8 * 调用方法:RX_Mode();9 ****************************************************************************/10 void NRF_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes)11 { 12 uchar i=0; 13 MODE_CE(0); //NRF 模式控制 14 15 SPI_RW_Reg(WRITE_REG1+STATUS,0xff); //设置状态寄存器初始化16 SPI_RW_Reg(0xe1,0); //清除TX FIFO寄存器17 SPI_RW_Reg(0xe2,0); //清除RX FIFO寄存器18 TX_Mode(); //设置为发送模式19 delay_ms(1);20 if(Nb_bytes<32){ //当接收到的USB虚拟串口数据小于32,把有效数据外的空间用0填满21 for(i=Nb_bytes;i<32;i++) data_buffer[i]=0;22 }23 MODE_CE(0);24 SPI_Write_Buf(WR_TX_PLOAD, data_buffer, TX_PLOAD_WIDTH); //发送32字节的缓存区数据到NRF24L0125 MODE_CE(1); //保持10us以上,将数据发送出去 26 }
第13行是USART初始化,包括波特率、数据位、停止位等~
1 void USART_Config(USART_TypeDef* USARTx){2 USART_InitStructure.USART_BaudRate = 9600; //速率9600bps3 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位4 USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1位5 USART_InitStructure.USART_Parity = USART_Parity_No; //无校验位6 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控7 USART_InitStructure.USART_Mode = USART_Mode_Rx USART_Mode_Tx; //收发模式8 9 /* Configure USART1 */10 USART_Init(USARTx, &USART_InitStructure); //配置串口参数函数11 12 13 /* Enable USART1 Receive and Transmit interrupts */14 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断15 USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能发送缓冲空中断 16 17 /* Enable the USART1 */18 USART_Cmd(USART1, ENABLE); 19 }
同样的类似于NRF24L01一旦初始化之后,其数据接收一般采用中断方式、数据发送一般采用直接发送的方式。所以在中断向量里也要设置,也要在it.c中实现其接收中断子函数。其发送直接调用stm32f10的固件库函数(这里我稍加封装了下):其实就是发送一
stm32NRF24L01USART无线通 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)