打印
[研电赛技术支持]

GD32F350串口0 UART0

[复制链接]
2640|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-3-13 08:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "uart0.h"

/*!
    \brief      cofigure the USART0 GPIO ports
    \param[in]  none
    \param[out] none
    \retval     none
*/
void usart0_gpio_config(void)
{
    /* enable COM GPIO clock */
    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);

    /* configure USART Tx as alternate function push-pull */
    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);

    /* configure USART Rx as alternate function push-pull */
    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);
}

/*!
    \brief      cofigure the USART0
    \param[in]  none
    \param[out] none
    \retval     none
*/
void usart0_config(void)
{
    /* enable USART clock */
    rcu_periph_clock_enable(RCU_USART0);

    /* USART configure */
    usart_deinit(USART0);
    usart_baudrate_set(USART0, 460800U);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);

    usart_enable(USART0);
}


void usart0_int_init(void)
{
    /* USART interrupt configuration */
    nvic_irq_enable(USART0_IRQn, 0, 1);

    usart_interrupt_enable(USART0, USART_INT_RBNE);
}


void usart0_init(void)
{
  usart0_gpio_config();
  usart0_config();
  usart0_int_init();
}


void usart0_send_ch(uint8_t ch)
{
    usart_data_transmit(USART0, (uint8_t) ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
}

void uart0_Send_Array(unsigned char send_array[],unsigned char num)
{
        //串口发送
        unsigned char i=0;
        for(i=0 ;i< num ; i++)
        {
                usart0_send_ch(send_array);
        }


}

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t) ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}




中断

void USART0_IRQHandler(void)
{
  uint16_t re = 0;
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
        /* receive data */
      re = usart_data_receive(USART0);

        if( re == 13)
        {
          usart0_send_ch('\r');
          usart0_send_ch('\n');
        }else
           usart0_send_ch(re);
    }
}
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/liuhfeng21/article/details/135642134

使用特权

评论回复
沙发
黑心单片机| | 2024-3-28 13:48 | 只看该作者
这个波特率好奇怪 啊

使用特权

评论回复
板凳
原来是wjc| | 2024-5-31 23:43 | 只看该作者
本帖最后由 原来是wjc 于 2024-6-1 02:58 编辑

你需要初始化DMA来接收串口数据。

使用特权

评论回复
地板
原来是wjc| | 2024-5-31 23:43 | 只看该作者
本帖最后由 原来是wjc 于 2024-6-1 02:59 编辑

你可能需要代码修改:

在 usart0_int_init 函数中添加DMA配置。

编写DMA中断服务函数来处理接收到的数据。

使用特权

评论回复
5
原来是wjc| | 2024-6-1 02:59 | 只看该作者
/* DMA接收配置 */
void usart0_dma_config(void)
{
    /* enable DMA clock */
    rcu_periph_clock_enable(RCU_DMA0);

    /* initialize DMA channel 2 */
    dma_deinit(DMA0, DMA_CH2);

    /* initialize DMA channel 2 */
    dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
    dma_init_struct.memory_addr = (uint32_t)receive_buffer; // 接收缓冲区地址
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
    dma_init_struct.number = 1;
    dma_init_struct.periph_addr = (uint32_t)&USART_DATA(USART0); // USART 数据寄存器地址
    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
    dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
    dma_channel_enable(DMA0, DMA_CH2);

    /* DMA中断配置 */
    dma_interrupt_enable(DMA0, DMA_CH2, DMA_INT_FTF);
    nvic_irq_enable(DMA0_Channel2_IRQn, 0, 1);
}

void usart0_int_init(void)
{
    /* USART interrupt configuration */
    nvic_irq_enable(USART0_IRQn, 0, 1);
    usart_interrupt_enable(USART0, USART_INT_RBNE);

    /* 初始化DMA接收 */
    usart0_dma_config();
}

/* DMA接收中断服务函数 */
void DMA0_Channel2_IRQHandler(void)
{
    if(dma_interrupt_flag_get(DMA0, DMA_CH2, DMA_INT_FLAG_FTF)){
        /* DMA传输完成 */
        dma_interrupt_flag_clear(DMA0, DMA_CH2, DMA_INT_FLAG_FTF);

        // 在这里处理接收到的数据
        // 可以从 receive_buffer 中读取数据
    }
}

使用特权

评论回复
6
原来是wjc| | 2024-6-1 02:59 | 只看该作者
假设你有一个名为 receive_buffer 的全局数组来存储接收到的数据,并且你需要在 usart0_int_init 函数中调用 usart0_dma_config 函数来初始化DMA。

使用特权

评论回复
7
FranklinUNK| | 2024-6-20 20:07 | 只看该作者
这么高的波特率

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1931

主题

15614

帖子

12

粉丝