前言
先说一下申请开发板的初衷,因为自己很久之前使用过ST的产品(STM32系列),当时国产的32位微控制器还不是很给力,这方面几乎是被国外的公司垄断,没得选没有办法。近几年都说国产崛起了,想了解下国产到底崛起到什么程度,刚好看到极术社区的活动,于是就抱着试一试的心态申请了开发板,没想到居然通过了,当时看到通过的邮件的时候还是小激动了一把,在这里感谢下极术社区(给力)。
开发板
这里还是要贴一张开发板的图,开发板还是很漂亮的,大家可以欣赏下:
Air780E展示
合宙最近新出的cat1通讯模块
项目说明
本测试项目主要使用到GD32F427的UART串口通讯功能,使用串口发送AT指令,驱动Air780E实现相应的功能。由于开发板某些串口被占用,本次使用串口1发送AT指令,使用串口2作为调试信息输出(将串口1和模块之间的通讯信息,通过串口2回显到PC端,方便调试)。下面是部分代码:
串口的定义及初始化
#define UART1_Clock RCU_USART1
#define UART1_IO_Clock RCU_GPIOD
#define UART1_IO_Port GPIOD
#define UART1_TXD_Pin GPIO_PIN_5
#define UART1_RXD_Pin GPIO_PIN_6
#define UART2_Clock RCU_USART2
#define UART2_IO_Clock RCU_GPIOC
#define UART2_IO_Port GPIOC
#define UART2_TXD_Pin GPIO_PIN_10
#define UART2_RXD_Pin GPIO_PIN_11
void UART1_Init(void)
{
rcu_periph_clock_enable( UART1_Clock); //
rcu_periph_clock_enable(UART1_IO_Clock); //
/* connect port to USARTx_Tx */
gpio_af_set(UART1_IO_Port, GPIO_AF_7, UART1_TXD_Pin);//
/* connect port to USARTx_Rx */
gpio_af_set(UART1_IO_Port, GPIO_AF_7, UART1_RXD_Pin);//
/* configure USART Tx as alternate function push-pull */
gpio_mode_set(UART1_IO_Port, GPIO_MODE_AF, GPIO_PUPD_PULLUP,UART1_TXD_Pin); //
gpio_output_options_set(UART1_IO_Port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,UART1_TXD_Pin); //
/* configure USART Rx as alternate function push-pull */
gpio_mode_set(UART1_IO_Port, GPIO_MODE_AF, GPIO_PUPD_PULLUP,UART1_RXD_Pin); //
gpio_output_options_set(UART1_IO_Port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,UART1_RXD_Pin); //
/* USART configure */
usart_deinit(USART1);
usart_baudrate_set(USART1,115200);
usart_receive_config(USART1, USART_RECEIVE_ENABLE); //
usart_transmit_config(USART1, USART_TRANSMIT_ENABLE); //
//
usart_enable(USART1);//
nvic_irq_enable(USART1_IRQn, 0, 0);
usart_interrupt_enable(USART1, USART_INT_RBNE);//
}
void UART2_Init(void)
{
rcu_periph_clock_enable( UART2_Clock); //
rcu_periph_clock_enable(UART2_IO_Clock); //
/* connect port to USARTx_Tx */
gpio_af_set(UART2_IO_Port, GPIO_AF_7, UART2_TXD_Pin);//
/* connect port to USARTx_Rx */
gpio_af_set(UART2_IO_Port, GPIO_AF_7, UART2_RXD_Pin);//
/* configure USART Tx as alternate function push-pull */
gpio_mode_set(UART2_IO_Port, GPIO_MODE_AF, GPIO_PUPD_PULLUP,UART2_TXD_Pin); //
gpio_output_options_set(UART2_IO_Port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,UART2_TXD_Pin); //
/* configure USART Rx as alternate function push-pull */
gpio_mode_set(UART2_IO_Port, GPIO_MODE_AF, GPIO_PUPD_PULLUP,UART2_RXD_Pin); //
gpio_output_options_set(UART2_IO_Port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,UART2_RXD_Pin); //
/* USART configure */
usart_deinit(USART2);
usart_baudrate_set(USART2,115200);
usart_receive_config(USART2, USART_RECEIVE_ENABLE); //
usart_transmit_config(USART2, USART_TRANSMIT_ENABLE); //
//
usart_enable(USART2);//
nvic_irq_enable(USART2_IRQn, 0, 0);
usart_interrupt_enable(USART2, USART_INT_RBNE);//
}
串口的接收和发送处理
unsigned char Data=0;
void USART1_IRQHandler(void)
{
while((RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE)) &&(RESET != usart_flag_get(USART1, USART_FLAG_RBNE)))
{
/* Read one byte from the receive data register */
Data=usart_data_receive(USART1);
usart_data_transmit(USART2,Data);
}
// if((RESET != usart_flag_get(USART0, USART_FLAG_TBE)) &&(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)))
// {
// /* Write one byte to the transmit data register */
// usart_data_transmit(USART0,0xff);
// }
}
void UART1_Transmit(unsigned char *Data,unsigned int Lenth)
{
int i=0;
unsigned char U2_Data[256]={0};
strcpy((char*)U2_Data,"Send:");
strcat((char*)U2_Data, (char*)Data);
for(i=0;i<Lenth;i++)
{
usart_data_transmit(USART1,Data[i]);
while(RESET == usart_flag_get(USART1, USART_FLAG_TC));
}
for(i=0;i<strlen((char*)U2_Data);i++)
{
usart_data_transmit(USART2,U2_Data[i]);
while(RESET == usart_flag_get(USART2, USART_FLAG_TC));
}
}
主函数
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
/* configure systick */
systick_config();
/* enable the LED2 clock */
rcu_periph_clock_enable(RCU_GPIOC);
/* configure LED2 GPIO port */
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
/* reset LED2 GPIO pin */
gpio_bit_reset(GPIOC, GPIO_PIN_6);
/* enable the User Key GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
/* configure key pin as input */
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
UART1_Init();
UART2_Init();
while(1) {
//delay_1ms(1000);
/* check whether the key is pressed */
if(RESET == gpio_input_bit_get(GPIOA, GPIO_PIN_0)) {
delay_1ms(100);
/* check whether the key is pressed */
if(RESET == gpio_input_bit_get(GPIOA, GPIO_PIN_0)) {
gpio_bit_write(GPIOC, GPIO_PIN_6, (bit_status)(1 - gpio_input_bit_get(GPIOC, GPIO_PIN_6)));
}
while(RESET == gpio_input_bit_get(GPIOA, GPIO_PIN_0)) {
}
UART1_Transmit((unsigned char *)"AT\r\n",strlen("AT\r\n"));
delay_1ms(1000);
UART1_Transmit((unsigned char *)"AT+CPIN?\r\n",strlen("AT+CPIN?\r\n"));
delay_1ms(1000);
UART1_Transmit((unsigned char *)"AT+CSQ\r\n",strlen("AT+CSQ\r\n"));
delay_1ms(1000);
UART1_Transmit((unsigned char *)"AT+CGATT?\r\n",strlen("AT+CGATT?\r\n"));
delay_1ms(1000);
UART1_Transmit((unsigned char *)"AT+CSTT\r\n",strlen("AT+CSTT\r\n"));
delay_1ms(1000);
UART1_Transmit((unsigned char *)"AT+CIICR\r\n",strlen("AT+CIICR\r\n"));
delay_1ms(1000);
UART1_Transmit((unsigned char *)"AT+CIFSR\r\n",strlen("AT+CIFSR\r\n"));
delay_1ms(1000);
UART1_Transmit((unsigned char *)"AT+CIPSTART=\"TCP\",\"112.125.89.8\",\"36146\"\r\n",strlen("AT+CIPSTART=\"TCP\",\"112.125.89.8\",\"36146\"\r\n"));
delay_1ms(1000);
UART1_Transmit((unsigned char *)"AT+CIPSEND=10\r\n",strlen("AT+CIPSEND=10\r\n"));
delay_1ms(1000);
UART1_Transmit((unsigned char *)"GD32F427V!\r\n",strlen("GD32F427V!\r\n"));
delay_1ms(1000);
}
}
}
测试结果
下图是接线以及使用TCP通讯的测试结果,可以看到,开发板可以正常的发送和接收到数据,但是中文会显示乱码。
总结
这里要说一下抱歉,我是第二批的试用名单,开发板在11月底差不多就拿到了,但是由于自身工作和身体的原因导致写文章发布试用报告一直拖到了12月底。
这里总结下,官方提供的库还是比较健全的,基本上各种外设都可以找到使用代码,开发板也有几个基本工程比如点灯,按键使用什么的(本项目就是基于按键正DEMO改的)。使用起来还是比较方便的,其外这款芯片的功能也比较丰富,相对于ST价格也便宜,配置也高一点,感觉国产的MCU现在已经进步很多了,好多几乎都可以平替ST。但是感觉和ST的比在资料的丰富程度上,还是相差一定的距离,希望咱们的国产MCU继续努力,加油!!!