打印
[蓝牙芯片]

CH582F核心板入门:RGB灯点亮与蓝牙上报功能实战

[复制链接]
792|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-6-6 13:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、前言
首先,简单的说明下CH582F这款芯片。

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

这款芯片的特点包括:

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



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



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

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



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_44836335/article/details/136461607

使用特权

评论回复
沙发
weifeng90| | 2024-6-6 19:07 | 只看该作者
沁恒的接口芯片使用很方便

使用特权

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

本版积分规则

1498

主题

14377

帖子

8

粉丝