前言
接着上篇《国民技术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到华大的单片机了。