【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(&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);
}</code></pre>
<p >以字节方式发送数据的程序为:</p>
<pre>
<code class="language-cpp">for(j=0;j<10;j++)
{
usart_data_transmit(USART2, cmd3);
delay_ms(10);
}</code></pre>
<p >其测试效果如图1所示,说明功能正常。</p>
<p > 图1 字节数据发送</p>
<p >2. MP3模块</p>
<p>MP3播放模块是一款可以串口通信进行控制的器件,其引脚分布如图2所示。</p>
<p>在使用时,除电源引脚外只需占用一个串口输出引脚PB6。</p>
<p>此外,由于该模块的通讯波特率为9600bps,故需在该波特率下工作。</p>
<p> 图2 MP3播放模块</p>
<p >由于播放指令是有一定格式要求的,故以相应的函数来实现,其内容如下:</p>
<pre>
<code class="language-cpp">void playn(int index)
{
int i;
unsigned char checksum = 0;
cmd3 = (unsigned char)(index >> 8);
cmd3 = (unsigned char)(index);
for (i=2; i<8; i++)
{
checksum += cmd3;
}
cmd3 = (unsigned char)~checksum;
}</code></pre>
<p >在播放过程中,是通过指定乐曲的序号。为此,需要用板载的用户键来选取播放的内容。板载的用户键电路见图3所示,由于只有这一个键可用,故采用轮回计数的方式来进行选择。</p>
<p > 图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(&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);
}</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 > </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<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<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);
delay_ms(10);
}
at32_led_toggle(LED3);
delay_ms(500);
}
}
}</code></pre>
<p > 图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]