一、前言

首先,简单的说明下CH582F这款芯片。

沁恒的蓝牙芯片CH582F是一款集成了BLE(Bluetooth Low Energy,低功耗蓝牙)无线通讯功能的32位RISC微控制器。

这款芯片的特点包括:

  1. RISC-V内核:CH582F采用了RISC-V架构的内核,这是一种开源的指令集架构,提供了高性能和低功耗的特点。
  2. 低功耗蓝牙BLE:支持2Mbps的低功耗蓝牙通讯,符合BLE 5.3标准,适合需要低功耗无线连接的应用场景。
  3. 丰富的外设资源:芯片集成了2个全速USB主机和设备控制器及收发器、2个SPI、4个串口、ADC(模数转换器)、触摸按键检测模块、RTC(实时时钟)等,为各种应用提供了灵活的接口选项。

在这里插入图片描述

  1. 内存配置:具备448KB的Flash存储空间和32KB的SRAM,以及DataFlash,为应用程序提供了足够的存储能力。
  2. 电源管理:支持2.3V的电源电压,有助于进一步降低功耗。
  3. 封装形式:采用QFN28封装,这种封装形式紧凑,适合空间有限的设备。
  4. 应用场景:CH582F适用于需要蓝牙连接的各类产品,如智能家居设备、可穿戴设备、工业传感器、医疗设备等。

二、硬件

1.原理图

在这里插入图片描述

接下来,简单说明下原理图。

  1. 首先Type-C接口进来5V,利用二极管的单向导通性起到防反接的作用。
  2. 接口的C1和C2引脚需要焊接两个5.1k的下拉电阻是为了实现接口的检测和识别功能。
  3. 5V经过LDO降压为3.3V给MCU供电,CH582F芯片的外围电路设计通常包括多个元件,其中包括32.768kHz晶振、32MHz晶振和22uH电感。它们各自的作用为32.768kHz晶振用于提供实时时钟功能,32MHz晶振用于提供高频时钟信号以支持高速运算,而22uH电感则用于电源管理电路中的滤波和稳压作用,确保芯片工作的稳定性和性能表现。
  4. 这里两个按键一个是RST复位按键,一个是BOOT烧录按键,以及一个测试的LED。

2.实物图

在这里插入图片描述
实物还是蛮精美的。

3.实物连接图

在这里插入图片描述

三、软件

这里使用的是MounRiver Studio集成开发环境。

1.初始化

代码如下(示例):

/*******************************************************************************
 * 函数名:app_led_init
 * 描述  :引脚初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
void app_led_init(void)
{
      IO_LED.init(GPIO_ModeOut_PP_5mA);
      IO_LED.set();
      IO_LED_R.init(GPIO_ModeOut_PP_20mA);
      IO_LED_R.set();
      IO_LED_G.init(GPIO_ModeOut_PP_20mA);
      IO_LED_G.set();
      IO_LED_B.init(GPIO_ModeOut_PP_20mA);
      IO_LED_B.set();
}

/*******************************************************************************
 * 函数名:rope_init
 * 描述  :用户定义初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
void rope_init(void)
{
    app_led_init();

    GPIOB_SetBits(bTXD1);
    GPIOB_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);
    GPIOB_ModeCfg(bRXD1, GPIO_ModeIN_PU);
    UART1_DefInit();//串口波特率115200
    UART1_ByteTrigCfg(UART_7BYTE_TRIG);
    UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
    PFIC_EnableIRQ(UART1_IRQn);

    ROPE_TaskID = TMOS_ProcessEventRegister(ROPE_ProcessEvent); // 向系统注册了一个任务

    tmos_set_event(ROPE_TaskID, READ_UART_EVENT);
    tmos_set_event(ROPE_TaskID, E1000MS_EVENT);
    tmos_set_event(ROPE_TaskID, E10MS_EVENT);

    tmos_start_task(ROPE_TaskID, E100MS_EVENT, 160); // 160 * 0.625ms执行一次  100ms
}

2.显示部分

核心板上的测试灯进行1s闪烁一次的动作,RGB进行1s的红->蓝->绿的切换动作。

代码如下(示例):

/*******************************************************************************
 * 函数名:app_led_display
 * 描述  :根据情况显示
 * 输入  :void
 * 输出  :void
 * 调用  :100ms调用
 * 备注  :
 *******************************************************************************/
void app_led_display(void)
{
    static uint8_t led_flash_status = 0;
    static uint8_t led_flash_count = 0;

    if(led_flash_status)
    {
        IO_LED.set();
        if(++led_flash_count >= 10)//1s
        {
            led_flash_status = 0;
            led_flash_count = 0;
        }
    }
    else
    {
        IO_LED.reset();
        if(++led_flash_count >= 10)//1s
        {
            led_flash_status = 1;
            led_flash_count = 0;
        }
    }
}

/*******************************************************************************
 * 函数名:RGB_led_display
 * 描述  :根据情况显示
 * 输入  :void
 * 输出  :void
 * 调用  :1s调用
 * 备注  :
 *******************************************************************************/
void RGB_led_display(void)
{
    if(Alternate_flag == 0)
    {
        IO_LED_R.set();
        IO_LED_G.reset();
        IO_LED_B.reset();
        Alternate_flag = 1;
    }
    else if(Alternate_flag == 1)
    {
        IO_LED_R.reset();
        IO_LED_G.set();
        IO_LED_B.reset();
        Alternate_flag = 2;
    }
    else if(Alternate_flag == 2)
    {
        IO_LED_R.reset();
        IO_LED_G.reset();
        IO_LED_B.set();
        Alternate_flag = 0;
    }
    else
    {
        IO_LED_R.reset();
        IO_LED_G.reset();
        IO_LED_B.reset();
        Alternate_flag = 0;
    }
}

3.输出部分(打印和蓝牙上报)

/****************************************************************************************/
// 函  数:void analy_recv(uint8_t *buf,uint8_t len)
// 功  能:解析数据
// 输  入:buf数据地址
// 输  出:无
/****************************************************************************************/
void analy_recv(uint8_t *buf, uint8_t len)
{
    uint8_t i = 0;
    for (i = 0; i < len; i++)
    {
        if ((buf[i] = 0x55) && (buf[i + 1] = 0xAA))//找到数据帧
        {
            receive_order();//回复
            PRINT("Alternate_flag = %d\r\n", Alternate_flag);
        }
    }
}

/****************************************************************************************/
// 函  数:void receive_order(uint8_t *buf,uint8_t len)
// 功  能:回复
// 输  入:无
// 输  出:无
/****************************************************************************************/
void receive_order(void)
{
    ble_heartbeat.msg.u8Head1  = 0x55;
    ble_heartbeat.msg.u8Head2  = 0xAA;
    ble_heartbeat.msg.u8KeyId  = Alternate_flag;
    tmos_start_task(Peripheral_TaskID,HEARTBEAT_EVT,2);//2 * 0.625ms执行一次  1.25ms
    //蓝牙发送数据
}

//=================================蓝牙发送函数(上报)=================================//
static void heartbeatTask(void)
{
    peripheralChar4Notify(ble_heartbeat.Connect, 3);
}

4.结果

4.1 打印结果

在这里插入图片描述

4.2 蓝牙上报

4.2.1 打开手机蓝牙调试助手,找到ble_test_XXXX

在这里插入图片描述

4.2.2 点击CONNECT

在这里插入图片描述

4.2.3 找到Unknown Service服务,然后有个NOTIFY上报

在这里插入图片描述

4.2.4 点进去,接收通知数据,就可以看到数据了

在这里插入图片描述


四、 总结

以上就是今天的内容。

感谢你的观看,谢谢!
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐