uart_dma.c
2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "uart_dma.h"
#include "my_ringbuff.h"
#include "string.h"
#include "dma.h"
#include "stdio.h"
#include "ildaFile.h"
#include "dataParsing.h"
#define DMA_DATA_LENTH_MAX (1024*5)
uint8_t RecDmaBuff[DMA_DATA_LENTH_MAX] = {0};
uint8_t SendDmaBuf[512] = {0};
//串口 DMA 初始化
void UartDMA_Init(void)
{
//设置接收
LL_DMA_SetMemoryAddress(DMA2,LL_DMA_STREAM_2,(uint32_t)RecDmaBuff);
LL_DMA_SetPeriphAddress(DMA2,LL_DMA_STREAM_2,LL_USART_DMA_GetRegAddr(USART1));
LL_DMA_SetDataLength(DMA2,LL_DMA_STREAM_2,DMA_DATA_LENTH_MAX);
//设置发送
LL_DMA_SetMemoryAddress(DMA2,LL_DMA_STREAM_7,(uint32_t)SendDmaBuf);
LL_DMA_SetPeriphAddress(DMA2,LL_DMA_STREAM_7,LL_USART_DMA_GetRegAddr(USART1));
LL_DMA_SetDataLength(DMA2,LL_DMA_STREAM_7,0);
LL_USART_EnableIT_IDLE(USART1);
LL_USART_EnableDMAReq_RX(USART1);
LL_USART_EnableDMAReq_TX(USART1);
LL_DMA_EnableStream(DMA2,LL_DMA_STREAM_2);
LL_DMA_EnableStream(DMA2,LL_DMA_STREAM_7);
}
uint16_t testLen = 0;
uint32_t count = 0;
//串口接收
int8_t UartIDLE_Recive_Data(void)
{
LL_DMA_DisableStream(DMA2,LL_DMA_STREAM_2);
//清除接收空闲中断标志
LL_USART_ClearFlag_IDLE(USART1);
LL_DMA_ClearFlag_TC2(DMA2);
//接收到一帧数据后 电平翻转,
LL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
testLen = DMA_DATA_LENTH_MAX - LL_DMA_GetDataLength(DMA2,LL_DMA_STREAM_2);
//将实际接收到的数据入队
ringBufWrite(Uart1RingBufHandle,(char*)RecDmaBuff,testLen);
// memcpy(IldaFileBuf+count,RecDmaBuff,testLen);
count+=testLen;
// ringBufWrite(Uart1RingBufHandle,RecDmaBuff,testLen);
// printf("%d %d %d\r\n",testLen,count,strlen((char*)IldaFileBuf));
//LL_DMA_IsActiveFlag_HT2(DMA2); //dma半满中断
//LL_DMA_IsActiveFlag_TC2(DMA2); //dma传输完成中断
LL_DMA_SetDataLength(DMA2,LL_DMA_STREAM_2,DMA_DATA_LENTH_MAX);
//使能
LL_DMA_EnableStream(DMA2,LL_DMA_STREAM_2);
return 0;
}
//串口发送
int8_t Uart_DMA_Send(uint8_t* data,uint16_t size)
{
if(LL_USART_IsActiveFlag_TC(USART1))
{
LL_DMA_ClearFlag_TC7(DMA2);
memcpy(SendDmaBuf,data,size);
LL_DMA_DisableStream(DMA2,LL_DMA_STREAM_7);
LL_DMA_SetDataLength(DMA2,LL_DMA_STREAM_7,size);
LL_DMA_EnableStream(DMA2,LL_DMA_STREAM_7);
}
return 0;
}