打印
[单片机芯片]

沁恒CH579 USB蓝牙MCU的应用与代码示例

[复制链接]
63|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
周半梅|  楼主 | 2024-10-11 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

沁恒微电子(WCH)的CH579是一款集成了USB和蓝牙BLE功能的多功能MCU,适用于物联网、蓝牙音频传输以及USB设备的开发。CH579基于Cortex-M0内核,具有高效的能耗管理和丰富的外设接口,能够同时处理USB和蓝牙通信,给开发者提供了极大的灵活性和便利性。本文将以CH579为例,介绍如何利用其USB和蓝牙功能实现数据传输和控制应用。

CH579的应用场景在实际应用中,CH579可以用于智能设备的无线通信、USB设备与PC之间的数据交互,以及通过蓝牙实现远程控制。我们将演示如何通过蓝牙模块传输数据,并利用USB接口与PC通信。

硬件设计
  • MCU型号: 沁恒 CH579
  • 功能模块: USB接口与蓝牙BLE模块
  • 其他外设: 一个LED和按键,用于控制蓝牙数据传输状态
我们将通过按键触发蓝牙数据发送,并使用USB接口与PC通信以显示发送数据的结果。

代码实现在本示例中,CH579通过按键触发蓝牙数据的发送,并利用USB连接PC,将结果数据打印到串口监视器。
#include "CH579.h"

// 定义LED和按键引脚
#define LED_PIN  GPIO_Pin_1  // LED连接到GPIO引脚1
#define BUTTON_PIN GPIO_Pin_0  // 按键连接到GPIO引脚0

// 蓝牙数据包
uint8_t bleData[] = "Hello from CH579 BLE!";

// 函数声明
void System_Init(void);
void GPIO_Init(void);
void USB_Init(void);
void BLE_Init(void);
void SendDataOverBLE(uint8_t *data, uint16_t len);
void USB_Print(const char *str);

int main(void)
{
    // 系统初始化
    System_Init();
    // GPIO初始化
    GPIO_Init();
    // USB初始化
    USB_Init();
    // 蓝牙初始化
    BLE_Init();

    // 主循环
    while (1)
    {
        // 检测按键状态
        if (GPIO_ReadInputDataBit(GPIOA, BUTTON_PIN) == RESET) // 按键按下
        {
            // 点亮LED,表示正在发送数据
            GPIO_SetBits(GPIOA, LED_PIN);

            // 发送数据通过蓝牙
            SendDataOverBLE(bleData, sizeof(bleData));

            // 在USB串口打印信息
            USB_Print("BLE Data Sent: Hello from CH579 BLE!\r\n");

            // 延时避免按键抖动
            Delay_Ms(500);

            // 关闭LED
            GPIO_ResetBits(GPIOA, LED_PIN);
        }
    }
}

// 系统初始化
void System_Init(void)
{
    // 启动外设时钟
    SystemCoreClockUpdate();
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}

// GPIO初始化
void GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // LED引脚配置为输出模式
    GPIO_InitStructure.GPIO_Pin = LED_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 按键引脚配置为输入模式
    GPIO_InitStructure.GPIO_Pin = BUTTON_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

// USB初始化
void USB_Init(void)
{
    // USB外设初始化
    USB_DeviceInit();
    USB_Print("USB Initialized.\r\n");
}

// 蓝牙初始化
void BLE_Init(void)
{
    // 初始化蓝牙模块
    BLE_ModuleInit();
    USB_Print("BLE Initialized.\r\n");
}

// 通过蓝牙发送数据
void SendDataOverBLE(uint8_t *data, uint16_t len)
{
    BLE_SendData(data, len);
}

// 通过USB发送字符串
void USB_Print(const char *str)
{
    while (*str)
    {
        USB_SendData(*str++);
    }
}

// 简单延时函数
void Delay_Ms(uint32_t ms)
{
    for(uint32_t i = 0; i < ms * 8000; i++);
}

代码解析
  • 系统初始化:System_Init()函数中配置了系统时钟,并使能了GPIOA外设的时钟。该步骤是为后续的GPIO和外设初始化做准备。
  • GPIO初始化:GPIO_Init()函数将GPIOA的1号引脚配置为推挽输出,用于控制LED,同时将GPIOA的0号引脚配置为浮空输入,检测按键的状态。
  • USB初始化:USB_Init()函数用于初始化CH579的USB外设。通过USB与PC进行通信,所有信息都会通过USB串口打印出来。
  • 蓝牙初始化:BLE_Init()函数用于初始化蓝牙模块。CH579内置蓝牙BLE模块,初始化后,可以发送和接收BLE数据。
  • 蓝牙数据发送:SendDataOverBLE()函数用于通过蓝牙发送数据。在按键按下时,该函数会被调用,向蓝牙发送预设的数据。
  • USB串口打印:通过USB_Print()函数可以将字符串发送到PC端的串口工具,用于实时显示MCU的操作状态。
  • 按键检测:在主循环中,MCU持续监控按键状态,按下时,LED点亮并发送蓝牙数据,同时通过USB串口输出发送信息。


应用效果
  • 蓝牙数据传输:当按下按键时,CH579通过蓝牙发送预定义的字符串"Hello from CH579 BLE!",蓝牙客户端能够接收到这条信息。
  • USB通信:通过USB连接PC,MCU会在每次蓝牙数据发送后,将发送的信息通过串口打印到PC上,以确认数据的发送情况。
  • LED指示:LED用于指示当前蓝牙数据发送的状态,当LED点亮时表示数据正在发送,熄灭时表示数据发送结束。

扩展应用通过本文示例,可以轻松扩展CH579 MCU的应用:
  • 多数据通道:除了发送固定数据,可以扩展为通过USB接口接收数据并通过蓝牙转发,实现双向数据传输。
  • 低功耗应用:CH579支持低功耗模式,可以结合定时器和中断,实现节能设计。
  • 传感器采集:通过扩展ADC模块,可以采集传感器数据,并通过蓝牙传输至手机或其他蓝牙设备,适用于物联网传感器节点设计。

总结沁恒的CH579 MCU集成了USB和蓝牙BLE功能,在物联网和无线通信应用中具有广泛的应用前景。通过本文介绍的示例代码,开发者可以轻松实现USB和蓝牙的数据传输与控制应用,为更复杂的项目奠定基础。

使用特权

评论回复
沙发
公羊子丹| | 2024-10-11 09:33 | 只看该作者
沁恒这款MCU功能好全啊,USB和蓝牙都集成了,开发起来应该很方便。

使用特权

评论回复
板凳
帛灿灿| | 2024-10-11 09:34 | 只看该作者
代码很清晰,尤其是GPIO和蓝牙的部分,直接拿来用就行。

使用特权

评论回复
地板
童雨竹| | 2024-10-11 09:34 | 只看该作者
最近正好在研究蓝牙,这个CH579看起来挺适合做智能设备。

使用特权

评论回复
5
万图| | 2024-10-11 09:34 | 只看该作者
LED状态指示很直观,用来调试再合适不过了。

使用特权

评论回复
6
Wordsworth| | 2024-10-11 09:35 | 只看该作者
这个例子可以直接应用到物联网项目,采集传感器数据再传出去。

使用特权

评论回复
7
Pulitzer| | 2024-10-11 09:35 | 只看该作者
蓝牙通信模块的初始化感觉还可以再丰富点,加上接收功能应该更强大。

使用特权

评论回复
8
Bblythe| | 2024-10-11 09:35 | 只看该作者
用USB串口工具看调试信息很方便,不用再单独接调试口了。

使用特权

评论回复
9
Uriah| | 2024-10-11 09:35 | 只看该作者
按键触发蓝牙数据发送的设计挺好,我打算加上一个防抖处理。

使用特权

评论回复
10
Clyde011| | 2024-10-11 09:36 | 只看该作者
这个延时函数是为了按键防抖吗?还是简单的延时处理?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

3630

帖子

0

粉丝