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

jinglixixi   2022-9-7 20:56 楼主

AT32WB415系列产品中,内置了3个通用同步/异步收发器(USART1,USART2,和USART3),

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

TX。

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

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

1. 串行通讯

对USART1配置的函数为:

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(&gpio_init_struct);
  gpio_init_struct.gpio_pins = GPIO_PINS_6;
  gpio_init(GPIOB, &gpio_init_struct);
  gpio_init_struct.gpio_pins = GPIO_PINS_7;
  gpio_init(GPIOB, &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);
}

以字节方式发送数据的程序为:

for(j=0;j<10;j++)
{
     usart_data_transmit(USART2, cmd3[j]);
     delay_ms(10);
}

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

image-20220907205006-1.png  图1 字节数据发送

2. MP3模块

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

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

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

image-20220907205006-2.png  图2  MP3播放模块

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

void playn(int index)
{
         int i;
         unsigned char checksum = 0;
         cmd3[5] = (unsigned char)(index >> 8);
         cmd3[6] = (unsigned char)(index);
         for (i=2; i<8; i++)
         {
                   checksum += cmd3[i];
         }
         cmd3[8] = (unsigned char)~checksum;
}

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

image-20220907205006-3.png  图3 按键电路

用户键的引脚配置函数为:

void KEY_init(void)
{
     gpio_init_type gpio_init_struct;
     crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
     gpio_default_para_init(&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, &gpio_init_struct);
}

读取按键状态的语句为:

gpio_input_data_bit_read(GPIOA, GPIO_PINS_0)

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

3. TFT屏菜单显示

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

BLK----PA5

SCL----PC0

SDA---PC1

DC-----PA1

RES---PB14

CS -----PA4

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

image-20220907205006-4.png  

图4 中文界面

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

int main(void)
{
   int i,j,h;
   system_clock_config();
   at32_board_init();
   usart_configuration();
   setVolume(18);
   for(j=0;j<10;j++)
   {
        usart_data_transmit(USART1, cmd6[j]);
        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<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<10;j++)
                {
                   usart_data_transmit(USART1, cmd3[j]);
                   delay_ms(10);
                }
                at32_led_toggle(LED3);
                delay_ms(500);
        }
   }
}

image-20220907205006-5.png  图5 整体构成

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复