/**
******************************************************************************
* @file usart.c
* @author kit7828
* @version V1.0
* @date 2018-04-09
* @brief 多usart应用
******************************************************************************
* @attention
*
* 平台: STM32 103RCT6 最小系统板
* 用途: 多串口应用,均使用DMA通道传输,避免中断影响串口数据
* 说明: GA6,MP3,DEBUG以及GPS等
* 说明: 串口的核心功能是对接收内容的处理,发送比较简单,只需处理缓存区就可
*
******************************************************************************
*
* main.c中调用方法
* uart1_init(115200); //GA6
* uart2_init(115200); //DEBUG
* uart3_init(115200); //MP3
* uart4_init(115200); //TEST
*
* DMA_Configuration();
*/
//#include "sys.h"
#include <stm32f10x.h>
#include "usart.h"
//#include "led.h"
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#define USART1_TX_DMA_Channel DMA1_Channel4
#define USART1_RX_DMA_Channel DMA1_Channel5
#define USART2_TX_DMA_Channel DMA1_Channel7
#define USART2_RX_DMA_Channel DMA1_Channel6
#define USART3_TX_DMA_Channel DMA1_Channel2
#define USART3_RX_DMA_Channel DMA1_Channel3
#define UART4_TX_DMA_Channel DMA2_Channel5
#define UART4_RX_DMA_Channel DMA2_Channel3
//////////////////////////////////////////////////////////////////////////////////
#define BUFFSIZE 192
u8 USART1_SEND_DATA[BUFFSIZE];
u8 USART1_RECEIVE_DATA[BUFFSIZE];
u8 USART2_SEND_DATA[BUFFSIZE];
u8 USART2_RECEIVE_DATA[BUFFSIZE];
u8 USART3_SEND_DATA[BUFFSIZE];
u8 USART3_RECEIVE_DATA[BUFFSIZE];
u8 UART4_SEND_DATA[BUFFSIZE];
u8 UART4_RECEIVE_DATA[BUFFSIZE];
u8 USART1_TX_Finish=1;
u8 USART2_TX_Finish=1;
u8 USART3_TX_Finish=1;
u8 UART4_TX_Finish =1;
//串口之间可以自由切换,只需更改如下define中的内容
#define DEBUG_UART USART2
#define TEST_TX_Finish USART3_TX_Finish
#define TEST_USART_SEND USART3_SEND_DATA
#define TEST_TX_DMA_Channel USART3_TX_DMA_Channel
#define USART3_Recv TEST_Recv
#define SOUND_TX_Finish UART4_TX_Finish
#define SOUND_USART_SEND UART4_SEND_DATA
#define SOUND_TX_DMA_Channel UART4_TX_DMA_Channel
#define UART4_Recv SOUND_Recv
#define GPRS_TX_Finish USART1_TX_Finish
#define GPRS_USART_SEND USART1_SEND_DATA
#define GPRS_TX_DMA_Channel USART1_TX_DMA_Channel
#define USART1_Recv GPRS_Recv
#define DEBUG_TX_Finish USART2_TX_Finish
#define DEBUG_USART_SEND USART2_SEND_DATA
#define DEBUG_TX_DMA_Channel USART2_TX_DMA_Channel
#define USART2_Recv DEBUG_Recv
//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
/// 重定向c库函数printf到USART1
//可以用
// sprintf(StrMsg,"%s","这是测试信息");
//然后
// DEBUG_Send(StrMsg,strlen(StrMsg);
//这样就都通过中断方式进行输出了
//
int fputc(int ch, FILE *f)
{
//unsigned int Buf_len;
/* 发送一个字节数据到USART1 */
USART_SendData(DEBUG_UART, (uint8_t) ch);
while (USART_GetFlagStatus(DEBUG_UART, USART_FLAG_TXE) == RESET);
return (ch);
}
/// 重定向c库函数scanf到USART1
int fgetc(FILE *f)
{
/* 等待串口1输入数据 */
while (USART_GetFlagStatus(DEBUG_UART, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(DEBUG_UART);
}
#endif
///////////////////////////////串口接收函数处理 /////////////////////////////////////
//USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。
//DMA_Cmd(USART1_TX_DMA_Channel, DISABLE); //改变datasize前先要禁止通道工作
//USART1_TX_DMA_Channel->CNDTR=DATA_LEN; //DMA1,传输数据量
//USART1_TX_Finish=0;//DMA传输开始标志量
//DMA_Cmd(USART1_TX_DMA_Channel, ENABLE);
void DEBUG_Recv(u8 * Recv_data, u16 len)
{
//u8 * Ucmd;
int i;
//Ucmd = Recv_data;
//USART_SendData(USART1, ( Ucmd >> 4 ) + 0x30 );
//USART_SendData(USART1, ( Ucmd & 0x0f ) + 0x30 );
if (Recv_data[0] == 0xAA)
{
for(i=0;i<len;i++)
SOUND_USART_SEND[i]=Recv_data[i];
//memcpy(SOUND_USART_SEND,Recv_data,len);
DMA_Cmd(SOUND_TX_DMA_Channel, DISABLE); //改变datasize前先要禁止通道工作
SOUND_TX_DMA_Channel->CNDTR=len; //DMA1,传输数据量
SOUND_TX_Finish=0;//DMA传输开始标志量
DMA_Cmd(SOUND_TX_DMA_Channel, ENABLE);
}
else if((Recv_data[0] == 0x41) && (Recv_data[1] == 0x54))
{
for(i=0;i<len;i++)
GPRS_USART_SEND[i]=Recv_data[i];
//memcpy(GPRS_USART_SEND,Recv_data,len);
DMA_Cmd(GPRS_TX_DMA_Channel, DISABLE); //改变datasize前先要禁止通道工作
GPRS_TX_DMA_Channel->CNDTR=len; //DMA1,传输数据量
GPRS_TX_Finish=0;//DMA传输开始标志量
DMA_Cmd(GPRS_TX_DMA_Channel, ENABLE);
}
else
{
for(i=0;i<len;i++)
TEST_USART_SEND[i]=Recv_data[i];
//memcpy(TEST_USART_SEND,Recv_data,len);
DMA_Cmd(TEST_TX_DMA_Channel, DISABLE); //改变datasize前先要禁止通道工作
TEST_TX_DMA_Channel->CNDTR=len; //DMA1,传输数据量
TEST_TX_Finish=0;//DMA传输开始标志量
DMA_Cmd(TEST_TX_DMA_Channel, ENABLE);
}
//memset(Recv_data,0,len);
for(i=0;i<len;i++)
Recv_data[i] = 0x00;
}
void GPRS_Recv(u8 * Recv_data, u16 len)
{
int i;
for(i=0;i<len;i++)
DEBUG_USART_SEND[i]=Recv_data[i];
//memcpy(DEBUG_USART_SEND,Recv_data,len);
//USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。
//以下由kit7828修改
DMA_Cmd(DEBUG_TX_DMA_Channel, DISABLE); //改变datasize前先要禁止通道工作
DEBUG_TX_DMA_Channel->CNDTR = len; //DMA1,传输数据量,串口1输出
DEBUG_TX_Finish=0;//DMA传输开始标志量
DMA_Cmd(DEBUG_TX_DMA_Channel, ENABLE);
//memset(Recv_data,0,len);
for(i=0;i<len;i++)
Recv_data[i] = 0x00;
}
void SOUND_Recv(u8 * Recv_data, u16 len)
{
int i,j;
u8 Recv_Ch;
for(i=0,j=0;i<len;i++)
{
//USART1_SEND_DATA[i]=USART2_RECEIVE_DATA[i];
//串口2接收到的数据发往串口1输出,并转换为ASCII码输出
Recv_Ch = Recv_data[i] >> 4;
if( Recv_Ch > 0x09)
Recv_Ch += 0x07;
DEBUG_USART_SEND[j++]= Recv_Ch + 0x30;
Recv_Ch = Recv_data[i] & 0x0f;
if( Recv_Ch > 0x09)
Recv_Ch += 0x07;
DEBUG_USART_SEND[j++]=Recv_Ch + 0x30;
DEBUG_USART_SEND[j++] = 0x20;
}
//USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。
DMA_Cmd(DEBUG_TX_DMA_Channel, DISABLE); //改变datasize前先要禁止通道工作
DEBUG_TX_DMA_Channel->CNDTR=j; //DMA1,传输数据量
DEBUG_TX_Finish=0;//DMA传输开始标志量
DMA_Cmd(DEBUG_TX_DMA_Channel, ENABLE);
memset(Recv_data,0,len);
//for(i=0;i<len;i++)
// Recv_data[i] = 0x00;
}
void TEST_Recv(u8 * Recv_data, u16 len)
{
//int i;
//for(i=0;i<len;i++)
// DEBUG_USART_SEND[i]=Recv_data[i];
memcpy(DEBUG_USART_SEND,Recv_data,len);
DMA_Cmd(DEBUG_TX_DMA_Channel, DISABLE); //改变datasize前先要禁止通道工作
DEBUG_TX_DMA_Channel->CNDTR=len; //DMA1,传输数据量
DEBUG_TX_Finish=0;//DMA传输开始标志量
DMA_Cmd(DEBUG_TX_DMA_Channel, ENABLE);
memset(Recv_data,0,len);
//for(i=0;i<len;i++)
// Recv_data[i] = 0x00;
}
///////////////////////////////串口接收函数处理结束//////////////////////////////////
///////////////////////////////串口发送函数处理 /////////////////////////////////////
//USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。
void DEBUG_Send(u8 * Send_data, u16 len)
{
while(DEBUG_TX_Finish==0); //原有数据发送未完成
memcpy(DEBUG_USART_SEND,Send_data,len);
DMA_Cmd(DEBUG_TX_DMA_Channel, DISABLE); //改变datasize前先要禁止通道工作
DEBUG_TX_DMA_Channel->CNDTR=len;
STM32 多串口DMA传输透传带DEBUG输出代码
4星 · 超过85%的资源 需积分: 50 94 浏览量
2018-05-04
17:40:13
上传
评论 8
收藏 6KB RAR 举报
kit7828
- 粉丝: 0
- 资源: 2
最新资源
- 基于springboot+vue实现的在线考试系统+源代码+文档
- RTL8723DS 2022 版本 Linux驱动,android驱动 支持4.0-10x
- 要玩NDS的遊戲,必須要先下載三個bios檔案到你的檔案資料夾
- 各类型数据库4月排名,基于排名网站数据爬虫json结果
- 基于springboot+vue实现的在线考试系统+源代码+文档
- 淮北市杜集区人才补贴+生活补贴
- JAVA-JSP技术文档
- 课内实验02-决策表(共享单车月卡).docx
- 基于【React + Node+SpringBoot】疫情数据查看系统的设计与实现【源码+lw+部署+讲解】
- 基于【React + Node】云课堂系统设计与实现【源码+lw+部署+讲解】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈