jinglixixi 发表于 2022-9-7 20:56

【AT32WB415测评】串行通讯及MP3模块播放控制

<div class='showpostmsg'><p>AT32WB415系列产品中,内置了3个通用同步/异步收发器(USART1,USART2,和USART3),</p>

<p >和1个通用异步收发器(UART5)。其中USART3用于芯片内部与无线蓝牙模块连接,而UART5则仅支持</p>

<p >TX。</p>

<p >出于节省引脚资源的角度出发,本打算使用那个UART5的TX引脚来发送数据,可经过测试却没能实现其发送功能。此外,TX5所使用的PC12 还与TX1的PB6是共用同一引脚,在纠结于此其意义也就不大了。</p>

<p >为此,就直接使用USART1来进行串行通讯,其中TX1使用PB6,RX1使用PB7。</p>

<p >1. 串行通讯</p>

<p >对USART1配置的函数为:</p>

<pre>
<code class="language-cpp">void usart_configuration(void)
{
  gpio_init_type gpio_init_struct;
  crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
  gpio_default_para_init(&amp;gpio_init_struct);
  gpio_init_struct.gpio_pins = GPIO_PINS_6;
  gpio_init(GPIOB, &amp;gpio_init_struct);
  gpio_init_struct.gpio_pins = GPIO_PINS_7;
  gpio_init(GPIOB, &amp;gpio_init_struct);
  gpio_pin_remap_config(USART1_GMUX_0001, TRUE);
  usart_init(USART1, 9600, USART_DATA_8BITS, USART_STOP_1_BIT);
  usart_parity_selection_config(USART1, USART_PARITY_NONE);
  usart_transmitter_enable(USART1, TRUE);
  usart_receiver_enable(USART1, TRUE);
  usart_enable(USART1, TRUE);
}</code></pre>

<p >以字节方式发送数据的程序为:</p>

<pre>
<code class="language-cpp">for(j=0;j&lt;10;j++)
{
     usart_data_transmit(USART2, cmd3);
     delay_ms(10);
}</code></pre>

<p >其测试效果如图1所示,说明功能正常。</p>

<p > &nbsp;图1 字节数据发送</p>

<p >2. MP3模块</p>

<p>MP3播放模块是一款可以串口通信进行控制的器件,其引脚分布如图2所示。</p>

<p>在使用时,除电源引脚外只需占用一个串口输出引脚PB6。</p>

<p>此外,由于该模块的通讯波特率为9600bps,故需在该波特率下工作。</p>

<p> &nbsp;图2&nbsp; MP3播放模块</p>

<p >由于播放指令是有一定格式要求的,故以相应的函数来实现,其内容如下:</p>

<pre>
<code class="language-cpp">void playn(int index)
{
         int i;
         unsigned char checksum = 0;
         cmd3 = (unsigned char)(index &gt;&gt; 8);
         cmd3 = (unsigned char)(index);
         for (i=2; i&lt;8; i++)
         {
                   checksum += cmd3;
         }
         cmd3 = (unsigned char)~checksum;
}</code></pre>

<p >在播放过程中,是通过指定乐曲的序号。为此,需要用板载的用户键来选取播放的内容。板载的用户键电路见图3所示,由于只有这一个键可用,故采用轮回计数的方式来进行选择。</p>

<p > &nbsp;图3 按键电路</p>

<p >用户键的引脚配置函数为:</p>

<pre>
<code class="language-cpp">void KEY_init(void)
{
     gpio_init_type gpio_init_struct;
     crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
     gpio_default_para_init(&amp;gpio_init_struct);
     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
     gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
     gpio_init_struct.gpio_pins = GPIO_PINS_0;
     gpio_init_struct.gpio_pull = GPIO_PULL_UP;
     gpio_init(GPIOA, &amp;gpio_init_struct);
}</code></pre>

<p >读取按键状态的语句为:</p>

<p >gpio_input_data_bit_read(GPIOA, GPIO_PINS_0)</p>

<p >当按键按下时,其检测值为1;否则,其检测值为0。</p>

<p >3. TFT屏菜单显示</p>

<p >为了便于乐曲的选择,是使用TFT屏来显示中文菜单,该显示屏与开发板的连接关系如下:</p>

<p >BLK----PA5</p>

<p >SCL----PC0</p>

<p >SDA---PC1</p>

<p >DC-----PA1</p>

<p >RES---PB14</p>

<p >CS -----PA4</p>

<p >注:之所以这样分配引脚,是由于要规避相应功能引脚的占用。</p>

<p > &nbsp;</p>

<p >图4 中文界面</p>

<p >实现菜单进行播放控制的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)
{
   int i,j,h;
   system_clock_config();
   at32_board_init();
   usart_configuration();
   setVolume(18);
   for(j=0;j&lt;10;j++)
   {
        usart_data_transmit(USART1, cmd6);
        delay_ms(10);
   }
   KEY_init();
   app_tft_init();
   tft_Init();
   LCD_Clear(RED);
   LCD_Fill(0,0,239,50,WHITE);
   show_tb(60,0,0);
   delay_ms(1000);
   BACK_COLOR=WHITE;
   POINT_COLOR=RED;
   LCD_ShowChar(80,16,'M',1);
   LCD_ShowChar(90,16,'P',1);
   LCD_ShowChar(100,16,'3',1);
   MENU();
   LCD_Fill(0,287,239,319,WHITE);
   BACK_COLOR=WHITE;
   POINT_COLOR=RED;
   LCD_ShowString(60,294,"BY: jinglixixi");
   h=75;
   BACK_COLOR=RED;
   POINT_COLOR=YELLOW;
   while(1)
   {
        if(gpio_input_data_bit_read(GPIOA, GPIO_PINS_0)==1)
        {
                if(i&lt;6)
                {
                     i++;
                     LCD_Fill(30,h,50,h+20,RED);
                     h=h+30;
                     showhanzi16(30,h,37);
                }
                else
                {

                     i=0;
                     h=75;

                }
                playn(i);
                for(j=0;j&lt;10;j++)
                {
                   usart_data_transmit(USART1, cmd3);
                   delay_ms(10);
                }
                at32_led_toggle(LED3);
                delay_ms(500);
        }
   }
}</code></pre>

<p > &nbsp;图5 整体构成</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页: [1]
查看完整版本: 【AT32WB415测评】串行通讯及MP3模块播放控制