Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
真的见不到了码
stm32
提交
6b6ea10e
S
stm32
项目概览
真的见不到了码
/
stm32
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
stm32
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6b6ea10e
编写于
6月 12, 2023
作者:
真的见不到了码
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Replace DMA_UART4
上级
956302d2
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
81 addition
and
68 deletion
+81
-68
DMA_UART4
DMA_UART4
+81
-68
未找到文件。
DMA_UART4
浏览文件 @
6b6ea10e
#include <object.h>
#include <object.h>
#define Set4_SEND GPIO_SetBits(GPIOE,GPIO_Pin_6);
#define Set4_RCVE GPIO_ResetBits(GPIOE,GPIO_Pin_6);
char u4_buff[32];
char u4_buff[32];
char test_command[32]="Hello DTU!";
char test_command[32]="Hello DTU!";
char DTU_reply[64];
char DTU_reply[64];
char len_reply=0;
char len_reply=0;
unsigned char u4tx_buf[U4_TXBUF];//
一个2K大一点的数据缓冲区
unsigned char u4tx_buf[U4_TXBUF];//
一个2K大一点的数据缓冲区
u32 dma_index=0;
u32 dma_index=0;
unsigned char sn=0x00;
unsigned char sn=0x00;
u32 command_count=0;
char command_enable=0;
//static char b2_index=0;
//static char b2_index=0;
#define Set4_SEND GPIO_SetBits(GPIOE,GPIO_Pin_6);
#define Set4_RCVE GPIO_ResetBits(GPIOE,GPIO_Pin_6);
void DMA_config()
void DMA_config()
{
{
//
使能DMA外设
//
使能DMA外设
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA
2
, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA
1
, ENABLE);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA
2_Channel3);//串口2的DMA数据通道
DMA_DeInit(DMA
1_Channel6);//串口2的DMA数据通道
//
相应的DMA配置
//
相应的DMA配置
//DMA_DeInit(DMA1_Channel5); //
将DMA的通道5寄存器重设为缺省值 串口2对应的是DMA通道16
//DMA_DeInit(DMA1_Channel5); //
将DMA的通道5寄存器重设为缺省值 串口2对应的是DMA通道
16
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&U
ART4->DR; //DMA外设usart基地址
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&U
SART2->DR; //DMA外设usart基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)u4tx_buf; //DMA
内存基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)u4tx_buf; //DMA
内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //
数据传输方向,从外设读取发送到内存
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //
数据传输方向,从外设读取发送到内存
DMA_InitStructure.DMA_BufferSize = U4_TXBUF; //DMA
通道的DMA缓存的大小
DMA_InitStructure.DMA_BufferSize = U4_TXBUF; //DMA
通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //
外设地址寄存器不变
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //
外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //
内存地址寄存器递增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //
内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //
外设数据宽度为8位
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //
外设数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //
内存数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //
内存数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //
工作在正常缓存模式
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //
工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA_Priority_Medium; //DMA
通道 x拥有中优先级
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA_Priority_Medium; //DMA
通道 x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA
通道x没有设置为内存到内存传输
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA
通道x没有设置为内存到内存传输
DMA_Init(DMA
2_Channel3, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道
DMA_Init(DMA
1_Channel6, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道
USART_DMACmd(U
ART4,USART_DMAReq_Rx,ENABLE); //使能串口1 DMA接收
USART_DMACmd(U
SART2,USART_DMAReq_Rx,ENABLE); //使能串口1 DMA接收
DMA_Cmd(DMA
2_Channel3, ENABLE); //正式驱动DMA传输
DMA_Cmd(DMA
1_Channel6, ENABLE); //正式驱动DMA传输
//DMA_SetCurrDataCounter(DMA1_Stream6, byteLen);
//DMA_SetCurrDataCounter(DMA1_Stream6, byteLen);
}
}
//
重置DMA数据指向
//
重置DMA数据指向
void Reset_DMA()
void Reset_DMA()
{
{
DMA_Cmd(DMA
2_Channel3, DISABLE); //关闭USART1 TX DMA1所指示的通道
DMA_Cmd(DMA
1_Channel6, DISABLE); //关闭USART1 TX DMA1所指示的通道
DMA_SetCurrDataCounter(DMA
2_Channel3, U4_TXBUF);//DMA通道的DMA缓存的大小
DMA_SetCurrDataCounter(DMA
1_Channel6, U4_TXBUF);//DMA通道的DMA缓存的大小
DMA_Cmd(DMA
2_Channel3, ENABLE); //打开USART1 TX DMA1所指示的通道
DMA_Cmd(DMA
1_Channel6, ENABLE); //打开USART1 TX DMA1所指示的通道
}
}
char uart2_init()
char uart2_init()
{
{
...
@@ -46,40 +49,51 @@ char uart2_init()
...
@@ -46,40 +49,51 @@ char uart2_init()
USART_InitTypeDef USART_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/*
打开GPIOA时钟、AFIO时钟,USART2时钟 */
/*
打开GPIOA时钟、AFIO时钟,USART2时钟
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO
C
, ENABLE); // | RCC_APB2Periph_AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO
A
, ENABLE); // | RCC_APB2Periph_AFIO
RCC_APB1PeriphClockCmd(RCC_APB1Periph_U
ART4
,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_U
SART2
,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // | RCC_APB2Periph_AFIO
//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // | RCC_APB2Periph_AFIO
USART_DeInit(U
ART4
);
USART_DeInit(U
SART2
);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
/*
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_Init(GPIOE, &GPIO_InitStructure);
Set4_RCVE
Set4_RCVE
*/
/* UART2 TX PA2 */
/* UART2 TX PA2 */
/*
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_Init(GPIOC, &GPIO_InitStructure);
*/
/* UART2 RX PA3 */
/* UART2 RX PA3 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
/*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO
C
, &GPIO_InitStructure);
GPIO_Init(GPIO
A
, &GPIO_InitStructure);
/* Enable the USART2 Interrupt */
/* Enable the USART2 Interrupt */
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
NVIC_InitStructure.NVIC_IRQChannel = U
ART4_IRQn; //串口中断设置
NVIC_InitStructure.NVIC_IRQChannel = U
SART2_IRQn; //串口中断设置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //
抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //
抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
子优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
子优先级
0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_Init(&NVIC_InitStructure);
/* USART
配置
*/
/* USART
配置
*/
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
...
@@ -87,21 +101,21 @@ char uart2_init()
...
@@ -87,21 +101,21 @@ char uart2_init()
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(U
ART4
, &USART_InitStructure);
USART_Init(U
SART2
, &USART_InitStructure);
/*
使能UART2接收RXNE中断 */
/*
使能UART2接收RXNE中断
*/
USART_ITConfig(U
ART4, USART_IT_IDLE, ENABLE); //接收空闲中断
USART_ITConfig(U
SART2, USART_IT_IDLE, ENABLE); //接收空闲中断
//USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
//USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
/*
使能U
ART2 */
/*
使能
UART2 */
USART_Cmd(U
ART4
, ENABLE);
USART_Cmd(U
SART2
, ENABLE);
/*
清除发送完成标志 */
/*
清除发送完成标志
*/
//USART_ClearFlag(UART4, USART_FLAG_TC);
//USART_ClearFlag(UART4, USART_FLAG_TC);
DMA_config();
DMA_config();
return 0;
return 0;
}
}
void U
ART4
_IRQHandler(void)
void U
SART2
_IRQHandler(void)
{
{
/*if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
/*if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
u2_buff[b2_index]= USART_ReceiveData(USART2);
u2_buff[b2_index]= USART_ReceiveData(USART2);
...
@@ -114,28 +128,28 @@ void UART4_IRQHandler(void)
...
@@ -114,28 +128,28 @@ void UART4_IRQHandler(void)
else
else
b2_index++;*/
b2_index++;*/
if(USART_GetITStatus(U
ART4
, USART_IT_IDLE) != RESET)
if(USART_GetITStatus(U
SART2
, USART_IT_IDLE) != RESET)
{
{
USART_ReceiveData(U
ART4);//清楚中断标志
USART_ReceiveData(U
SART2);//清楚中断标志
unsigned char snr=~sn;
unsigned char snr=~sn;
dma_index=U4_TXBUF-DMA_GetCurrDataCounter(DMA
2_Channel3);//接收的字节个数
dma_index=U4_TXBUF-DMA_GetCurrDataCounter(DMA
1_Channel6);//接收的字节个数
//
判断是否检测的指令标志
//
判断是否检测的指令标志
if(u4tx_buf[0]=='$' && u4tx_buf[
1]<128
)
if(u4tx_buf[0]=='$' && u4tx_buf[
dma_index-1]=='#'
)
{
{
RS485_Send_Data(u4tx_buf,dma_index);
RS485_Send_Data(u4tx_buf,dma_index);
Reset_DMA();//
复位DMA指针
Reset_DMA();//
复位DMA指针
sn=0x00;
sn=0x00;
}//
否则是检测到数据包开头,数据包开头不会有$
}//
否则是检测到数据包开头,数据包开头不会有
$
else if(u4tx_buf[0]==sn && u4tx_buf[1]==snr) //
一次发送数据包大小为2052,如果小于2052认为数据丢失
else if(u4tx_buf[0]==sn && u4tx_buf[1]==snr) //
一次发送数据包大小为2052,如果小于2052认为数据丢失
{
{
if(dma_index==2052)
if(dma_index==2052)
{
{
RS485_Send_Data(u4tx_buf,dma_index);
RS485_Send_Data(u4tx_buf,dma_index);
Reset_DMA();//
复位DMA指针
Reset_DMA();//
复位DMA指针
sn+=1;
sn+=1;
}
}
else
else
USART_ClearITPendingBit(U
ART4,USART_IT_IDLE); //清除中断标志
USART_ClearITPendingBit(U
SART2,USART_IT_IDLE); //清除中断标志
}
}
/* else if(u2tx_buf[0]==sn && u2tx_buf[1]==~sn && dma_index!=2052)
/* else if(u2tx_buf[0]==sn && u2tx_buf[1]==~sn && dma_index!=2052)
{
{
...
@@ -146,13 +160,13 @@ void UART4_IRQHandler(void)
...
@@ -146,13 +160,13 @@ void UART4_IRQHandler(void)
i--;
i--;
}
}
DTU_send_char(str);
DTU_send_char(str);
Reset_DMA();//
复位DMA指针
Reset_DMA();//
复位DMA指针
} */
} */
else
else
Reset_DMA();//
复位DMA指针
Reset_DMA();//
复位DMA指针
}
}
USART_ClearITPendingBit(U
ART4,USART_IT_IDLE); //清除中断标志
USART_ClearITPendingBit(U
SART2,USART_IT_IDLE); //清除中断标志
}
}
void DTU_send_char(char * str,u32 len)
void DTU_send_char(char * str,u32 len)
...
@@ -164,19 +178,18 @@ void DTU_send_char(char * str,u32 len)
...
@@ -164,19 +178,18 @@ void DTU_send_char(char * str,u32 len)
while(USART_GetFlagStatus(UART4, USART_FLAG_TC)==RESET);
while(USART_GetFlagStatus(UART4, USART_FLAG_TC)==RESET);
}*/
}*/
u32 t;
u32 t;
Set4_SEND
//
Set4_SEND
for(t=0;t<len;t++)
for(t=0;t<len;t++)
{
{
while(USART_GetFlagStatus(U
ART4
, USART_FLAG_TC) == RESET);
while(USART_GetFlagStatus(U
SART2
, USART_FLAG_TC) == RESET);
USART_SendData(U
ART4
,str[t]);
USART_SendData(U
SART2
,str[t]);
}
}
while(USART_GetFlagStatus(U
ART4
, USART_FLAG_TC) == RESET);
while(USART_GetFlagStatus(U
SART2
, USART_FLAG_TC) == RESET);
Set4_RCVE;
//
Set4_RCVE;
}
}
void DTU_SendByte(unsigned char SendData)
void DTU_SendByte(unsigned char SendData)
{
{
USART_SendData(U
ART4
,SendData);
USART_SendData(U
SART2
,SendData);
while(USART_GetFlagStatus(U
ART4
, USART_FLAG_TXE) == RESET);
while(USART_GetFlagStatus(U
SART2
, USART_FLAG_TXE) == RESET);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录