【STM32F1】——无线收发模块RF200与串口通信
一、简介
本篇主要对调试无线收发模块RF200的过程进行总结,实现了以下功能。
- 串口普通收发:使用STM32F103C8T6的USART2串口接收中断,实现两个无线收发模块RF200间的通信。
二、RF200介绍
- 电压:3.4-5.5V
- 工作频率:418~455MHz
- 发射功率:100mW
- 工作范围:1500m
- 通信方式:UART(默认9600波特率)
- 尺寸:39.5 * 18.3 * 7.0 mm
三、RF200的普通串口通信
-
接线:
-
程序简介:使用STM32F103C8T6的USART2实现9轴姿态模块JY901串口数据的读取,并利用USART1发送到串口助手。
-
实现思路:
1)配置串口USART2,开启接收中断
2)配置串口发送函数
3)进行模块间的通信(RF200-2发送数据,RF200-1发指令点亮MCU的灯) -
代码解析:
1)串口USART2配置(RF200使能):波特率9600
void RF200_Init(void) {// 时钟使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //初始化USART外设RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //由于USART外设在GPIOA 所以初始化GPIO// 发送串口GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // TX 输出设置为复用推挽输出 这里只用到了发送 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//接收串口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 串口配置USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600; // 波特率USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; //需要发送还是接收 都可以选择USART_InitStructure.USART_Parity = USART_Parity_No; //校验位 不选择USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位 1USART_InitStructure.USART_WordLength = USART_WordLength_8b; //不需要校验 所以字长选择8USART_Init(USART2, &USART_InitStructure);/* 串口中断配置 */USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //开启串口接收数据的中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC分组为两位抢占优先级,两位响应优先级NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //选择配置NVIC的USART1线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //指定NVIC线路的抢占优先级为1(根据实际需要修改)NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定NVIC线路的响应优先级为1(根据实际需要修改)NVIC_Init(&NVIC_InitStructure); //将结构体变量交给NVIC_Init,配置NVIC外设// 开启串口USART_Cmd(USART2, ENABLE);}
2)RF200-2发送数据的相关函数:
// 板载RF200发送数据的函数 // 发一个字节 void Serial_SendByte(uint8_t Byte) {USART_SendData(USART2, Byte); //发送数据byte 到 USARTDR 然后再发送给移位寄存器 最后一位一位的移出TX引脚while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); //等待传送到移位寄存器 //不需要清零 在send data时自清零 } // 发一个数组 void Serial_SendArray(uint8_t *Array, uint16_t Length) // {uint16_t i;for (i = 0; i < Length; i ++) {Serial_SendByte(Array[i]);} } // 发一个字符串 void Serial_SendString(char *String) {uint8_t i;for (i = 0; String[i] != '\0'; i ++){Serial_SendByte(String[i]);} } // 重定义printf int fputc(int ch, FILE *f) //由于 fputc是printf的底层 所以修改foutc函数 {Serial_SendByte(ch);return ch; }
3)串口接收中断服务函数:
RF200-1用ASCII发送指令,RF200-2接收到指令,且指令为“0”时LED跳变。
void USART2_IRQHandler(void) {if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){u8 RxData = USART_ReceiveData(USART2);if(RxData == '0'){LED0 =! LED0;}Serial_SendByte(RxData);}delay_ms(1000);USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志位 }