863|1

20

帖子

0

资源

一粒金砂(中级)

第七篇 UART的使用-轮询与中断方式 [复制链接]

GD32L23x的UART有很多实用的功能,比如接收超时中断、接收缓冲区FIFO等。不过首先还是要掌握基本的功能。

一、初始化

初始化包括:

  • 时钟

    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_USART0);
  • 引脚

    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9);
    gpio_af_set(GPIOA, GPIO_AF_7, 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);
  • UART初始化和使能。初始化不像STM32那样通过一个结构体设置参数,而是通过函数对每个参数进行的设置。
    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);

二、接收和发送功能

轮询方式

接收的标志位USART_FLAG_RBNE,当接收缓冲区不为空的时候置位。

void uart_recv_polling(uint8_t* data_buf,uint8_t len)
{
    uint8_t i;
    for(i=0;i<len;i++){
        while(RESET == usart_flag_get(USART0, USART_FLAG_RBNE));
        data_buf[i] = usart_data_receive(USART0);
    }
}

发送的标志位USART_FLAG_TBE,当发送缓冲区空的时候置位。

void uart_trans_polling(uint8_t* data_buf,uint8_t len)
{
    uint8_t i;
    for(i=0;i<len;i++){
        usart_data_transmit(USART0, (uint8_t) data_buf[i]);
        while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    }
}

中断方式

  • 中断的设置:包括NVIC和UART的中断使能

            

nvic_irq_enable(USART0_IRQn, 0);
usart_interrupt_enable(USART0, USART_INT_RBNE);//使能接收缓冲区非空中断
usart_interrupt_enable(USART0, USART_INT_TBE);//使能发送缓冲区空中断
usart_interrupt_enable(USART0, USART_INT_TC);//使能发送完成中断
  • 重要标志位
    • USART_INT_FLAG_RBNE接收缓冲区非空中断标志位
    • USART_INT_FLAG_TBE发送缓冲区空中断标志位

注意使用usart_interrupt_enable(USART0, USART_INT_TBE);使能中断后就会触发一次中断,因为此时接收缓冲区为空

编写一个收到什么数据发送什么数据的中断函数

#define RECV_BUF_LEN 50
char uart_recv_buf[RECV_BUF_LEN];
uint8_t recv_index;
uint8_t tran_index;

void USART0_IRQHandler(void)
{
    uint8_t data;
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) {
        uart_recv_buf[recv_index++] = usart_data_receive(USART0);
        if(recv_index >= RECV_BUF_LEN){
            recv_index = 0;
        }
        usart_interrupt_enable(USART0, USART_INT_TBE);
    }
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)) {
        if(tran_index != recv_index){
            usart_data_transmit(USART0,uart_recv_buf[tran_index]);
            tran_index++;
            if(tran_index >= RECV_BUF_LEN){
                tran_index = 0;
            }
        }

    }
}

 

此帖出自GD32 MCU论坛

回复

6907

帖子

0

资源

五彩晶圆(中级)

GD32L23x的UART的使用-轮询与中断方式思路介绍的很清晰了


回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    推荐帖子
    HART® 调制解调器的高精度环路供电式 4mA 至 20mA

    此参考设计为采用 HART® 调制解调器的环路供电型高精度现场(传感器)变送器提供了一种解决方案。此设计使用了部分分立的 4 ...

    传感器电路分析,关于火焰探测器

    这个电路包含两个部分功能,一个是自激产生高压,第二是产生一个负压,VCC为24v,现在主要是这两个电路搞不明白

    说下CC1310开发环境

    一、准备工作 1.sdk版本:simplelink_cc13x0_sdk_1_60_00_21 2.开发工具:IAR(Embedded Workbench 8.0_2)或者CCS(Code ...

    电池测试设备 --- 信号链篇

    Stanley Ho 随着锂电池行业的兴起,电池测试设备的市场也变得庞大,其主要应用于3C电池与动力电池的化成 ...

    Verilog HDL的基础知识.pdf

    Verilog HDL的基础知识.pdf

    【国民技术低功耗系列N32L43x测评】2、RT-Thread移植+LED演示

    本帖最后由 emmnn 于 2022-7-7 11:16 编辑 # 前言 在把官方提供的DEMO工程跑起来后,就可以考虑OS的移植了。恰好在官方 ...

    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表