一、前言
首先,简单的说明下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
|