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所示,说明功能正常。
2. MP3模块
MP3播放模块是一款可以串口通信进行控制的器件,其引脚分布如图2所示。
在使用时,除电源引脚外只需占用一个串口输出引脚PB6。
此外,由于该模块的通讯波特率为9600bps,故需在该波特率下工作。
由于播放指令是有一定格式要求的,故以相应的函数来实现,其内容如下:
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所示,由于只有这一个键可用,故采用轮回计数的方式来进行选择。
用户键的引脚配置函数为:
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
注:之所以这样分配引脚,是由于要规避相应功能引脚的占用。
图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);
}
}
}