1.CH32-V307串口驱动适配DMA。

2.路径移动。
This commit is contained in:
MacRsh
2024-05-08 23:55:02 +08:00
parent 4eb92c4f31
commit d4bdfd2ade
19 changed files with 282 additions and 59 deletions

View File

@@ -138,7 +138,9 @@ extern "C" {
.instance = USART1, .clock = RCC_APB2Periph_USART1, \
.gpio_clock = RCC_APB2Periph_GPIOA, .rx_port = GPIOA, \
.rx_pin = GPIO_Pin_10, .tx_port = GPIOA, .tx_pin = GPIO_Pin_9, \
.irq = USART1_IRQn, .remap = 0 \
.irq = USART1_IRQn, .remap = 0, .rx_dma_channel = DMA1_Channel5, \
.rx_dma_clock = RCC_AHBPeriph_DMA1, .rx_dma_irq = DMA1_Channel5_IRQn, \
.rx_dma_irq_it = DMA1_IT_TC5 \
}
#elif (MR_CFG_UART1_GROUP == 2)
#define _DRIVER_UART1_CONFIG \
@@ -146,7 +148,9 @@ extern "C" {
.instance = USART1, .clock = RCC_APB2Periph_USART1, \
.gpio_clock = RCC_APB2Periph_GPIOB, .rx_port = GPIOB, \
.rx_pin = GPIO_Pin_7, .tx_port = GPIOB, .tx_pin = GPIO_Pin_6, \
.irq = USART1_IRQn, .remap = GPIO_Remap_USART1 \
.irq = USART1_IRQn, .remap = GPIO_Remap_USART1, \
.rx_dma_channel = DMA1_Channel5, .rx_dma_clock = RCC_AHBPeriph_DMA1, \
.rx_dma_irq = DMA1_Channel5_IRQn, .rx_dma_irq_it = DMA1_IT_TC5 \
}
#elif (MR_CFG_UART1_GROUP == 3)
#define _DRIVER_UART1_CONFIG \
@@ -154,7 +158,9 @@ extern "C" {
.instance = USART1, .clock = RCC_APB2Periph_USART1, \
.gpio_clock = RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, \
.rx_port = GPIOA, .rx_pin = GPIO_Pin_8, .tx_port = GPIOB, \
.tx_pin = GPIO_Pin_15, .irq = USART1_IRQn, .remap = 0 \
.tx_pin = GPIO_Pin_15, .irq = USART1_IRQn, .remap = 0, \
.rx_dma_channel = DMA1_Channel5, .rx_dma_clock = RCC_AHBPeriph_DMA1, \
.rx_dma_irq = DMA1_Channel5_IRQn, .rx_dma_irq_it = DMA1_IT_TC5 \
}
#elif (MR_CFG_UART1_GROUP == 4)
#define _DRIVER_UART1_CONFIG \
@@ -162,7 +168,9 @@ extern "C" {
.instance = USART1, .clock = RCC_APB2Periph_USART1, \
.gpio_clock = RCC_APB2Periph_GPIOA, .rx_port = GPIOA, \
.rx_pin = GPIO_Pin_7, .tx_port = GPIOA, .tx_pin = GPIO_Pin_6, \
.irq = USART1_IRQn, .remap = GPIO_Remap_USART1 \
.irq = USART1_IRQn, .remap = GPIO_Remap_USART1, \
.rx_dma_channel = DMA1_Channel5, .rx_dma_clock = RCC_AHBPeriph_DMA1, \
.rx_dma_irq = DMA1_Channel5_IRQn, .rx_dma_irq_it = DMA1_IT_TC5 \
}
#endif /* MR_CFG_UART1_GROUP */
@@ -172,7 +180,9 @@ extern "C" {
.instance = USART2, .clock = RCC_APB1Periph_USART2, \
.gpio_clock = RCC_APB2Periph_GPIOA, .rx_port = GPIOA, \
.rx_pin = GPIO_Pin_3, .tx_port = GPIOA, .tx_pin = GPIO_Pin_2, \
.irq = USART2_IRQn, .remap = 0 \
.irq = USART2_IRQn, .remap = 0, .rx_dma_channel = DMA1_Channel6, \
.rx_dma_clock = RCC_AHBPeriph_DMA1, .rx_dma_irq = DMA1_Channel6_IRQn, \
.rx_dma_irq_it = DMA1_IT_TC6 \
}
#elif (MR_CFG_UART2_GROUP == 2)
#define _DRIVER_UART2_CONFIG \
@@ -180,7 +190,9 @@ extern "C" {
.instance = USART2, .clock = RCC_APB1Periph_USART2, \
.gpio_clock = RCC_APB2Periph_GPIOD, .rx_port = GPIOD, \
.rx_pin = GPIO_Pin_6, .tx_port = GPIOD, .tx_pin = GPIO_Pin_5, \
.irq = USART2_IRQn, .remap = GPIO_Remap_USART2 \
.irq = USART2_IRQn, .remap = GPIO_Remap_USART2, \
.rx_dma_channel = DMA1_Channel6, .rx_dma_clock = RCC_AHBPeriph_DMA1, \
.rx_dma_irq = DMA1_Channel6_IRQn, .rx_dma_irq_it = DMA1_IT_TC6 \
}
#endif /* MR_CFG_UART2_GROUP */
@@ -190,7 +202,9 @@ extern "C" {
.instance = USART3, .clock = RCC_APB1Periph_USART3, \
.gpio_clock = RCC_APB2Periph_GPIOB, .rx_port = GPIOB, \
.rx_pin = GPIO_Pin_11, .tx_port = GPIOB, .tx_pin = GPIO_Pin_10, \
.irq = USART3_IRQn, .remap = 0 \
.irq = USART3_IRQn, .remap = 0, .rx_dma_channel = DMA1_Channel3, \
.rx_dma_clock = RCC_AHBPeriph_DMA1, .rx_dma_irq = DMA1_Channel3_IRQn, \
.rx_dma_irq_it = DMA1_IT_TC3 \
}
#elif (MR_CFG_UART3_GROUP == 2)
#define _DRIVER_UART3_CONFIG \
@@ -198,7 +212,9 @@ extern "C" {
.instance = USART3, .clock = RCC_APB1Periph_USART3, \
.gpio_clock = RCC_APB2Periph_GPIOC, .rx_port = GPIOC, \
.rx_pin = GPIO_Pin_11, .tx_port = GPIOC, .tx_pin = GPIO_Pin_10, \
.irq = USART3_IRQn, .remap = GPIO_PartialRemap_USART3 \
.irq = USART3_IRQn, .remap = GPIO_PartialRemap_USART3, \
.rx_dma_channel = DMA1_Channel3, .rx_dma_clock = RCC_AHBPeriph_DMA1, \
.rx_dma_irq = DMA1_Channel3_IRQn, .rx_dma_irq_it = DMA1_IT_TC3 \
}
#elif (MR_CFG_UART3_GROUP == 3)
#define _DRIVER_UART3_CONFIG \
@@ -206,7 +222,9 @@ extern "C" {
.instance = USART3, .clock = RCC_APB1Periph_USART3, \
.gpio_clock = RCC_APB2Periph_GPIOA, .rx_port = GPIOA, \
.rx_pin = GPIO_Pin_14, .tx_port = GPIOA, .tx_pin = GPIO_Pin_13, \
.irq = USART3_IRQn, .remap = GPIO_PartialRemap1_USART3 \
.irq = USART3_IRQn, .remap = GPIO_PartialRemap1_USART3, \
.rx_dma_channel = DMA1_Channel3, .rx_dma_clock = RCC_AHBPeriph_DMA1, \
.rx_dma_irq = DMA1_Channel3_IRQn, .rx_dma_irq_it = DMA1_IT_TC3 \
}
#elif (MR_CFG_UART3_GROUP == 4)
#define _DRIVER_UART3_CONFIG \
@@ -214,7 +232,9 @@ extern "C" {
.instance = USART3, .clock = RCC_APB1Periph_USART3, \
.gpio_clock = RCC_APB2Periph_GPIOD, .rx_port = GPIOD, \
.rx_pin = GPIO_Pin_9, .tx_port = GPIOD, .tx_pin = GPIO_Pin_8, \
.irq = USART3_IRQn, .remap = GPIO_FullRemap_USART3 \
.irq = USART3_IRQn, .remap = GPIO_FullRemap_USART3, \
.rx_dma_channel = DMA1_Channel3, .rx_dma_clock = RCC_AHBPeriph_DMA1, \
.rx_dma_irq = DMA1_Channel3_IRQn, .rx_dma_irq_it = DMA1_IT_TC3 \
}
#endif /* MR_CFG_UART3_GROUP */
@@ -224,7 +244,9 @@ extern "C" {
.nstance = UART4, .clock = RCC_APB1Periph_UART4, \
.pio_clock = RCC_APB2Periph_GPIOC, .rx_port = GPIOC, \
.rx_pin = GPIO_Pin_11, .x_port = GPIOC, .tx_pin = GPIO_Pin_10, \
.irq = UART4_IRQn, .remap = 0 \
.irq = UART4_IRQn, .remap = 0, .rx_dma_channel = DMA2_Channel3, \
.rx_dma_clock = RCC_AHBPeriph_DMA2, .rx_dma_irq = DMA2_Channel3_IRQn, \
.rx_dma_irq_it = DMA2_IT_TC3 \
}
#elif (MR_CFG_UART4_GROUP == 2)
#define _DRIVER_UART4_CONFIG \
@@ -232,7 +254,9 @@ extern "C" {
.instance = UART4, .clock = RCC_APB1Periph_UART4, \
.gpio_clock = RCC_APB2Periph_GPIOB, .rx_port = GPIOB, \
.rx_pin = GPIO_Pin_1, .tx_port = GPIOB, .tx_pin = GPIO_Pin_0, \
.irq = UART4_IRQn, .remap = GPIO_PartialRemap_USART4 \
.irq = UART4_IRQn, .remap = GPIO_PartialRemap_USART4, \
.rx_dma_channel = DMA2_Channel3, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel3_IRQn, .rx_dma_irq_it = DMA2_IT_TC3 \
}
#elif (MR_CFG_UART4_GROUP == 3)
#define _DRIVER_UART4_CONFIG \
@@ -240,7 +264,9 @@ extern "C" {
.instance = UART4, .clock = RCC_APB1Periph_UART4, \
.gpio_clock = RCC_APB2Periph_GPIOE, .rx_port = GPIOE, \
.rx_pin = GPIO_Pin_1, .tx_port = GPIOE, .tx_pin = GPIO_Pin_0, \
.irq = UART4_IRQn, .remap = GPIO_FullRemap_USART4 \
.irq = UART4_IRQn, .remap = GPIO_FullRemap_USART4, \
.rx_dma_channel = DMA2_Channel3, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel3_IRQn, .rx_dma_irq_it = DMA2_IT_TC3 \
}
#endif /* MR_CFG_UART4_GROUP */
@@ -250,7 +276,9 @@ extern "C" {
.instance = UART5, .clock = RCC_APB1Periph_UART5, \
.gpio_clock = RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, \
.rx_port = GPIOD, .rx_pin = GPIO_Pin_2, .tx_port = GPIOC, \
.tx_pin = GPIO_Pin_12, .irq = UART5_IRQn, .remap = 0 \
.tx_pin = GPIO_Pin_12, .irq = UART5_IRQn, .remap = 0, \
.rx_dma_channel = DMA2_Channel2, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel2_IRQn, .rx_dma_irq_it = DMA2_IT_TC2 \
}
#elif (MR_CFG_UART5_GROUP == 2)
#define _DRIVER_UART5_CONFIG \
@@ -258,7 +286,9 @@ extern "C" {
.instance = UART5, .clock = RCC_APB1Periph_UART5, \
.gpio_clock = RCC_APB2Periph_GPIOB, .rx_port = GPIOB, \
.rx_pin = GPIO_Pin_5, .tx_port = GPIOB, .tx_pin = GPIO_Pin_4, \
.irq = UART5_IRQn, .remap = GPIO_PartialRemap_USART5 \
.irq = UART5_IRQn, .remap = GPIO_PartialRemap_USART5, \
.rx_dma_channel = DMA2_Channel2, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel2_IRQn, .rx_dma_irq_it = DMA2_IT_TC2 \
}
#elif (MR_CFG_UART5_GROUP == 3)
#define _DRIVER_UART5_CONFIG \
@@ -266,7 +296,9 @@ extern "C" {
.instance = UART5, .clock = RCC_APB1Periph_UART5, \
.gpio_clock = RCC_APB2Periph_GPIOE, .rx_port = GPIOE, \
.rx_pin = GPIO_Pin_9, .tx_port = GPIOE, .tx_pin = GPIO_Pin_8, \
.irq = UART5_IRQn, .remap = GPIO_FullRemap_USART5 \
.irq = UART5_IRQn, .remap = GPIO_FullRemap_USART5, \
.rx_dma_channel = DMA2_Channel2, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel2_IRQn, .rx_dma_irq_it = DMA2_IT_TC2 \
}
#endif /* MR_CFG_UART5_GROUP */
@@ -276,7 +308,9 @@ extern "C" {
.instance = UART6, .clock = RCC_APB1Periph_UART6, \
.gpio_clock = RCC_APB2Periph_GPIOC, .rx_port = GPIOC, \
.rx_pin = GPIO_Pin_1, .tx_port = GPIOC, .tx_pin = GPIO_Pin_0, \
.irq = UART6_IRQn, .remap = 0 \
.irq = UART6_IRQn, .remap = 0, .rx_dma_channel = DMA2_Channel7, \
.rx_dma_clock = RCC_AHBPeriph_DMA2, .rx_dma_irq = DMA2_Channel7_IRQn, \
.rx_dma_irq_it = DMA2_IT_TC7 \
}
#elif (MR_CFG_UART6_GROUP == 2)
#define _DRIVER_UART6_CONFIG \
@@ -284,7 +318,9 @@ extern "C" {
.instance = UART6, .clock = RCC_APB1Periph_UART6, \
.gpio_clock = RCC_APB2Periph_GPIOB, .rx_port = GPIOB, \
.rx_pin = GPIO_Pin_9, .tx_port = GPIOB, .tx_pin = GPIO_Pin_8, \
.irq = UART6_IRQn, .remap = GPIO_PartialRemap_USART6 \
.irq = UART6_IRQn, .remap = GPIO_PartialRemap_USART6, \
.rx_dma_channel = DMA2_Channel7, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel7_IRQn, .rx_dma_irq_it = DMA2_IT_TC7 \
}
#elif (MR_CFG_UART6_GROUP == 3)
#define _DRIVER_UART6_CONFIG \
@@ -292,7 +328,9 @@ extern "C" {
.instance = UART6, .clock = RCC_APB1Periph_UART6, \
.gpio_clock = RCC_APB2Periph_GPIOE, .rx_port = GPIOE, \
.rx_pin = GPIO_Pin_11, .tx_port = GPIOE, .tx_pin = GPIO_Pin_10, \
.irq = UART6_IRQn, .remap = GPIO_FullRemap_USART6 \
.irq = UART6_IRQn, .remap = GPIO_FullRemap_USART6, \
.rx_dma_channel = DMA2_Channel7, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel7_IRQn, .rx_dma_irq_it = DMA2_IT_TC7 \
}
#endif /* MR_CFG_UART6_GROUP */
@@ -302,7 +340,9 @@ extern "C" {
.instance = UART7, .clock = RCC_APB1Periph_UART7, \
.gpio_clock = RCC_APB2Periph_GPIOC, .rx_port = GPIOC, \
.rx_pin = GPIO_Pin_3, .tx_port = GPIOC, .tx_pin = GPIO_Pin_2, \
.irq = UART7_IRQn, .remap = 0 \
.irq = UART7_IRQn, .remap = 0, .rx_dma_channel = DMA2_Channel9, \
.rx_dma_clock = RCC_AHBPeriph_DMA2, .rx_dma_irq = DMA2_Channel9_IRQn, \
.rx_dma_irq_it = DMA2_IT_TC9 \
}
#elif (MR_CFG_UART7_GROUP == 2)
#define _DRIVER_UART7_CONFIG \
@@ -310,7 +350,9 @@ extern "C" {
.instance = UART7, .clock = RCC_APB1Periph_UART7, \
.gpio_clock = RCC_APB2Periph_GPIOA, .rx_port = GPIOA, \
.rx_pin = GPIO_Pin_7, .tx_port = GPIOA, .tx_pin = GPIO_Pin_6, \
.irq = UART7_IRQn, .remap = GPIO_PartialRemap_USART7 \
.irq = UART7_IRQn, .remap = GPIO_PartialRemap_USART7, \
.rx_dma_channel = DMA2_Channel9, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel9_IRQn, .rx_dma_irq_it = DMA2_IT_TC9 \
}
#elif (MR_CFG_UART7_GROUP == 3)
#define _DRIVER_UART7_CONFIG \
@@ -318,7 +360,9 @@ extern "C" {
.instance = UART7, .clock = RCC_APB1Periph_UART7, \
.gpio_clock = RCC_APB2Periph_GPIOE, .rx_port = GPIOE, \
.rx_pin = GPIO_Pin_13, .tx_port = GPIOE, .tx_pin = GPIO_Pin_12, \
.irq = UART7_IRQn, .remap = GPIO_FullRemap_USART7 \
.irq = UART7_IRQn, .remap = GPIO_FullRemap_USART7, \
.rx_dma_channel = DMA2_Channel9, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel9_IRQn, .rx_dma_irq_it = DMA2_IT_TC9 \
}
#endif /* MR_CFG_UART7_GROUP */
@@ -328,7 +372,9 @@ extern "C" {
.instance = UART8, .clock = RCC_APB1Periph_UART8, \
.gpio_clock = RCC_APB2Periph_GPIOC, .rx_port = GPIOC, \
.rx_pin = GPIO_Pin_5, .tx_port = GPIOC, .tx_pin = GPIO_Pin_4, \
.irq = UART8_IRQn, .remap = 0 \
.irq = UART8_IRQn, .remap = 0, .rx_dma_channel = DMA2_Channel11, \
.rx_dma_clock = RCC_AHBPeriph_DMA2, .rx_dma_irq = DMA2_Channel11_IRQn, \
.rx_dma_irq_it = DMA2_IT_TC11 \
}
#elif (MR_CFG_UART8_GROUP == 2)
#define _DRIVER_UART8_CONFIG \
@@ -336,7 +382,9 @@ extern "C" {
.instance = UART8, .clock = RCC_APB1Periph_UART8, \
.gpio_clock = RCC_APB2Periph_GPIOA, .rx_port = GPIOA, \
.rx_pin = GPIO_Pin_15, .tx_port = GPIOA, .tx_pin = GPIO_Pin_14, \
.irq = UART8_IRQn, .remap = GPIO_PartialRemap_USART8 \
.irq = UART8_IRQn, .remap = GPIO_PartialRemap_USART8, \
.rx_dma_channel = DMA2_Channel11, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel11_IRQn, .rx_dma_irq_it = DMA2_IT_TC11 \
}
#elif (MR_CFG_UART8_GROUP == 3)
#define _DRIVER_UART8_CONFIG \
@@ -344,7 +392,9 @@ extern "C" {
.instance = UART8, .clock = RCC_APB1Periph_UART8, \
.gpio_clock = RCC_APB2Periph_GPIOE, .rx_port = GPIOE, \
.rx_pin = GPIO_Pin_15, .tx_port = GPIOE, .tx_pin = GPIO_Pin_14, \
.irq = UART8_IRQn, .remap = GPIO_FullRemap_USART8 \
.irq = UART8_IRQn, .remap = GPIO_FullRemap_USART8, \
.rx_dma_channel = DMA2_Channel11, .rx_dma_clock = RCC_AHBPeriph_DMA2, \
.rx_dma_irq = DMA2_Channel11_IRQn, .rx_dma_irq_it = DMA2_IT_TC11 \
}
#endif /* MR_CFG_UART8_GROUP */

View File

@@ -1,4 +1,4 @@
menu "ADC driver configure"
menu "Adc driver configure"
# Use ADC
if MR_USE_ADC
# ADC1

View File

@@ -9,7 +9,7 @@
#ifndef _MR_ADC_DRIVER_H_
#define _MR_ADC_DRIVER_H_
#include "../mr-library/device/include/mr_adc.h"
#include "../mr-library/include/device/mr_adc.h"
#include "../mr-library/driver/include/mr_board.h"
#ifdef __cplusplus

View File

@@ -9,7 +9,7 @@
#ifndef _MR_PIN_DRIVER_H_
#define _MR_PIN_DRIVER_H_
#include "../mr-library/device/include/mr_pin.h"
#include "../mr-library/include/device/mr_pin.h"
#include "../mr-library/driver/include/mr_board.h"
#ifdef __cplusplus

View File

@@ -9,7 +9,7 @@
#ifndef _MR_SERIAL_DRIVER_H_
#define _MR_SERIAL_DRIVER_H_
#include "../mr-library/device/include/mr_serial.h"
#include "../mr-library/include/device/mr_serial.h"
#include "../mr-library/driver/include/mr_board.h"
#ifdef __cplusplus
@@ -30,6 +30,12 @@ struct mr_serial_driver
uint32_t tx_pin;
IRQn_Type irq;
uint32_t remap;
DMA_Channel_TypeDef *rx_dma_channel;
uint32_t rx_dma_clock;
IRQn_Type rx_dma_irq;
uint32_t rx_dma_irq_it;
size_t rx_dma_count;
};
#endif /* MR_USE_SERIAL */

View File

@@ -1,4 +1,4 @@
menu "UART driver configure"
menu "Uart driver configure"
# Use Serial
if MR_USE_SERIAL
# UART1
@@ -13,6 +13,10 @@ menu "UART driver configure"
int "Uart1 group"
default 1
range 1 4
config MR_USE_UART1_DMA
bool "Use uart1 dma"
default n
endmenu
# UART2
@@ -27,6 +31,10 @@ menu "UART driver configure"
int "Uart2 group"
default 1
range 1 2
config MR_USE_UART2_DMA
bool "Use uart2 dma"
default n
endmenu
# UART3
@@ -41,6 +49,10 @@ menu "UART driver configure"
int "Uart3 group"
default 1
range 1 4
config MR_USE_UART3_DMA
bool "Use uart3 dma"
default n
endmenu
# UART4
@@ -55,6 +67,10 @@ menu "UART driver configure"
int "Uart4 group"
default 1
range 1 3
config MR_USE_UART4_DMA
bool "Use uart4 dma"
default n
endmenu
# UART5
@@ -69,6 +85,10 @@ menu "UART driver configure"
int "Uart5 group"
default 1
range 1 3
config MR_USE_UART5_DMA
bool "Use uart5 dma"
default n
endmenu
# UART6
@@ -83,6 +103,10 @@ menu "UART driver configure"
int "Uart6 group"
default 1
range 1 3
config MR_USE_UART6_DMA
bool "Use uart6 dma"
default n
endmenu
# UART7
@@ -97,6 +121,10 @@ menu "UART driver configure"
int "Uart7 group"
default 1
range 1 3
config MR_USE_UART7_DMA
bool "Use uart7 dma"
default n
endmenu
# UART8
@@ -111,6 +139,10 @@ menu "UART driver configure"
int "Uart8 group"
default 1
range 1 3
config MR_USE_UART8_DMA
bool "Use uart8 dma"
default n
endmenu
endif

View File

@@ -244,7 +244,7 @@ static int serial_driver_configure(struct mr_driver *driver, bool enable,
USART_Init(serial->instance, &USART_InitStructure);
USART_Cmd(serial->instance, enable);
USART_ClearFlag(serial->instance, USART_FLAG_RXNE);
USART_ClearFlag(serial->instance, USART_FLAG_TC);
USART_ClearFlag(serial->instance, USART_FLAG_TXE);
/* Configure NVIC */
NVIC_InitStructure.NVIC_IRQChannel = serial->irq;
@@ -285,8 +285,7 @@ static int serial_driver_send(struct mr_driver *driver, uint8_t data)
size_t i = 0;
/* Write data to register */
USART_SendData(serial->instance, data);
while (USART_GetFlagStatus(serial->instance, USART_FLAG_TC) == RESET)
while (USART_GetFlagStatus(serial->instance, USART_FLAG_TXE) == RESET)
{
i++;
if (i > UINT16_MAX)
@@ -294,6 +293,7 @@ static int serial_driver_send(struct mr_driver *driver, uint8_t data)
return MR_ETIMEOUT;
}
}
USART_SendData(serial->instance, data);
return MR_EOK;
}
@@ -308,6 +308,58 @@ static int serial_driver_send_int_configure(struct mr_driver *driver,
return MR_EOK;
}
static int serial_driver_receive_dma(struct mr_driver *driver, bool enable,
void *buf, size_t count)
{
struct mr_serial_driver *serial = (struct mr_serial_driver *)driver;
DMA_InitTypeDef DMA_InitStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure = {0};
/* Configure clock */
RCC_AHBPeriphClockCmd(serial->rx_dma_clock, ENABLE);
/* Configure NVIC */
NVIC_InitStructure.NVIC_IRQChannel = serial->rx_dma_irq;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = enable;
NVIC_Init(&NVIC_InitStructure);
USART_ClearITPendingBit(serial->instance, USART_IT_RXNE);
USART_ITConfig(serial->instance, USART_IT_RXNE, !enable);
USART_ITConfig(serial->instance, USART_IT_IDLE, enable);
DMA_ClearITPendingBit(serial->rx_dma_irq_it);
DMA_ITConfig(serial->rx_dma_channel, DMA_IT_TC, enable);
if (enable == true)
{
USART_DMACmd(serial->instance, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(serial->rx_dma_channel, DISABLE);
serial->rx_dma_count = count;
DMA_InitStructure.DMA_PeripheralBaseAddr =
(uint32_t)(&serial->instance->DATAR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = count;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(serial->rx_dma_channel, &DMA_InitStructure);
DMA_Cmd(serial->rx_dma_channel, ENABLE);
USART_DMACmd(serial->instance, USART_DMAReq_Rx, ENABLE);
} else
{
USART_DMACmd(serial->instance, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(serial->rx_dma_channel, DISABLE);
}
return MR_EOK;
}
MR_INLINE void serial_device_isr(struct mr_serial *serial)
{
struct mr_device *device = (struct mr_device *)serial;
@@ -319,12 +371,30 @@ MR_INLINE void serial_device_isr(struct mr_serial *serial)
mr_device_isr(device, MR_EVENT_SERIAL_RD_COMPLETE_INT, NULL);
USART_ClearITPendingBit(_serial->instance, USART_IT_RXNE);
}
if (USART_GetITStatus(_serial->instance, USART_IT_TXE) != RESET)
{
mr_device_isr(device, MR_EVENT_SERIAL_WR_COMPLETE_INT, NULL);
USART_ClearITPendingBit(_serial->instance, USART_IT_TXE);
}
if (USART_GetITStatus(_serial->instance, USART_IT_IDLE) != RESET)
{
size_t count = _serial->rx_dma_count -
DMA_GetCurrDataCounter(_serial->rx_dma_channel);
mr_device_isr(device, MR_EVENT_SERIAL_RD_COMPLETE_DMA, &count);
/* Clear IDLE */
_serial->instance->STATR;
_serial->instance->DATAR;
}
if (DMA_GetITStatus(_serial->rx_dma_irq_it) != RESET)
{
size_t count = _serial->rx_dma_count -
DMA_GetCurrDataCounter(_serial->rx_dma_channel);
mr_device_isr(device, MR_EVENT_SERIAL_RD_COMPLETE_DMA, &count);
DMA_ClearITPendingBit(_serial->rx_dma_irq_it);
}
}
#ifdef MR_USE_UART1
@@ -333,6 +403,14 @@ void USART1_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART1_INDEX]);
}
#ifdef MR_USE_UART1_DMA
void DMA1_Channel5_IRQHandler(void)
__attribute__((interrupt("WCH-Interrupt-fast")));
void DMA1_Channel5_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART1_INDEX]);
}
#endif /* MR_USE_UART1_DMA */
#endif /* MR_USE_UART1 */
#ifdef MR_USE_UART2
@@ -341,6 +419,14 @@ void USART2_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART2_INDEX]);
}
#ifdef MR_USE_UART2_DMA
void DMA1_Channel6_IRQHandler(void)
__attribute__((interrupt("WCH-Interrupt-fast")));
void DMA1_Channel6_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART2_INDEX]);
}
#endif /* MR_USE_UART2_DMA */
#endif /* MR_USE_UART2 */
#ifdef MR_USE_UART3
@@ -349,6 +435,14 @@ void USART3_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART3_INDEX]);
}
#ifdef MR_USE_UART3_DMA
void DMA1_Channel3_IRQHandler(void)
__attribute__((interrupt("WCH-Interrupt-fast")));
void DMA1_Channel3_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART3_INDEX]);
}
#endif /* MR_USE_UART3_DMA */
#endif /* MR_USE_UART3 */
#ifdef MR_USE_UART4
@@ -357,6 +451,14 @@ void UART4_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART4_INDEX]);
}
#ifdef MR_USE_UART4_DMA
void DMA2_Channel3_IRQHandler(void)
__attribute__((interrupt("WCH-Interrupt-fast")));
void DMA2_Channel3_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART4_INDEX]);
}
#endif /* MR_USE_UART4_DMA */
#endif /* MR_USE_UART4 */
#ifdef MR_USE_UART5
@@ -365,6 +467,14 @@ void UART5_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART5_INDEX]);
}
#ifdef MR_USE_UART5_DMA
void DMA2_Channel2_IRQHandler(void)
__attribute__((interrupt("WCH-Interrupt-fast")));
void DMA2_Channel2_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART5_INDEX]);
}
#endif /* MR_USE_UART5_DMA */
#endif /* MR_USE_UART5 */
#ifdef MR_USE_UART6
@@ -373,6 +483,14 @@ void UART6_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART6_INDEX]);
}
#ifdef MR_USE_UART6_DMA
void DMA2_Channel7_IRQHandler(void)
__attribute__((interrupt("WCH-Interrupt-fast")));
void DMA2_Channel7_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART6_INDEX]);
}
#endif /* MR_USE_UART6_DMA */
#endif /* MR_USE_UART6 */
#ifdef MR_USE_UART7
@@ -381,6 +499,14 @@ void UART7_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART7_INDEX]);
}
#ifdef MR_USE_UART7_DMA
void DMA2_Channel9_IRQHandler(void)
__attribute__((interrupt("WCH-Interrupt-fast")));
void DMA2_Channel9_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART7_INDEX]);
}
#endif /* MR_USE_UART7_DMA */
#endif /* MR_USE_UART7 */
#ifdef MR_USE_UART8
@@ -389,6 +515,14 @@ void UART8_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART8_INDEX]);
}
#ifdef MR_USE_UART8_DMA
void DMA2_Channel11_IRQHandler(void)
__attribute__((interrupt("WCH-Interrupt-fast")));
void DMA2_Channel11_IRQHandler(void)
{
serial_device_isr(&_serial_device[_DRIVER_UART8_INDEX]);
}
#endif /* MR_USE_UART8_DMA */
#endif /* MR_USE_UART8 */
static void serial_driver_init(void)
@@ -397,7 +531,8 @@ static void serial_driver_init(void)
.configure = serial_driver_configure,
.receive = serial_driver_receive,
.send = serial_driver_send,
.send_int_configure = serial_driver_send_int_configure};
.send_int_configure = serial_driver_send_int_configure,
.receive_dma = serial_driver_receive_dma};
for (size_t i = 0; i < MR_ARRAY_NUM(_serial_device); i++)
{

View File

@@ -1,4 +1,4 @@
menu "ADC configure"
menu "Adc configure"
config MR_USE_ADC
bool "Use adc"
default y

View File

@@ -6,7 +6,7 @@
* @date 2023-11-06 MacRsh First version
*/
#include "../mr-library/device/include/mr_adc.h"
#include "../mr-library/include/device/mr_adc.h"
#ifdef MR_USE_ADC

View File

@@ -1,4 +1,4 @@
menu "PIN configure"
menu "Pin configure"
config MR_USE_PIN
bool "Use pin"
default y

View File

@@ -6,7 +6,7 @@
* @date 2023-11-08 MacRsh First version
*/
#include "../mr-library/device/include/mr_pin.h"
#include "../mr-library/include/device/mr_pin.h"
#ifdef MR_USE_PIN

View File

@@ -8,44 +8,44 @@ menu "Serial configure"
# RD-FIFO
config MR_CFG_SERIAL_RD_FIFO_SIZE
depends on MR_USE_SERIAL
int "Serial read FIFO size"
int "Serial read fifo size"
range 0 2147483647
default 64
default 128
help
"This option sets the size of the read FIFO."
"This option sets the size of the read fifo."
# WR-FIFO
config MR_CFG_SERIAL_WR_FIFO_SIZE
depends on MR_USE_SERIAL
int "Serial write FIFO size"
int "Serial write fifo size"
range 0 2147483647
default 0
help
"This option sets the size of the write FIFO."
"This option sets the size of the write fifo."
# DMA
config MR_USE_SERIAL_DMA
depends on MR_USE_SERIAL
bool "Use serial DMA"
bool "Use serial dma"
default n
help
"Use this option allows for the use of serial DMA."
"Use this option allows for the use of serial dma."
# DMA RD-FIFO
config MR_CFG_SERIAL_RD_DMA_FIFO_SIZE
depends on MR_USE_SERIAL_DMA
int "Serial read DMA FIFO size"
int "Serial read dma fifo size"
range 0 2147483647
default 128
help
"This option sets the size of the read DMA FIFO."
"This option sets the size of the read dma fifo."
# DMA WR-FIFO
config MR_CFG_SERIAL_WR_DMA_FIFO_SIZE
depends on MR_USE_SERIAL_DMA
int "Serial write DMA FIFO size"
int "Serial write dma fifo size"
range 0 2147483647
default 128
help
"This option sets the size of the write DMA FIFO."
"This option sets the size of the write dma fifo."
endmenu

View File

@@ -7,14 +7,14 @@
* @date 2024-05-08 MacRsh Added support for DMA
*/
#include "../mr-library/device/include/mr_serial.h"
#include "../mr-library/include/device/mr_serial.h"
#ifdef MR_USE_SERIAL
#define _SERIAL_STATE_SEND_INT (0x01)
#define _SERIAL_STATE_RECEIVE_DMA (0x02 << 8)
#define _SERIAL_STATE_RECEIVE_DMA_TOP (0x04 << 8)
#define _SERIAL_STATE_RECEIVE_DMA_BOT (0x08 << 8)
#define _SERIAL_STATE_SEND_INT (0x01) /**< Send interrupt */
#define _SERIAL_STATE_RECEIVE_DMA (0x02 << 8) /**< Receive DMA */
#define _SERIAL_STATE_RECEIVE_DMA_TOP (0x04 << 8) /**< Receive DMA top */
#define _SERIAL_STATE_RECEIVE_DMA_BOT (0x08 << 8) /**< Receive DMA bot */
MR_INLINE ssize_t _serial_read_poll(struct mr_serial *serial, uint8_t *buf,
size_t count)
@@ -546,10 +546,10 @@ int mr_serial_register(struct mr_serial *serial, const char *path,
mr_fifo_init(&serial->rfifo, NULL, 0);
mr_fifo_init(&serial->wfifo, NULL, 0);
#ifndef MR_CFG_SERIAL_RD_FIFO_SIZE
#define MR_CFG_SERIAL_RD_FIFO_SIZE (64)
#define MR_CFG_SERIAL_RD_FIFO_SIZE (128)
#endif /* MR_CFG_SERIAL_RD_FIFO_SIZE */
#ifndef MR_CFG_SERIAL_WR_FIFO_SIZE
#define MR_CFG_SERIAL_WR_FIFO_SIZE (0)
#define MR_CFG_SERIAL_WR_FIFO_SIZE (0)
#endif /* MR_CFG_SERIAL_WR_FIFO_SIZE */
serial->rfifo_size = MR_CFG_SERIAL_RD_FIFO_SIZE;
serial->wfifo_size = MR_CFG_SERIAL_WR_FIFO_SIZE;

View File

@@ -6,7 +6,7 @@
* @date 2023-11-01 MacRsh First version
*/
#include "../mr-library/device/include/mr_spi.h"
#include "../mr-library/include/device/mr_spi.h"
#ifdef MR_USE_SPI

View File

@@ -93,7 +93,7 @@ void mr_fifo_reset(struct mr_fifo *fifo);
int mr_fifo_allocate(struct mr_fifo *fifo, size_t size);
void mr_fifo_free(struct mr_fifo *fifo);
size_t mr_fifo_used_get(const struct mr_fifo *fifo);
size_t mr_fifo_space_get(const struct mr_fifo *fifo);
size_t mr_fifo_free_get(const struct mr_fifo *fifo);
size_t mr_fifo_size_get(const struct mr_fifo *fifo);
size_t mr_fifo_peek(const struct mr_fifo *fifo, void *_buf, size_t count);
size_t mr_fifo_discard(struct mr_fifo *fifo, size_t count);