【沁恒CH585开发板免费试用体验】+串行通讯与语音模块播放控制 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

[文章]

【沁恒CH585开发板免费试用体验】+串行通讯与语音模块播放控制

CH585配置有4组UART,它可以在没有显示器件的情况下通过串口来输出测试信息,也实现串口设备间的数据传递等。

实现串口1收发测试的主程序为:

#include "CH58x_common.h"

uint8_t TxBuff[] = "This is a tx exam\r\n";

uint8_t RxBuff[100];

uint8_t trigB;

int main()

{

    uint8_t len;

    HSECFG_Capacitance(HSECap_18p);

    SetSysClock(CLK_SOURCE_HSE_PCH585配置有4组UART,它可以在没有显示器件的情况下通过串口来输出测试信息,也实现串口设备间的数据传递等。

实现串口1收发测试的主程序为:LL_62_4MHz);

    /* 配置串口1:先配置IO口模式,再配置串口 */

    GPIOA_SetBits(GPIO_Pin_9);

    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);      // RXD-配置上拉输入

    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平

    UART1_DefInit();

#if 1 // 测试串口发送字符串

    UART1_SendString(TxBuff, sizeof(TxBuff));

#endif

 

#if 1 // 查询方式:接收数据后发送出去

    while(1)

    {

        len = UART1_RecvString(RxBuff);

        if(len)

        {

            UART1_SendString(RxBuff, len);

        }

    }

#endif

 

#if 0 // 中断方式:接收数据后发送出去

    UART1_ByteTrigCfg(UART_7BYTE_TRIG);

    trigB = 7;

    UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);

    PFIC_EnableIRQ(UART1_IRQn);

#endif

    while(1);

}

由程序可知,该程序的作用是使用串口1发送和接收信息,其中PA8是接收引脚,PA9是发送引脚。它是先发送信息,然后再以查询方式接收信息。

对于串口1来说,除配置了所用引脚外,并未定义其他的工作参数,而是通过 函数UART1_DefInit() 加以设置,其内容如下:

void UART1_DefInit(void)

{

    UART1_BaudRateCfg(115200);

    R8_UART1_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO打开,触发点4字节

    R8_UART1_LCR = RB_LCR_WORD_SZ;

    R8_UART1_IER = RB_IER_TXD_EN;

    R8_UART1_DIV = 1;

}

经程序的编译和下载,其测试结果如图1和图2所示。

image.png

图1 接收内容

image.png

图2 发送及回馈

在实际应用中,除了发送字符信息外更重要的是发送字节数据来控制串口设备。

以串口控制语音模块为例,它就是通过字节指令来控制语音模块的。

为便于生成相应的控制指令,是将指令的基本内容存放到数组中,其形式如下:

uint8_t cmd3[] = {0X7E, 0xFF, 0x06, 0X03, 00, 00, 01, 0xFE, 0xF7, 0XEF};

通过该指令数组,其生成播放指令的函数为:

void playn(uint16_t index) 

{

uint8_t i;

uint8_t checksum = 0;

cmd3[5] = (uint8_t)(index >> 8);

cmd3[6] = (uint8_t)(index);

for (i=2; i<8; i++)

{

checksum += cmd3[i];

}

cmd3[8] = (uint8_t)~checksum;

}

此外,为了适应语音播放模块的要求,需在主程序将串口的波特率改为9600bps。

经修改,实现语音模块控制的主程序为:

uint8_t cmd3[] = {0X7E, 0xFF, 0x06, 0X03, 00, 00, 01, 0xFE, 0xF7, 0XEF}; 

uint8_t RxBuff[100];

uint8_t trigB;

int main()

{

    uint8_t len,n;

    HSECFG_Capacitance(HSECap_18p);

    SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);

    /* 配置串口1:先配置IO口模式,再配置串口 */

    GPIOA_SetBits(GPIO_Pin_9);

    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);      // RXD

    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // TXD

UART1_DefInit();

n=3;

playn(n);

UART1_SendString(cmd3 10);

}

经测试,其输出内容如图3所示,说明程序设计符合要求。

image.png

图3 指令生成测试

在连接语音播放模块的情况下,其控制效果如图4所示,可听到指定语音段的播放内容,说明控制作用有效。

image.png

图4 控制效果

演示视频:

MP3

更多回帖

×
发帖