打印
[方案相关]

【HC32L196PCTA测评】+串口应用篇

[复制链接]
1481|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2023-8-12 11:29 编辑

#申请原创#  @21小跑堂
HC32L196配有串口通信功能,并可对相应的串口设备加以控制,如控制MP3播放模块及舵机等。

1. 控制MP3播放模块
这里所选用的MP3模块具有串口控制功能,其引脚分布如图1所示。
1 引脚分布


其中: RX连接PA09TX连接PA10

多串口引脚配置的函数为:
void App_PortInit(void)
{
    stc_gpio_cfg_t stcGpioCfg;
    DDL_ZERO_STRUCT(stcGpioCfg);
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);  //GPIO外设模块时钟使能
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortA,GpioPin9,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortA,GpioPin9,GpioAf1);       //配置PA09 为UART0 TX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortA,GpioPin10,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortA,GpioPin10,GpioAf1);      //配置PA10 为UART0 RX
}

对串口的初始化函数为:
void App_UartCfg(void)
{
    stc_uart_cfg_t  stcCfg;
    stc_uart_multimode_t stcMulti;
    stc_uart_baud_t stcBaud;
    DDL_ZERO_STRUCT(stcCfg);
    DDL_ZERO_STRUCT(stcMulti);
    DDL_ZERO_STRUCT(stcBaud);
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE); //UART0外设模块时钟使能
    stcCfg.enRunMode = UartMskMode3;     //模式3
    stcCfg.enStopBit = UartMsk1bit;          //1位停止位
    stcCfg.enMmdorCk = UartMskEven;       //偶校验
    stcCfg.stcBaud.u32Baud = 9600;         //波特率9600
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;         //通道采样分频配置
    stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq();       //获得外设时钟(PCLK)频率值
    Uart_Init(M0P_UART0, &stcCfg);        //串口初始化
    Uart_ClrStatus(M0P_UART0,UartRC);     //清接收请求
    Uart_ClrStatus(M0P_UART0,UartTC);     //清发送请求
    Uart_EnableIrq(M0P_UART0,UartRxIrq);   //使能串口接收中断
    Uart_EnableIrq(M0P_UART0,UartTxIrq);   //使能串口发送中断
}

在使用以下程序的情况下,可得到图2所示的音量与乐曲的播放指令输出。

设置音量程序:
setVolume(15);
for(j=0;j<10;j++)
{
     Uart_SendDataPoll(M0P_UART0,cmd6[j]);
     delay_1us(5);
}
指定乐曲播放程序:
playn(i);
for(j=0;j<10;j++)
{
      Uart_SendDataPoll(M0P_UART0,cmd3[j]);
      delay_1us(5);
}

2 串口测试

MP3播放控制的整体电路如图3所示,稍感不足的是HC32L196是面向低功耗和低电压的,尽管它可以控制USBTTL功能模块,但它却无法直接带动MP3播放模块,需加一级驱动才能工作。

好在MP3播放模块除了可以用串口来控制外,还可以通过GPIO口来控制。
3 播放电路


在配合歌单的情况下,具有串口与GPIO口控制功能的MP3播放程序为:
Gpio_SetIO(STK_LED_PORT, STK_LED_PIN);
while(1)
{
     if(Gpio_GetInputIO(GpioPortA, GpioPin7)==0)
     {
          POINT_COLOR=RED ;
          showhanzi16(18,71+i*20,28);
          i=(i+1)%9;
          POINT_COLOR=WHITE;
          showhanzi16(18,71+i*20,28);        
          playn(i);
          Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN);
          for(j=0;j<10;j++)
          {
                Uart_SendDataPoll(M0P_UART0,cmd3[j]); //查询方式发送数据
                delay_1us(5);
          }
          delay1ms(200);
          Gpio_SetIO(STK_LED_PORT, STK_LED_PIN);
          delay1ms(300);
         }
         delay1ms(500);
}

2. 控制舵机
这里所用的舵机是用来控制一个可进行双维调节的云台,共有2个舵机。
为了化简控制的难度,这里有配备了一个支持串口控制的双通道PWM调节模块,为此对电机的调节控制就转化成了串口通讯的问题。
所用的PWM调节模块,要求采用9600bps的波特率通讯,PWM的工作频率为 50Hz
为便于调节控制,是将指令存放于指令数组中,其格式为:
uint8_t MLF[7]={'S','1','F','0','5','0','T'};
uint8_t MLP[7]={'S','1','D','0','0','4','T'};

其中,数组MLF[]用于存放工作频率的设置指令,而数组MLP[]则用于存放转动角度的设置指令。

用于设置工作频率的程序为:
for(j=0;j<7;j++)
{
       Uart_SendDataPoll(M0P_UART0,MLF[j]);
       delay_1us(5);
}
在连接串口的情况下,其测试效果如图4所示。
4 设置工作频率


用于角度调节的程序为:
i=3;
while(1)
{
      if(Gpio_GetInputIO(GpioPortA, GpioPin7)==0)
      {
            MLP[4]=i/10+'0';
            MLP[5]=i%10+'0';                                          
            for(j=0;j<7;j++)
            {
                  Uart_SendDataPoll(M0P_UART0,MLP[j]); //查询方式发送数据
                  delay_1us(5);
            }
            delay1ms(500);
            i=(i+1)%13;
            if(i==0) i=3;
      }
      delay1ms(500);
}

通过串口助手软件,其测试效果如图5所示。
图5 测试角度调节

在完成整体电路连接的情况下,其调节效果如图6至图8所示,即每按下一次用户键,则舵机就转动一个调节角度。
图6 角度调节1

图7 角度调节2

图 8角度调节3



使用特权

评论回复
沙发
chenqianqian| | 2023-8-12 12:42 | 只看该作者
现在的芯片集成度太高了。

使用特权

评论回复
板凳
xxrs| | 2023-8-13 19:44 | 只看该作者
chenqianqian 发表于 2023-8-12 12:42
现在的芯片集成度太高了。

摩尔定律

使用特权

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

本版积分规则

464

主题

2780

帖子

38

粉丝