RISC-V技术论坛
直播中

哈哈哈

11年用户 917经验值
擅长:可编程逻辑
私信 关注
[经验]

USART1、USART2、UART3的串口使用

本人用蓝牙测试通过了三个串口模块,其中USART1需要重映射配置。USART0我暂时没有启用!
下图是USART1的使用,相关接口映射可以查找“用户指南”,代码在文末(重映射需要开启AF时钟——感谢胡灿老师!)
另外我重写了delay_1ms函数,改为了delay_1us,后续会用到。



//参考文件// ~/Nuclei/SoC/gd32vf103/Board/gd32vf103v_eval/Include/gd32vf103v_eval.h//USART2 UART3可以直接正常使用,USART1需要重映射//由于用户手册上没找到USART0的接收端口,所以目前没有测试使用过#include #include "nuclei_sdk_hal.h"#include "gd32vf103_usart.h"#include "gd32vf103_gpio.h"#include "gd32vf103_exti.h"#include "nuclei_sdk_soc.h"#define COMn                             (4U)#define GD32_COM0                        USART0#define GD32_COM0_CLK                    RCU_USART0#define GD32_COM0_TX_PIN                 GPIO_PIN_9#define GD32_COM0_RX_PIN                 GPIO_PIN_10#define GD32_COM0_GPIO_PORT              GPIOA#define GD32_COM0_GPIO_CLK               RCU_GPIOA#define GD32_COM1                        USART1#define GD32_COM1_CLK                    RCU_USART1#define GD32_COM1_TX_PIN                 GPIO_PIN_5#define GD32_COM1_RX_PIN                 GPIO_PIN_6#define GD32_COM1_GPIO_PORT              GPIOD#define GD32_COM1_GPIO_CLK               RCU_GPIOD#define GD32_COM2                        USART2#define GD32_COM2_CLK                    RCU_USART2#define GD32_COM2_TX_PIN                 GPIO_PIN_10#define GD32_COM2_RX_PIN                 GPIO_PIN_11#define GD32_COM2_GPIO_PORT              GPIOB#define GD32_COM2_GPIO_CLK               RCU_GPIOB#define GD32_COM3                        UART3#define GD32_COM3_CLK                    RCU_UART3#define GD32_COM3_TX_PIN                 GPIO_PIN_10#define GD32_COM3_RX_PIN                 GPIO_PIN_11#define GD32_COM3_GPIO_PORT              GPIOC#define GD32_COM3_GPIO_CLK               RCU_GPIOC/* private variables */static rcu_periph_enum COM_CLK[COMn] = {GD32_COM0_CLK, GD32_COM1_CLK,GD32_COM2_CLK,GD32_COM3_CLK};static uint32_t COM_TX_PIN[COMn] = {GD32_COM0_TX_PIN, GD32_COM1_TX_PIN,GD32_COM2_TX_PIN,GD32_COM3_TX_PIN};static uint32_t COM_RX_PIN[COMn] = {GD32_COM0_RX_PIN, GD32_COM1_RX_PIN,GD32_COM2_RX_PIN,GD32_COM3_RX_PIN};static uint32_t COM_GPIO_PORT[COMn] = {GD32_COM0_GPIO_PORT, GD32_COM1_GPIO_PORT,GD32_COM2_GPIO_PORT,GD32_COM3_GPIO_PORT};static rcu_periph_enum COM_GPIO_CLK[COMn] = {GD32_COM0_GPIO_CLK, GD32_COM1_GPIO_CLK,GD32_COM2_GPIO_CLK,GD32_COM3_GPIO_CLK};void gd_com_init(uint32_t com);int USART_IRQHandler(uint32_t com);void delay_1us(uint32_t count);int main(void){//select   IRQn_Type IRQn=USART1_IRQn;    uint32_t COM=GD32_COM1;    //select end//initial    gd_com_init(COM);    usart_interrupt_enable(COM,USART_INT_RBNE); //使能接收中断    ECLIC_Register_IRQ(IRQn,ECLIC_NON_VECTOR_INTERRUPT,ECLIC_LEVEL_TRIGGER,1,0,USART_IRQHandler(COM)); // 配置中断函数    __enable_irq();    usart_enable(COM);    //initial end//transmit   for (uint32_t i = 1; i <= 10; i ++) {        usart_data_transmit(COM,i);    while ( usart_flag_get(COM, USART_FLAG_TBE)== RESET){}; // 等待发送完成    delay_1us(1000000);    }    //transmit end      usart_interrupt_disable(COM,USART_INT_RBNE);    return 0;}void gd_com_init(uint32_t com){    uint32_t com_id = 0U;    if(GD32_COM0 == com){        com_id = 0U;    }else if(GD32_COM1 == com){        com_id = 1U;         /* enable AF clock */        rcu_periph_clock_enable(RCU_AF);    }else if(GD32_COM2 == com){        com_id = 2U;    }else if(GD32_COM3 == com){        com_id = 3U;    }    /* enable GPIO clock */    rcu_periph_clock_enable(COM_GPIO_CLK[com_id]);    /* enable USART clock */    rcu_periph_clock_enable(COM_CLK[com_id]);    /* connect port to USARTx_Tx */    gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, COM_TX_PIN[com_id]);    /* connect port to USARTx_Rx */    gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, COM_RX_PIN[com_id]);    /* USART configure *////////////////////////////////////////////////////////////////////reconfig    if(GD32_COM1 == com){        gpio_pin_remap_config(GPIO_USART1_REMAP, ENABLE);    }//reconfig end//////////////////////////////////////////////////////////////////    usart_deinit(com);    usart_baudrate_set(com, 9600U);    usart_word_length_set(com, USART_WL_8BIT);    usart_parity_config(com, USART_PM_NONE);    usart_stop_bit_set(com, USART_STB_1BIT);        usart_hardware_flow_rts_config(com, USART_RTS_DISABLE);    usart_hardware_flow_cts_config(com, USART_CTS_DISABLE);    usart_receive_config(com, USART_RECEIVE_ENABLE);    usart_transmit_config(com, USART_TRANSMIT_ENABLE);    //usart_enable(com);}int USART_IRQHandler(uint32_t com){        if(usart_interrupt_flag_get(com, USART_INT_FLAG_RBNE) != RESET){                uint8_t serial_recv = usart_data_receive(com);                printf("%d",serial_recv);        }    return 0;}void delay_1us(uint32_t count){    uint64_t start_mtime, delta_mtime;    //uint64_t delay_ticks = (SOC_TIMER_FREQ * (uint64_t)count) / 1000;    uint64_t delay_ticks = (SOC_TIMER_FREQ * (uint64_t)count)/1000000;    start_mtime = SysTimer_GetLoadValue();    do {        delta_mtime = SysTimer_GetLoadValue() - start_mtime;    } while (delta_mtime < delay_ticks);}

更多回帖

发帖
×
20
完善资料,
赚取积分