0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CW32生态社区 来源:CW32生态社区 2026-04-01 16:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、蓝牙模块介绍

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

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

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

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

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

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

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

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

模块图片:

wKgZPGnM3WmAfqEiAADRW_hcNWA947.jpg

二、连接原理图

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

wKgZPGnM3WqANmiHAAAl6QauZyk589.jpg

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

三、驱动编写

由以上原理图可知,蓝牙模块的通讯协议为串口,接到主控板CW32上的PA2和PA3接口,再查询手册可知PA2,PA3复用功能为UART3,如下图

wKgZO2nM3W-AB_uHAAAwbQc3k_s045.jpg

那么驱动就比较容易了,只需要将之前固件库中串口通信部分复制,然后将里面的串口配置引脚修改为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)
        {
        }
}

四、工作现象

当烧写代码之后,手机打开任意一个蓝牙调试助手,发送如下数据

wKgZPGnM3YuAPAqiAAFiYgVZtnU769.jpg

便可以看到OLED屏幕上第一行第一列显示字符串HELLO,第二行在蓝牙未接收到数据时显示00,接收到之后显示接收到的数据,本实验发送02,则显示02,可以自己更改。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5209

    文章

    20625

    浏览量

    336759
  • 智能小车
    +关注

    关注

    87

    文章

    565

    浏览量

    83516
  • 蓝牙模块
    +关注

    关注

    30

    文章

    670

    浏览量

    57993
  • CW32
    +关注

    关注

    1

    文章

    323

    浏览量

    1953
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32L012/F030X1智能小车——板载WS2812驱动示例

    WS2812是一种广泛使用的地址可控制的RGB LED模块,其内置驱动电路和控制芯片,允许用户通过单线信号控制多个LED的颜色和亮度。
    的头像 发表于 01-05 16:35 3303次阅读
    <b class='flag-5'>CW32L012</b>/<b class='flag-5'>F030</b><b class='flag-5'>灵</b><b class='flag-5'>眸</b><b class='flag-5'>X1</b><b class='flag-5'>智能</b><b class='flag-5'>小车</b>——板载WS2812驱动示例

    CW32L012/F030X1智能小车——超声波模块配置

    SR04超声波模块是一款广泛应用的测距传感器,主要用于使用超声波测量物体与传感器之间的距离。它是一个成本低廉、精度较高且易于使用的传感器,常用于机器人、智能家居、无人机、汽车防撞系统等项目。
    的头像 发表于 01-05 16:54 3058次阅读
    <b class='flag-5'>CW32L012</b>/<b class='flag-5'>F030</b><b class='flag-5'>灵</b><b class='flag-5'>眸</b><b class='flag-5'>X1</b><b class='flag-5'>智能</b><b class='flag-5'>小车</b>——超声波<b class='flag-5'>模块</b>配置

    CW32L012/F030X1智能小车——使用NRF24L01通信

    NRF24L01所使用的通讯协议为SPI,SPI又可分为软件SPI和硬件SPI。
    的头像 发表于 04-01 16:49 2526次阅读
    <b class='flag-5'>CW32L012</b>/<b class='flag-5'>F030</b><b class='flag-5'>灵</b><b class='flag-5'>眸</b><b class='flag-5'>X1</b><b class='flag-5'>智能</b><b class='flag-5'>小车</b>——使用NRF24<b class='flag-5'>L</b>01通信

    【项目展示】基于CW32的遥控循迹小车

    CW32循迹小车.zip_免费高速下载|百度网盘-分享无限制  一、概述 CW32循迹、遥控小车具有循迹和遥控两种功能,小车的硬件
    的头像 发表于 05-31 17:33 2638次阅读
    【项目展示】基于<b class='flag-5'>CW</b>32的遥控循迹<b class='flag-5'>小车</b>

    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频CW32L012新品发布!

    基于CW32L01x系列低功耗微控制器家族的全新成员:CW32L012系列产品。 CW32L012基于ARM® Cortex-M0+内核,主频高达96MHz,同时集成了CORDIC硬件单元、扩展算术运算单元
    发表于 07-16 16:32

    白嫖的CW32小车蓝牙模式使用教程

    00,速度也是同样如此,我们把这个指令编辑到这个蓝牙编辑界面中,像这样: 每个按键都编辑好对应的指令,这样蓝牙上位机的配置也配置好了,按照这样的步骤,我很流畅的通过蓝牙遥控上了这款CW32L
    发表于 11-21 15:38

    **CW32L012****开发评估板的第一个程序**

    CW32L012****开发评估板的第一个程序 最近以15.99在CW32生态社区入手了这块CW32L012开发评估板,我迫不及待的烧录进电灯程序,看看这块板子是否是正常的,能否满足我后面的学习
    发表于 11-22 00:09

    CW32L012小型机器人控制评估板活动 四足机器人+智能小车 开箱评测

    CW32L012活动相关资料链接:https://dwi41yhz703.feishu.cn/wiki/B1Ihw31ebiX0vkkhQr2cINnkn1g 小型机器人+智能小车
    发表于 11-24 23:44

    基于STM32的蓝牙遥控小车设计

    简单的蓝牙小车,目前就只是手机控制小车前进转弯后退刹车这种功能,自己还在扩展···1:材料车体、4个轮子、4个减速马达这一套,淘宝搜智能
    发表于 03-01 06:17

    武汉芯源CW32F030评估板介绍

    CW32F030CxTxStartKit评估板为用户提供一种经济且灵活的方式使用CW32F030CxTx芯片构建系统原型,可进行性能、功耗、功能等各方面快速验证
    的头像 发表于 10-20 11:18 2186次阅读
    武汉芯源<b class='flag-5'>CW32F030</b>评估板介绍

    使用芯源CW32的CW32L012开发评估板做了spi屏幕驱动

    CW32生态社区以极高的性价比入手了这块CW32L012开发评估板,开发板以底板、核心板、1.77寸TFT显示屏构成,所有的IO口都引出了排针,这点好评,使用杜邦线可以非常方便的连接其他模块。引脚
    的头像 发表于 11-21 11:34 781次阅读
    使用芯源<b class='flag-5'>CW</b>32的<b class='flag-5'>CW32L012</b>开发评估板做了spi屏幕驱动

    CW32L012与STM32F103的三角运算性能对比

    没有硬件浮点运算单元。 但在运算三角函数时,CW32L012支持CORDIC算法。 二、 三角运算性能具体分析 1:标准库浮点运算(如 math.h 的 sinf, cosf) 这是最常用但也是最慢的方式。 STM32F103C
    的头像 发表于 12-29 15:32 2484次阅读
    <b class='flag-5'>CW32L012</b>与STM32<b class='flag-5'>F</b>103的三角运算性能对比

    CW32L012与STM32G431的CORDIC三角函数运算性能对比

    CORDIC协处理器的三角运算性能对比。对比结果出乎意料。 一、硬件架构 二、运算100W次SIN30度与COS30度的代码实现 1.CW32L012 CW32L012的CORDIC提供某些数学函数
    的头像 发表于 12-29 15:55 2744次阅读
    <b class='flag-5'>CW32L012</b>与STM32G431的CORDIC三角函数运算性能对比

    CW32L012/F030X1智能小车--电机正反转控制

    RZ7899是一种高性能电机驱动芯片,广泛应用于各种电机控制场合,特别是在步进电机和直流电机的驱动中。
    的头像 发表于 04-02 16:48 1096次阅读
    <b class='flag-5'>CW32L012</b>/<b class='flag-5'>F030</b><b class='flag-5'>灵</b><b class='flag-5'>眸</b><b class='flag-5'>X1</b><b class='flag-5'>智能</b><b class='flag-5'>小车</b>--电机正反转控制

    CW32L012/F030X1智能小车--电机调速控制

    PWM(Pulse Width Modulation脉宽调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号任然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有,要么完全无。比如我们的电压输出是5v的,那么经过改变PWM的占空比,可以达到在一定时间内输出3.3V或者1.3V的效果
    的头像 发表于 04-02 16:49 1187次阅读
    <b class='flag-5'>CW32L012</b>/<b class='flag-5'>F030</b><b class='flag-5'>灵</b><b class='flag-5'>眸</b><b class='flag-5'>X1</b><b class='flag-5'>智能</b><b class='flag-5'>小车</b>--电机调速控制