feat support DMA for aiit-arm32-board and stm32f407-st-discovery uart function

This commit is contained in:
Liu_Weichao
2022-01-17 17:15:19 +08:00
parent bac136c51d
commit 109ad93e9e
8 changed files with 133 additions and 56 deletions
@@ -9,8 +9,11 @@ menuconfig BSP_USING_USART1
string "serial bus 1 driver name"
default "usart1_drv"
config SERIAL_1_DEVICE_NAME_0
string "serial bus 1 device name"
default "usart1_dev1"
string "serial bus 1 device 0 name"
default "usart1_dev1"
config USART1_USING_DMA
bool "usart1 using DMA"
default n
endif
menuconfig BSP_USING_USART2
@@ -24,8 +27,11 @@ menuconfig BSP_USING_USART2
string "serial bus 2 driver name"
default "usart2_drv"
config SERIAL_2_DEVICE_NAME_0
string "serial bus 2 device name"
default "usart2_dev2"
string "serial bus 2 device 0 name"
default "usart2_dev2"
config USART2_USING_DMA
bool "usart2 using DMA"
default n
endif
menuconfig BSP_USING_USART3
@@ -39,8 +45,11 @@ menuconfig BSP_USING_USART3
string "serial bus 3 driver name"
default "usart3_drv"
config SERIAL_3_DEVICE_NAME_0
string "serial bus 3 device name"
default "usart3_dev3"
string "serial bus 3 device 0 name"
default "usart3_dev3"
config USART3_USING_DMA
bool "usart3 using DMA"
default n
endif
menuconfig BSP_USING_UART4
@@ -54,8 +63,11 @@ menuconfig BSP_USING_UART4
string "serial bus 4 driver name"
default "uart4_drv"
config SERIAL_4_DEVICE_NAME_0
string "serial bus 4 device name"
default "uart4_dev4"
string "serial bus 4 device 0 name"
default "uart4_dev4"
config USART4_USING_DMA
bool "usart4 using DMA"
default n
endif
menuconfig BSP_USING_UART5
@@ -69,6 +81,9 @@ menuconfig BSP_USING_UART5
string "serial bus 5 driver name"
default "uart5_drv"
config SERIAL_5_DEVICE_NAME_0
string "serial bus 5 device name"
default "uart5_dev5"
string "serial bus 5 device 0 name"
default "uart5_dev5"
config USART5_USING_DMA
bool "usart5 using DMA"
default n
endif
@@ -228,19 +228,19 @@ static void SerialCfgParamCheck(struct SerialCfgParam *serial_cfg_default, struc
struct SerialDataCfg *data_cfg_default = &serial_cfg_default->data_cfg;
struct SerialDataCfg *data_cfg_new = &serial_cfg_new->data_cfg;
if((data_cfg_default->serial_baud_rate != data_cfg_new->serial_baud_rate) && (data_cfg_new->serial_baud_rate)){
if((data_cfg_default->serial_baud_rate != data_cfg_new->serial_baud_rate) && (data_cfg_new->serial_baud_rate)) {
data_cfg_default->serial_baud_rate = data_cfg_new->serial_baud_rate;
}
if((data_cfg_default->serial_bit_order != data_cfg_new->serial_bit_order) && (data_cfg_new->serial_bit_order)){
if((data_cfg_default->serial_bit_order != data_cfg_new->serial_bit_order) && (data_cfg_new->serial_bit_order)) {
data_cfg_default->serial_bit_order = data_cfg_new->serial_bit_order;
}
if((data_cfg_default->serial_buffer_size != data_cfg_new->serial_buffer_size) && (data_cfg_new->serial_buffer_size)){
if((data_cfg_default->serial_buffer_size != data_cfg_new->serial_buffer_size) && (data_cfg_new->serial_buffer_size)) {
data_cfg_default->serial_buffer_size = data_cfg_new->serial_buffer_size;
}
if((data_cfg_default->serial_data_bits != data_cfg_new->serial_data_bits) && (data_cfg_new->serial_data_bits)){
if((data_cfg_default->serial_data_bits != data_cfg_new->serial_data_bits) && (data_cfg_new->serial_data_bits)) {
data_cfg_default->serial_data_bits = data_cfg_new->serial_data_bits;
}
@@ -322,8 +322,7 @@ static uint32 Stm32SerialConfigure(struct SerialDriver *serial_drv, int serial_o
USART_ITConfig(serial_hw_cfg->uart_device, USART_IT_RXNE, ENABLE);
break;
case OPER_CONFIG :
if (SIGN_OPER_DMA_RX == serial_dev_param->serial_set_mode)
{
if (SIGN_OPER_DMA_RX == serial_dev_param->serial_set_mode) {
DMAConfiguration(serial_dev, serial_hw_cfg->uart_device);
}
}
@@ -378,8 +377,16 @@ static void DmaRxDoneIsr(struct Stm32Usart *serial, struct SerialDriver *serial_
if (DMA_GetFlagStatus(dma->RxStream, dma->RxFlag) != RESET) {
x_base level = CriticalAreaLock();
x_size_t recv_len = dma->SettingRecvLen - dma->LastRecvIndex;
dma->LastRecvIndex = 0;
x_size_t recv_len;
x_size_t recv_total_index = dma->SettingRecvLen - DMA_GetCurrDataCounter(dma->RxStream);
if (0 != recv_total_index) {
recv_len = recv_total_index - dma->LastRecvIndex;
} else {
recv_len = dma->SettingRecvLen - dma->LastRecvIndex;
}
dma->LastRecvIndex = recv_total_index;
CriticalAreaUnLock(level);
if (recv_len) SerialSetIsr(serial_dev, SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
@@ -397,15 +404,14 @@ static void UartIsr(struct Stm32Usart *serial, struct SerialDriver *serial_drv,
if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_RXNE) != RESET) {
SerialSetIsr(serial_dev, SERIAL_EVENT_RX_IND);
USART_ClearITPendingBit(serial_hw_cfg->uart_device, USART_IT_RXNE);
}
if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_IDLE) != RESET) {
} else if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_IDLE) != RESET) {
DmaUartRxIdleIsr(serial_dev, dma, serial_hw_cfg->uart_device);
}
if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_TC) != RESET) {
} else if (USART_GetITStatus(serial_hw_cfg->uart_device, USART_IT_TC) != RESET) {
USART_ClearITPendingBit(serial_hw_cfg->uart_device, USART_IT_TC);
}
if (USART_GetFlagStatus(serial_hw_cfg->uart_device, USART_FLAG_ORE) == SET) {
USART_ReceiveData(serial_hw_cfg->uart_device);
} else {
if (USART_GetFlagStatus(serial_hw_cfg->uart_device, USART_FLAG_ORE) == SET) {
USART_ReceiveData(serial_hw_cfg->uart_device);
}
}
}
@@ -673,6 +679,9 @@ int Stm32HwUsartInit(void)
serial_driver_1.private_data = (void *)&serial_cfg_1;
serial_dev_param_1.serial_work_mode = SIGN_OPER_INT_RX;
#ifdef USART1_USING_DMA
serial_dev_param_1.serial_work_mode = SIGN_OPER_DMA_RX;
#endif
serial_device_1.haldev.private_data = (void *)&serial_dev_param_1;
NVIC_Configuration(serial_hw_cfg_1.irq);
@@ -707,7 +716,6 @@ int Stm32HwUsartInit(void)
serial_device_2.hwdev_done = &hwdev_done;
serial_cfg_2.data_cfg = data_cfg_init;
serial_cfg_2.data_cfg.serial_baud_rate=BAUD_RATE_115200;
serial_hw_cfg_2.uart_device = USART2;
serial_hw_cfg_2.irq = USART2_IRQn;
@@ -715,6 +723,9 @@ int Stm32HwUsartInit(void)
serial_driver_2.private_data = (void *)&serial_cfg_2;
serial_dev_param_2.serial_work_mode = SIGN_OPER_INT_RX;
#ifdef USART2_USING_DMA
serial_dev_param_2.serial_work_mode = SIGN_OPER_DMA_RX;
#endif
serial_device_2.haldev.private_data = (void *)&serial_dev_param_2;
NVIC_Configuration(serial_hw_cfg_2.irq);
@@ -749,7 +760,6 @@ int Stm32HwUsartInit(void)
serial_device_3.hwdev_done = &hwdev_done;
serial_cfg_3.data_cfg = data_cfg_init;
serial_cfg_3.data_cfg.serial_baud_rate=BAUD_RATE_57600;
serial_hw_cfg_3.uart_device = USART3;
serial_hw_cfg_3.irq = USART3_IRQn;
@@ -757,6 +767,9 @@ int Stm32HwUsartInit(void)
serial_driver_3.private_data = (void *)&serial_cfg_3;
serial_dev_param_3.serial_work_mode = SIGN_OPER_INT_RX;
#ifdef USART3_USING_DMA
serial_dev_param_3.serial_work_mode = SIGN_OPER_DMA_RX;
#endif
serial_device_3.haldev.private_data = (void *)&serial_dev_param_3;
NVIC_Configuration(serial_hw_cfg_3.irq);
@@ -798,6 +811,9 @@ int Stm32HwUsartInit(void)
serial_driver_4.private_data = (void *)&serial_cfg_4;
serial_dev_param_4.serial_work_mode = SIGN_OPER_INT_RX;
#ifdef USART4_USING_DMA
serial_dev_param_4.serial_work_mode = SIGN_OPER_DMA_RX;
#endif
serial_device_4.haldev.private_data = (void *)&serial_dev_param_4;
NVIC_Configuration(serial_hw_cfg_4.irq);
@@ -839,6 +855,9 @@ int Stm32HwUsartInit(void)
serial_driver_5.private_data = (void *)&serial_cfg_5;
serial_dev_param_5.serial_work_mode = SIGN_OPER_INT_RX;
#ifdef USART5_USING_DMA
serial_dev_param_5.serial_work_mode = SIGN_OPER_DMA_RX;
#endif
serial_device_5.haldev.private_data = (void *)&serial_dev_param_5;
NVIC_Configuration(serial_hw_cfg_5.irq);