国民技术N32G457移植usart设备

前言

接着上篇《国民技术N32G457移植pin设备》的RT-Thread工程移植usart设备驱动。


一、添加文件到工程中

1、添加dev_usart.c到工程中
在这里插入图片描述

二、修改源文件

1、修改rtconfig.c文件
在这里插入图片描述
2、修改所需要包含的文件
在这里插入图片描述
3、修改预编译代码
在这里插入图片描述
4、修改串口结构体
在这里插入图片描述

5、将这些标号改成从1开始的序号,因为N32G457芯片串口是从1开始,USART1,USART2,USART3,UART4,UART5。
在这里插入图片描述
6、这个结构体的串口编号也是要更改,这个适用于初始化串口结构体的。
在这里插入图片描述
7、修改n32_uart_gpio_init函数,用于初始化串口相关引脚。

void n32_uart_gpio_init(struct n32_uart *uart)
{
	GPIO_InitType GPIO_InitStructure;
	
    /* enable USART clock */
    RCC_EnableAPB2PeriphClk(uart->tx_gpio_clk,ENABLE);
    RCC_EnableAPB2PeriphClk(uart->rx_gpio_clk,ENABLE);
	
	if((uart->uart_periph == USART1) ||
	   (uart->uart_periph == UART6)  || 
	   (uart->uart_periph == UART7))
		RCC_EnableAPB2PeriphClk(uart->per_clk,ENABLE);
	else
	if((uart->uart_periph == USART2) ||
	   (uart->uart_periph == USART3) || 
	   (uart->uart_periph == UART4)  ||
	   (uart->uart_periph == UART5))
		RCC_EnableAPB1PeriphClk(uart->per_clk,ENABLE);

    /* connect port to USARTx_Tx */
    GPIO_InitStructure.Pin        = uart->tx_pin;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
	GPIO_InitPeripheral(uart->tx_port, &GPIO_InitStructure);

    /* connect port to USARTx_Rx */
    GPIO_InitStructure.Pin        = uart->rx_pin;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
	GPIO_InitPeripheral(uart->rx_port, &GPIO_InitStructure);

    NVIC_SetPriority(uart->irqn, 0);
    NVIC_EnableIRQ(uart->irqn);
}

8、修改n32_configure函数,初始化串口。

static rt_err_t n32_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
{
    struct n32_uart *uart;
	USART_InitType USART_InitStructure;
	
    RT_ASSERT(serial != RT_NULL);
    RT_ASSERT(cfg != RT_NULL);

    uart = (struct n32_uart *)serial->parent.user_data;
    
    n32_uart_gpio_init(uart);
    
    USART_InitStructure.BaudRate = cfg->baud_rate;

    switch (cfg->data_bits)
    {
    case DATA_BITS_9:
		USART_InitStructure.WordLength = USART_WL_9B;
        break;

    default:
        USART_InitStructure.WordLength = USART_WL_8B;
        break;
    }

    switch (cfg->stop_bits)
    {
    case STOP_BITS_2:
        USART_InitStructure.StopBits = USART_STPB_2;
        break;
    default:
        USART_InitStructure.StopBits = USART_STPB_1;
        break;
    }

    switch (cfg->parity)
    {
    case PARITY_ODD:
        USART_InitStructure.Parity = USART_PE_ODD;
        break;
    case PARITY_EVEN:
        USART_InitStructure.Parity = USART_PE_EVEN;
        break;
    default:
        USART_InitStructure.Parity = USART_PE_NO;
        break;
    }

	USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
	USART_InitStructure.Mode                = USART_MODE_RX | USART_MODE_TX;
	USART_Init(uart->uart_periph, &USART_InitStructure);
	
	USART_Enable(uart->uart_periph, ENABLE);

    return RT_EOK;
}

9、修改n32_control函数,用于对串口中断使能的控制

static rt_err_t n32_control(struct rt_serial_device *serial, int cmd, void *arg)
{
    struct n32_uart *uart;

    RT_ASSERT(serial != RT_NULL);
    uart = (struct n32_uart *)serial->parent.user_data;

    switch (cmd)
    {
    case RT_DEVICE_CTRL_CLR_INT:
        /* disable rx irq */
        NVIC_DisableIRQ(uart->irqn);
        /* disable interrupt */
        USART_ConfigInt(uart->uart_periph, USART_INT_RXDNE, DISABLE);

        break;
    case RT_DEVICE_CTRL_SET_INT:
        /* enable rx irq */
        NVIC_EnableIRQ(uart->irqn);
        /* enable interrupt */
        USART_ConfigInt(uart->uart_periph, USART_INT_RXDNE, ENABLE);
        break;
    }

    return RT_EOK;
}

10、修改n32_putc函数,用于发送数据。

static int n32_putc(struct rt_serial_device *serial, char ch)
{
    struct n32_uart *uart;

    RT_ASSERT(serial != RT_NULL);
    uart = (struct n32_uart *)serial->parent.user_data;

	USART_SendData(uart->uart_periph, ch);
    while((USART_GetFlagStatus(uart->uart_periph, USART_FLAG_TXDE) == RESET));
    
    return 1;
}

11、修改gd32_getc函数,用于获取一个字节数据。

static int n32_getc(struct rt_serial_device *serial)
{
    int ch;
    struct n32_uart *uart;

    RT_ASSERT(serial != RT_NULL);
    uart = (struct n32_uart *)serial->parent.user_data;

    ch = -1;
    if (USART_GetFlagStatus(uart->uart_periph, USART_FLAG_RXDNE) != RESET)
        ch = USART_ReceiveData(uart->uart_periph);
    return ch;
}

12、修改uart_isr函数,串口中断。

static void uart_isr(struct rt_serial_device *serial)
{
    struct n32_uart *uart = (struct n32_uart *) serial->parent.user_data;

    RT_ASSERT(uart != RT_NULL);

    /* UART in mode Receiver */
    if ((USART_GetIntStatus(uart->uart_periph, USART_INT_RXDNE) != RESET) &&
            (USART_GetFlagStatus(uart->uart_periph, USART_FLAG_RXDNE) != RESET))
    {
        rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
        /* Clear RXNE interrupt flag */
        USART_ClrFlag(uart->uart_periph, USART_FLAG_RXDNE);
    }
}

13、编译下载测试。
在这里插入图片描述
在这里插入图片描述

三、源码下载

源码----

总结

后面要开始移植RT-Thread到华大的单片机了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小破孩 != ERR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值