Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
码匠许师傅
rt-thread
提交
61e1e31c
R
rt-thread
项目概览
码匠许师傅
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
61e1e31c
编写于
9月 22, 2022
作者:
B
BreederBai
提交者:
GitHub
9月 22, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[bsp/stm32] 简化drv_usart中的DMA接收逻辑 (#6357)
上级
50cb4be8
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
56 addition
and
48 deletion
+56
-48
bsp/stm32/libraries/HAL_Drivers/drv_usart.c
bsp/stm32/libraries/HAL_Drivers/drv_usart.c
+51
-47
bsp/stm32/libraries/HAL_Drivers/drv_usart.h
bsp/stm32/libraries/HAL_Drivers/drv_usart.h
+5
-1
未找到文件。
bsp/stm32/libraries/HAL_Drivers/drv_usart.c
浏览文件 @
61e1e31c
...
...
@@ -170,7 +170,7 @@ static rt_err_t stm32_configure(struct rt_serial_device *serial, struct serial_c
#ifdef RT_SERIAL_USING_DMA
if
(
!
(
serial
->
parent
.
open_flag
&
RT_DEVICE_OFLAG_OPEN
))
{
uart
->
dma_rx
.
last_index
=
0
;
uart
->
dma_rx
.
remaining_cnt
=
0
;
}
#endif
...
...
@@ -367,6 +367,53 @@ static rt_size_t stm32_dma_transmit(struct rt_serial_device *serial, rt_uint8_t
return
0
;
}
#ifdef RT_SERIAL_USING_DMA
static
void
dma_recv_isr
(
struct
rt_serial_device
*
serial
,
rt_uint8_t
isr_flag
)
{
struct
stm32_uart
*
uart
;
rt_base_t
level
;
rt_size_t
recv_len
,
counter
;
RT_ASSERT
(
serial
!=
RT_NULL
);
uart
=
rt_container_of
(
serial
,
struct
stm32_uart
,
serial
);
level
=
rt_hw_interrupt_disable
();
recv_len
=
0
;
counter
=
__HAL_DMA_GET_COUNTER
(
&
(
uart
->
dma_rx
.
handle
));
switch
(
isr_flag
)
{
case
UART_RX_DMA_IT_IDLE_FLAG
:
if
(
counter
<=
uart
->
dma_rx
.
remaining_cnt
)
recv_len
=
uart
->
dma_rx
.
remaining_cnt
-
counter
;
else
recv_len
=
serial
->
config
.
bufsz
+
uart
->
dma_rx
.
remaining_cnt
-
counter
;
break
;
case
UART_RX_DMA_IT_HT_FLAG
:
if
(
counter
<
uart
->
dma_rx
.
remaining_cnt
)
recv_len
=
uart
->
dma_rx
.
remaining_cnt
-
counter
;
break
;
case
UART_RX_DMA_IT_TC_FLAG
:
if
(
counter
>=
uart
->
dma_rx
.
remaining_cnt
)
recv_len
=
serial
->
config
.
bufsz
+
uart
->
dma_rx
.
remaining_cnt
-
counter
;
default:
break
;
}
if
(
recv_len
)
{
uart
->
dma_rx
.
remaining_cnt
=
counter
;
rt_hw_serial_isr
(
serial
,
RT_SERIAL_EVENT_RX_DMADONE
|
(
recv_len
<<
8
));
}
rt_hw_interrupt_enable
(
level
);
}
#endif
/**
* Uart common interrupt process. This need add to uart ISR.
*
...
...
@@ -393,16 +440,7 @@ static void uart_isr(struct rt_serial_device *serial)
else
if
((
uart
->
uart_dma_flag
)
&&
(
__HAL_UART_GET_FLAG
(
&
(
uart
->
handle
),
UART_FLAG_IDLE
)
!=
RESET
)
&&
(
__HAL_UART_GET_IT_SOURCE
(
&
(
uart
->
handle
),
UART_IT_IDLE
)
!=
RESET
))
{
level
=
rt_hw_interrupt_disable
();
recv_total_index
=
serial
->
config
.
bufsz
-
__HAL_DMA_GET_COUNTER
(
&
(
uart
->
dma_rx
.
handle
));
recv_len
=
recv_total_index
-
uart
->
dma_rx
.
last_index
;
uart
->
dma_rx
.
last_index
=
recv_total_index
;
rt_hw_interrupt_enable
(
level
);
if
(
recv_len
)
{
rt_hw_serial_isr
(
serial
,
RT_SERIAL_EVENT_RX_DMADONE
|
(
recv_len
<<
8
));
}
dma_recv_isr
(
serial
,
UART_RX_DMA_IT_IDLE_FLAG
);
__HAL_UART_CLEAR_IDLEFLAG
(
&
uart
->
handle
);
}
else
if
(
__HAL_UART_GET_FLAG
(
&
(
uart
->
handle
),
UART_FLAG_TC
)
&&
...
...
@@ -464,40 +502,6 @@ static void uart_isr(struct rt_serial_device *serial)
}
}
#ifdef RT_SERIAL_USING_DMA
static
void
dma_isr
(
struct
rt_serial_device
*
serial
)
{
struct
stm32_uart
*
uart
;
rt_size_t
recv_total_index
,
recv_len
;
rt_base_t
level
;
RT_ASSERT
(
serial
!=
RT_NULL
);
uart
=
rt_container_of
(
serial
,
struct
stm32_uart
,
serial
);
if
((
__HAL_DMA_GET_IT_SOURCE
(
&
(
uart
->
dma_rx
.
handle
),
DMA_IT_TC
)
!=
RESET
)
||
(
__HAL_DMA_GET_IT_SOURCE
(
&
(
uart
->
dma_rx
.
handle
),
DMA_IT_HT
)
!=
RESET
))
{
level
=
rt_hw_interrupt_disable
();
recv_total_index
=
serial
->
config
.
bufsz
-
__HAL_DMA_GET_COUNTER
(
&
(
uart
->
dma_rx
.
handle
));
if
(
recv_total_index
==
0
)
{
recv_len
=
serial
->
config
.
bufsz
-
uart
->
dma_rx
.
last_index
;
}
else
{
recv_len
=
serial
->
config
.
bufsz
-
uart
->
dma_rx
.
last_index
+
recv_total_index
;
}
uart
->
dma_rx
.
last_index
=
recv_total_index
;
rt_hw_interrupt_enable
(
level
);
if
(
recv_len
)
{
rt_hw_serial_isr
(
serial
,
RT_SERIAL_EVENT_RX_DMADONE
|
(
recv_len
<<
8
));
}
}
}
#endif
#if defined(BSP_USING_UART1)
void
USART1_IRQHandler
(
void
)
{
...
...
@@ -1088,7 +1092,7 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
struct
stm32_uart
*
uart
;
RT_ASSERT
(
huart
!=
NULL
);
uart
=
(
struct
stm32_uart
*
)
huart
;
dma_
isr
(
&
uart
->
serial
);
dma_
recv_isr
(
&
uart
->
serial
,
UART_RX_DMA_IT_TC_FLAG
);
}
/**
...
...
@@ -1103,7 +1107,7 @@ void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
struct
stm32_uart
*
uart
;
RT_ASSERT
(
huart
!=
NULL
);
uart
=
(
struct
stm32_uart
*
)
huart
;
dma_
isr
(
&
uart
->
serial
);
dma_
recv_isr
(
&
uart
->
serial
,
UART_RX_DMA_IT_HT_FLAG
);
}
static
void
_dma_tx_complete
(
struct
rt_serial_device
*
serial
)
...
...
bsp/stm32/libraries/HAL_Drivers/drv_usart.h
浏览文件 @
61e1e31c
...
...
@@ -38,6 +38,10 @@ int rt_hw_usart_init(void);
#define UART_INSTANCE_CLEAR_FUNCTION __HAL_UART_CLEAR_IT
#endif
#define UART_RX_DMA_IT_IDLE_FLAG 0x00
#define UART_RX_DMA_IT_HT_FLAG 0x01
#define UART_RX_DMA_IT_TC_FLAG 0x02
/* stm32 config class */
struct
stm32_uart_config
{
...
...
@@ -58,7 +62,7 @@ struct stm32_uart
struct
{
DMA_HandleTypeDef
handle
;
rt_size_t
last_index
;
rt_size_t
remaining_cnt
;
}
dma_rx
;
struct
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录