jinglixixi 发表于 2022-5-30 00:15

【兆易GD32F310测评】+ UART的应用

本帖最后由 jinglixixi 于 2022-5-30 00:17 编辑

<p style="text-align:justify">GD32F310配有2个 USART在内的标准和高级通信接口,使用它可以进行调试输出及串口设备间的通讯等。</p>

<p>1. printf输出</p>

<p>要实现printf输出,要涉及引脚的配置、串口通信的配置等,该工作主要有函数usart0_gpio_config()、</p>

<p>usart0_config()及fputc()来完成,其内容如下:</p>

<pre>
<code class="language-cpp">void usart0_gpio_config(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    /* connect port to USARTx_Tx */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
    /* connect port to USARTx_Rx */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10);
}</code></pre>

<p>&nbsp;</p>

<pre>
<code class="language-cpp">void usart0_config(void)
{
    rcu_periph_clock_enable(RCU_USART0);
    usart_deinit(USART0);
    usart_word_length_set(USART0, USART_WL_8BIT);
    usart_stop_bit_set(USART0, USART_STB_1BIT);
    usart_parity_config(USART0, USART_PM_NONE);
    usart_baudrate_set(USART0, 115200U);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    usart_enable(USART0);
}</code></pre>

<p>&nbsp;</p>

<pre>
<code class="language-cpp">int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t) ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}</code></pre>

<p>有了以上函数的支持,就可实现printf输出的功能,其测试效果如图1所示。</p>

<p>图1 输出测试</p>

<p>实现输出测试的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)

    systick_config();
    usart0_gpio_config();
    usart0_config();
    printf("usart transmit test example!");
    while(1);
}</code></pre>

<p>2. 发送字符</p>

<p>在串行通讯中,发送各种指令和参数是十分常见的,也是十分有用的。使用函数库中的函数usart_data_transmit)就可解决该问题,若是发送指令,还可将指令存放到数组中来简化处理。</p>

<p>实现发送字符的测试程序如下:</p>

<pre>
<code class="language-cpp">int main(void)

    systick_config();
    usart0_gpio_config();
    usart0_config();
    printf("usart transmit test example!");
    while(1){
        delay_1ms(1000);
        usart_data_transmit(USART0, 'A');
    }
}</code></pre>

<p>经下载测试,其测试效果如图2所示,说明功能正常。</p>

<p>图2发送字符</p>

<p>3.收发处理</p>

<p>在串行通讯中,设备间的收发应答是十分重要的,它可以保障设备间的可靠运行。</p>

<p>使用接收函数usart_data_receive()即可完成收发处理的测试,其测试程序如下:</p>

<pre>
<code class="language-cpp">int main(void)
{
    uint16_t m,p;
    systick_config();
    usart0_gpio_config();
    usart0_config();
    while(1){
         m=usart_data_receive(USART0);
         if(m!=p)
         {
               usart_data_transmit(USART0, m);
               p=m;
         }
    }
}</code></pre>

<p>进行程序下载,其测试效果如图3所示,即每发送一个不一致的字符就回显出相应的内容。</p>

<p></p>

<p>图3 字符接收与发送</p>

<p>&nbsp;</p>

Jacktang 发表于 2022-5-30 07:15

<p>&nbsp;UART的应用是基础应用,测评正常</p>

lugl4313820 发表于 2022-5-30 08:19

很好的教程,谢谢分享。

芯片老兵 发表于 2022-5-31 13:52

<p>谢谢楼主分享,学习到了,希望有机会多交流这些。</p>

jinglixixi 发表于 2022-5-31 16:52

芯片老兵 发表于 2022-5-31 13:52
谢谢楼主分享,学习到了,希望有机会多交流这些。

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>

jinglixixi 发表于 2022-5-31 16:53

lugl4313820 发表于 2022-5-30 08:19
很好的教程,谢谢分享。

<p>感谢支持!!!</p>

芯片老兵 发表于 2022-6-1 13:38

<p>谢谢分享,非常专业。</p>

芯片老兵 发表于 2022-6-1 13:38

<p>谢谢分享,非常专业,希望有机会学习。</p>

ZanbaTea 发表于 2022-6-3 22:35

<p>感谢版主大大的分享!共同学习共同进步,加油!加油!</p>

jinglixixi 发表于 2022-6-4 20:05

ZanbaTea 发表于 2022-6-3 22:35
感谢版主大大的分享!共同学习共同进步,加油!加油!

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>
页: [1]
查看完整版本: 【兆易GD32F310测评】+ UART的应用