一、蓝牙模块介绍
主控板配套的是一款低功耗蓝牙模块,适用于短距离无线通信。该模块通常被用于各种嵌入式项目,如物联网(IoT)设备、手机配件、智能家居设备、医疗设备等。
以下是蓝牙模块的一些主要特点和功能:
低功耗: 本模块设计为低能耗,适合电池供电的应用。
蓝牙版本: 支持蓝牙4.0或更高版本,能够与大多数蓝牙设备兼容。
操作范围: 通常具有较好的无线传输距离,适合各种室内外应用。
小尺寸: 模块结构紧凑,便于嵌入到各种设备中。
简单接口: 提供UART、SPI等常用接口,便于与微控制器或其他设备进行连接和通信。
易于配对: 具备快速配对功能,简化了与其他蓝牙设备的连接过程。
模块图片:
二、连接原理图
三、驱动编写
由以上原理图可知,蓝牙模块的通讯协议为串口,接到主控板CW32上的PA2和PA3接口,再查询手册可知PA2,PA3复用功能为UART3,如下图
那么驱动就比较容易了,只需要将之前固件库中串口通信部分复制,然后将里面的串口配置引脚修改为PA2,PA3即可,修改之后如下:
PA02_AFx_UART3TXD();//配置GPIO复用功能PA03_AFx_UART3RXD();GPIO_InitTypeDef GPIO_Initstructure;GPIO_Initstructure.IT=GPIO_IT_NONE;GPIO_Initstructure.Mode=GPIO_MODE_OUTPUT_PP;//配置PA2为推挽输出GPIO_Initstructure.Pins=GPIO_PIN_2;GPIO_Initstructure.Speed=GPIO_SPEED_HIGH;GPIO_Init(CW_GPIOA,&GPIO_Initstructure);GPIO_Initstructure.IT=GPIO_IT_NONE;GPIO_Initstructure.Mode=GPIO_MODE_INPUT_PULLUP;//配置PA3为上拉输入GPIO_Initstructure.Pins=GPIO_PIN_3;GPIO_Initstructure.Speed=GPIO_SPEED_HIGH;GPIO_Init(CW_GPIOA,&GPIO_Initstructure);
这样就可以了,完整的串口初始化如下:
void Uart_Init(void){RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOA,ENABLE);RCC_APBPeriphClk_Enable1(RCC_APB1_PERIPH_UART3,ENABLE);//开启串口3时钟PA02_AFx_UART3TXD();//配置GPIO复用功能PA03_AFx_UART3RXD();GPIO_InitTypeDef GPIO_Initstructure;GPIO_Initstructure.IT=GPIO_IT_NONE;GPIO_Initstructure.Mode=GPIO_MODE_OUTPUT_PP;//配置PA2为推挽输出GPIO_Initstructure.Pins=GPIO_PIN_2;GPIO_Initstructure.Speed=GPIO_SPEED_HIGH;GPIO_Init(CW_GPIOA,&GPIO_Initstructure);GPIO_Initstructure.IT=GPIO_IT_NONE;GPIO_Initstructure.Mode=GPIO_MODE_INPUT_PULLUP;//配置PA3为上拉输入GPIO_Initstructure.Pins=GPIO_PIN_3;GPIO_Initstructure.Speed=GPIO_SPEED_HIGH;GPIO_Init(CW_GPIOA,&GPIO_Initstructure);USART_InitTypeDef USART3_Initstructure;USART3_Initstructure.USART_BaudRate=9600;//配置波特率USART3_Initstructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无流控USART3_Initstructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//USART3_Initstructure.USART_Over=USART_Over_16;USART3_Initstructure.USART_Parity=USART_Parity_No;//不校验USART3_Initstructure.USART_Source=USART_Source_PCLK;USART3_Initstructure.USART_StartBit=USART_StartBit_FE;//起始位USART3_Initstructure.USART_StopBits=USART_StopBits_1;//停止位USART3_Initstructure.USART_UclkFreq=64000000;USART_Init(CW_UART3,&USART3_Initstructure);USART_DirectionModeCmd(CW_UART3,USART_Mode_Tx,ENABLE);USART_DirectionModeCmd(CW_UART3,USART_Mode_Rx,ENABLE);USART_ITConfig(CW_UART3,USART_IT_RC,ENABLE);//中断配置NVIC_SetPriority(UART3_IRQn,0);//配置中断优先级NVIC_EnableIRQ(UART3_IRQn);}
然后再修改一下中断配置,使用状态机接收固定长度的并且带帧头帧尾的数据,数据格式为帧头+一位数据+帧尾
代码如下:
void UART3_IRQHandler(void){static uint8_t Count=0;static uint8_t Pcount=0;if(USART_GetITStatus(CW_UART3,USART_IT_RC)==SET){uint8_t Data=USART_ReceiveData_8bit(CW_UART3);//接收数据if(Count==0){if(Data==0xFF)//判断帧头{Count=1;// Pcount=0;}}else if(Count==1){Rx_Data[Pcount]=Data;//只存入帧头之后的一位数据Pcount++;if(Pcount>0){Count=2;Pcount=0;}}else if(Count==2){if(Data==0xFE)//判断帧尾{Count=0;}}USART_ClearITPendingBit(CW_UART3,USART_IT_RC);//清除标志位}}
所以一帧完整的数据为(帧头)0XFF+数据+(帧尾)0XFE;
然后在主函数中写入以下代码
int main(void){Uart_Init();//串口初始化函数printf("Hello world!rn");while(1){}}
四、工作现象
当烧写代码之后,手机打开任意一个蓝牙调试助手,发送如下数据
便可以看到OLED屏幕上第一行第一列显示字符串HELLO,第二行在蓝牙未接收到数据时显示00,接收到之后显示接收到的数据,本实验发送02,则显示02,可以自己更改。
=END
往期回顾
REVIEW
【产品方案】基于CW32L010低成本电动工具方案
【产品应用】基于CW32的智能充电宝(方案开源)
【产品应用】CW-W88水泵通用控制板设计方案(已开源)
【产品应用】基于CW32的角磨机控制器产品方案
【产品方案】基于CW32F030C8的低压无刷风机无感控制器
【产品方案】基于CW32的无刷直流空心杯电机有感控制驱动方案
【产品方案】基于CW32的无刷直流空心杯电机无感方波控制驱动方案
【产品方案】基于CW32F003E4P7的数字电压电流表产品方案
【产品方案】CW32L010低成本工业仪表
189