5662|1

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

第七篇 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论坛

最新回复

GD32L23x的UART的使用-轮询与中断方式思路介绍的很清晰了   详情 回复 发表于 2022-2-13 21:53
点赞 关注
 

回复
举报

6587

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

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

此帖出自GD32 MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
电子设计竞赛系列指导之一--控制器的选择

本帖最后由 paulhyde 于 2014-9-15 04:02 编辑 22186

Stellaris资料整理贴

//--------------------------------------2010.3.25---------------------------------------- 1. Stellaris大全(不断更新) ...

一款不错的VHDL和Verilog转换软件

如题,搞到的软件希望对大家有所帮助

有没有想DIY 白光烙铁控制器的同学?——遇到了问题 这么晚了不知还有人在吗?

背景: 手头一直有一个T12的白光烙铁头,但只是偶尔用一下。原因是直接接的12V,怕时间长了就烧坏了。 淘宝上的二手 T12 也 ...

msp430 LaunchPad 驱动9320TFT液晶(有图有代码)

本例使用MSP430G2553实现,其他型号一样适用,仅改下头文件就OK TFT的主控型号为ili9320 ;9325也可以,仅需在程序中改动型号。 ...

关于小白编写bootloader的那档事

写在前面:以下内容不保证完全正确,但都是基于笔者的实践、经历过常规验证的。尽信书不如无书,希望读者能结合自己的实践,抱着 ...

TI eSMO 库Fsmopos和Gsmopos参数解析

作者:Hardy Zhou 在电机无感控制算法方面,TI提供了eSMO滑模观测器来计算电机转子角度. 在应用方面,TI提供了eSMO lib文件和 ...

树莓派涨价涨的离谱

以前俩百多的板子都到六百多了,没有人抬价我都不信。美利坚印钱也没有这么夸张吧。坐等降价。

脉冲触发电路求助

713437根据图求助以下几个问题: ① 图2中,集成电路KC42和外围电子元件组成电路环节的作用是什么? ② 图2中,电位器RP1 ...

请问TM4C123GXL核心板,不用USB而要用220v转5v电源模块供电,我的5V要接到哪个引脚呀

本帖最后由 王满满 于 2024-7-20 15:43 编辑 请问TM4C123GXL核心板,不用USB而要用220v转5v电源模块供电,我的5V要接到哪个引 ...

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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