[MCU] 【GD32F307E-START】+串口通讯测试

hujj   2020-11-22 17:59 楼主

    这两天时行了串口通讯的测试,开始我在原来测试平台上添加从厂家范例中复制过来的代码,串口通讯助手毫无反映情况,反复查阅之前各位老师的帖子并逐行代码对照也未发现差异,但运行就是不成功,直接编译厂家的范例,测试也是不行,最后才发现我使用的是GD32F307C_EVAL的范例,与GD32F307_START板子有细微的差别,下图是开始使用的范例,这引起范例是配合EVAL板子的:

usart_07.jpg

    配合START板子的范例在这里:

usart_06.jpg

    START板子只有两个范例:

usart_05.jpg

    经过对比,原来是使用的引脚不同,START板子USART0使用B6和B7两个引脚:

usart_08.jpg

    而EVAL板子USART0使用A9和A10两个引脚:

usart_09.jpg

    只怪我粗心大意,没仔细分辨。

    范例中只有发送的代码,没看到接收的代码,参照大家的帖子介绍以及EVAL板子的范例,我尝试写了接收并转发的代码:

        if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
            // read one byte from the receive data register 从接收数据寄存器读取一个字节
            rx_buffer[rx_counter] = (uint8_t)usart_data_receive(USART0);
            printf("\r\n %d ",rx_buffer[rx_counter++]);
            if(rx_counter >= nbr_data_to_read)
            {
                // disable the USART0 receive interrupt 禁用USART0接收中断
                usart_interrupt_disable(USART0, USART_INT_RBNE);
            }
			LCD_write_ASCII(30,6,1,rx_buffer);
         }

    同时还写了键按下就发送当前日期时间的代码:

        if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){

            delay_1ms(100);
			if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){
                /* turn on LED1 */
                gd_eval_led_on(LED1);
                /* output a message on hyperterminal using printf function */
                printf("\r\n 当前时间是%d年%d月%d日%d时%d分 \r\n", year, month, day, hour, minute);
                printf("\r\n %s \r\n",Text);
                /* wait for completion of USART transmission */
                while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TC)){
				}
			}
        }

    测试时发现发送正常,但接收不到全部数据,下图是测试的过程:

usart_01.jpg

    这是串口调试助手接收到的完整数据:

usart_02.jpg

    但串口调试助手向单片机发送数据,接收到的却不完整:

usart_03.jpg

    接着测试中断模式,中断处理的代码如下:

void USART0_IRQHandler(void)
{
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
        /* read one byte from the receive data register 从接收数据寄存器读取一个字节*/
        rx_buffer[rx_counter] = (uint8_t)usart_data_receive(USART0);
        printf("\r\n %d ",rx_buffer[rx_counter++]);

        if(rx_counter >= nbr_data_to_read)
        {
            /* disable the USART0 receive interrupt 禁用USART0接收中断*/
            usart_interrupt_disable(USART0, USART_INT_RBNE);
        }
    }
       
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)){
        /* write one byte to the transmit data register 向传输数据寄存器写入一个字节*/
        usart_data_transmit(USART0, tx_buffer[tx_counter++]);

        if(tx_counter >= nbr_data_to_send)
        {
            /* disable the USART0 transmit interrupt 禁用USART0传输中断*/
            usart_interrupt_disable(USART0, USART_INT_TBE);
            printf("\r\n %d ",rx_buffer[rx_counter++]);
			LCD_write_ASCII(30,6,1,rx_buffer);
        }
    }
}

 

    测试结果仍是没有接收到完整的数据:

usart_04.jpg

    看来还需要设定每次接收的字节数才行。

 

回复评论 (8)

    我添加了下列代码,开始设置参数为16,后来改为2,测试发现长度没有变化:

usart_block_length_config(USART0,2);

    下面代码的截图:

usart_10.jpg

    这是串口调试助手的截图,窗口上部分是设置长度为16的测试结果,下部分是设置长度为2的结果,均与原来没有设置相同,看来不是使用这个函数改变设置。

usart_11.jpg

 

点赞  2020-11-22 18:48

老哥开发板可真多!羡慕ing。一看就是大佬级别的。

点赞  2020-11-22 20:22
引用: w494143467 发表于 2020-11-22 20:22 老哥开发板可真多!羡慕ing。一看就是大佬级别的。

    过奖了,我最多才算是刚入门,照片上的基本上是自己制作的扩展板,可以方便进行各种实验,避免用杜邦线的不方便。

点赞  2020-11-23 07:53
引用: hujj 发表于 2020-11-23 07:53     过奖了,我最多才算是刚入门,照片上的基本上是自己制作的扩展板,可以方便进行各种实验, ...

那也厉害,我基本都是用杜邦线弄,要不就洞洞板做个扩展板。

点赞  2020-11-23 09:01
玩板看这里: https://bbs.eeworld.com.cn/elecplay.html EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
点赞  2020-11-23 11:00
引用: w494143467 发表于 2020-11-23 09:01 那也厉害,我基本都是用杜邦线弄,要不就洞洞板做个扩展板。

    我开始也是用杜邦线加洞洞板,但飞线太多不易排查连接错误,后来陆续自己画板打样,这样做测试比较方便,可以减少杜邦线连接错误或因接触不良造成硬件故障,下面是我陆续打样的部分板子:

PCB1.jpg

 

PCB2.jpg

点赞  2020-11-23 12:36
引用: hujj 发表于 2020-11-23 12:36     我开始也是用杜邦线加洞洞板,但飞线太多不易排查连接错误,后来陆续自己画板打样,这样做 ...

可以可以,后期我也要做这种扩展板。

点赞  2020-11-23 13:38

真会玩,感觉楼主自由时间很多的样子。

默认摸鱼,再摸鱼。2022、9、28
点赞  2020-11-24 13:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复