jinglixixi 发表于 2025-1-13 17:22

【MCXA156开发板测评】+串口通讯及其应用

本帖最后由 jinglixixi 于 2025-1-15 22:53 编辑

<p>MCXA156开发板提供了串口通讯功能,利用它可实现数据的收发及串口设备的控制。</p>

<p>进行数据发送的函数为:</p>

<pre>
<code class="language-cpp">status_t LPUART_WriteBlocking(LPUART_Type *base, const uint8_t *data, size_t length)
{
    assert(NULL != data);
    const uint8_t *dataAddress = data;
    size_t transferSize      = length;
#if UART_RETRY_TIMES
    uint32_t waitTimes;
#endif
    while (0U != transferSize)
    {
#if UART_RETRY_TIMES
      waitTimes = UART_RETRY_TIMES;
      while ((0U == (base-&gt;STAT &amp; LPUART_STAT_TDRE_MASK)) &amp;&amp; (0U != --waitTimes))
#else
      while (0U == (base-&gt;STAT &amp; LPUART_STAT_TDRE_MASK))
#endif
      {
      }
#if UART_RETRY_TIMES
      if (0U == waitTimes)
      {
            return kStatus_LPUART_Timeout;
      }
#endif
      base-&gt;DATA = *(dataAddress);
      dataAddress++;
      transferSize--;
    }
#if UART_RETRY_TIMES
    waitTimes = UART_RETRY_TIMES;
    while ((0U == (base-&gt;STAT &amp; LPUART_STAT_TC_MASK)) &amp;&amp; (0U != --waitTimes))
#else
    while (0U == (base-&gt;STAT &amp; LPUART_STAT_TC_MASK))
#endif
    {
    }
#if UART_RETRY_TIMES
    if (0U == waitTimes)
    {
      return kStatus_LPUART_Timeout;
    }
#endif
    return kStatus_Success;
}
</code></pre>

<p>实现串口0收发功能测试的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)
{
    uint8_t ch;
    lpuart_config_t config;
    BOARD_InitPins();
    BOARD_InitBootClocks();
    BOARD_InitDebugConsole();
    LPUART_GetDefaultConfig(&amp;config);
    config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
    config.enableTx   = true;
    config.enableRx   = true;
    LPUART_Init(DEMO_LPUART, &amp;config, DEMO_LPUART_CLK_FREQ);
    LPUART_WriteBlocking(DEMO_LPUART, txbuff, sizeof(txbuff) - 1);
    while (1)
    {
      LPUART_ReadBlocking(DEMO_LPUART, &amp;ch, 1);
      LPUART_WriteBlocking(DEMO_LPUART, &amp;ch, 1);
    }
}
</code></pre>

<p>该程序的功能为以115200的波特率进行收发测试,每接收一个字节的数据就原样进行回馈性发送。</p>

<p>在使用串口调试工具的情况下,其测试效果如图1所示,由此可见收发内容完全一致,可用来字节数据的传送。</p>

<p> &nbsp;</p>

<p>图1 收发测试</p>

<p>&nbsp;</p>

<p>将波特率设为9600bps的情况下,则可控制MP3语音模块的播放,其控制指令是存放在数组中,即:</p>

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

<p>在注销掉接收语句后,将发送语句改为:</p>

<p>LPUART_WriteBlocking(DEMO_LPUART, cmd3, 10);</p>

<p>这样,就可实现对MP3语音模块的播放控制。</p>

<p>修改后的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)
{
    uint8_t ch;
    uint8_t cmd3[] = {0X7E, 0xFF, 0x06, 0X03, 00, 00, 01, 0xFE, 0xF7, 0XEF};
    lpuart_config_t config;
    BOARD_InitPins();
    BOARD_InitBootClocks();
    BOARD_InitDebugConsole();
    LPUART_GetDefaultConfig(&amp;config);
    config.baudRate_Bps = 9600U;
    config.enableTx   = true;
    config.enableRx   = true;
    LPUART_Init(DEMO_LPUART, &amp;config, DEMO_LPUART_CLK_FREQ);
        LPUART_WriteBlocking(DEMO_LPUART, cmd3, 10);
        while (1);
}
</code></pre>

<p>经测试,其效果如图2所示。</p>

<p> &nbsp;</p>

<p>图2 控制测试</p>

<p>&nbsp;</p>

<p>此外,由于开发板具有PWM调节功能,本打算用来进行云台控制,可很难设置到双轴云台的工作频率。为此,改为用带串口控制功能的PWM模块来实现。</p>

<p>该模块是通过串口来接收控制指令,以控制2个通道的PWM输出。在连接舵机的情况下,可顺利地实现双轴云台的调节控制。</p>

<p>该模块工作的通讯波特率为9600bps,舵机工作的频率为 50Hz。</p>

<p>为便于调节控制,是将指令存放于指令数组中,其格式为:</p>

<p>uint8_t MLF={&#39;S&#39;,&#39;1&#39;,&#39;F&#39;,&#39;0&#39;,&#39;5&#39;,&#39;0&#39;,&#39;T&#39;};&nbsp;</p>

<p>uint8_t MLP={&#39;S&#39;,&#39;1&#39;,&#39;D&#39;,&#39;0&#39;,&#39;0&#39;,&#39;4&#39;,&#39;T&#39;};&nbsp;</p>

<p>&nbsp;</p>

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

<p>指令中S1用于指定通道1的参数,S21用于指定通道2的参数。</p>

<p>在特定的连接情况下,通道1是控制云台的上下俯仰角度,通道2是控制云台在水平上的旋转角度。</p>

<p>由于所用的串口0是供虚拟串口来使用的,要进行使用必须通过迷你型的调试口J24来引出。</p>

<p> &nbsp;</p>

<p>图3&nbsp; 所用接口</p>

<p>&nbsp;</p>

<p>在完成整体电路连接的情况下,其调节效果如图4和图5所示。</p>

<p> &nbsp;</p>

<p>图4 姿态1</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>图5 &nbsp;姿态2</p>

<p>&nbsp;</p>

<p>以触摸ISP按键调节舵机角度为例,设置工作频率的语句为:</p>

<p>LPUART_WriteBlocking(DEMO_LPUART, MLF, 7);</p>

<p>实现按键调节舵机角度的程序为:</p>

<p>i=3;</p>

<p>while(1)</p>

<p>{</p>

<p>&nbsp; &nbsp; &nbsp; if ((GPIO_PinRead(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN))==0)</p>

<p>&nbsp; &nbsp;&nbsp; &nbsp;{</p>

<p>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;MLP=i/10+&#39;0&#39;;</p>

<p>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;MLP=i%10+&#39;0&#39;;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LPUART_WriteBlocking(DEMO_LPUART, MLP, 7);</p>

<p>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;delay_2();</p>

<p>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;i=(i+1)%13;</p>

<p>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;if(i==0) i=3;</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (((GPIO_PinRead(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN))==0));</p>

<p>&nbsp; &nbsp;&nbsp; &nbsp;}</p>

<p>}</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>图6&nbsp; 串口引脚分配</p>

<p>&nbsp;</p>

Jacktang 发表于 2025-1-18 10:21

<p>用来进行云台控制,双轴云台的工作频率确实是不好设置,,,</p>

<p>还是串口控制功能的PWM模块来实现是简单操作</p>
页: [1]
查看完整版本: 【MCXA156开发板测评】+串口通讯及其应用