扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

CW32L012/F030灵眸X1智能小车——使用蓝牙模块通讯

3小时前
189
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、蓝牙模块介绍

主控板配套的是一款低功耗蓝牙模块,适用于短距离无线通信。该模块通常被用于各种嵌入式项目,如物联网(IoT)设备、手机配件、智能家居设备、医疗设备等。

以下是蓝牙模块的一些主要特点和功能:

低功耗: 本模块设计为低能耗,适合电池供电的应用。

蓝牙版本: 支持蓝牙4.0或更高版本,能够与大多数蓝牙设备兼容。

操作范围: 通常具有较好的无线传输距离,适合各种室内外应用。

小尺寸: 模块结构紧凑,便于嵌入到各种设备中。

简单接口: 提供UARTSPI等常用接口,便于与微控制器或其他设备进行连接和通信。

易于配对: 具备快速配对功能,简化了与其他蓝牙设备的连接过程。

模块图片:

二、连接原理图

蓝牙接口在开发板原理图如下:

RJ5、RJ6跳线电阻用于切换不同模块的供电电源

三、驱动编写

由以上原理图可知,蓝牙模块的通讯协议为串口,接到主控板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

【产品应用】CW32电动工具产品开源

【产品方案】基于CW32L010低成本电动工具方案

【产品应用】基于CW32的智能充电宝(方案开源)

【产品应用】CW-W88水泵通用控制板设计方案(已开源)

【产品应用】基于CW32的角磨机控制器产品方案

【产品方案】基于CW32F030C8的低压无刷风机无感控制器

【产品方案】基于CW32的无刷直流空心杯电机有感控制驱动方案

【产品方案】基于CW32的无刷直流空心杯电机无感方波控制驱动方案

【产品方案】基于CW32F003E4P7的数字电压电流表产品方案

【产品方案】CW32L010低成本工业仪表

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

以开放、共享、互助为理念,致力于构建武汉芯源半导体CW32系列MCU生态社区。无论是嵌入式MCU小自还是想要攻破技术难题的工程师,亦或是需求解决方案的产品经理都可在CW32生态社区汲取营养、共同成长。