中级会员
 
- 积分
- 249
- 金钱
- 249
- 注册时间
- 2018-10-17
- 在线时间
- 40 小时
|
1金钱
我想要利用"串口助理",使用DMA把字串讀入
內存之後再立刻使用DMA輸出USART到外設
"利用串口助理ˋ"顯示~~~照理說應該我輸入
一個字串之後會立刻在"串口助理"顯示兩次
但是實際卻是陷入死循環不斷顯示???
ㄑㄧㄥ
void USARTx_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
// 开启DMA时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
// 设置DMA源地址:串口数据寄存器地址*/
DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;
// 内存地址(要传输的变量的指针)
DMA_InitStructure.DMA_MemoryBaseAddr =(u32)SendBuff;
// 方向:从外设到内存
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
// 传输大小
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
// 外设地址不增
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模式,一次或者循环模式
// DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
// 优先级:中
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
// 禁止内存到内存的传输
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
// 配置DMA通道
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
// 使能DMA
DMA_Cmd (DMA1_Channel4,ENABLE);
}
void USARRx_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
// 开启DMA时钟
DMA_DeInit(USART_TX_DMA_CHANNEL);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
// 设置DMA源地址:串口数据寄存器地址*/
DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;
// 内存地址(要传输的变量的指针)
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ReceiveBuff;
// 方向:从外设到内存
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
// 传输大小
DMA_InitStructure.DMA_BufferSize = RECEIVEBUFF_SIZE;
// 外设地址不增
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模式,一次或者循环模式
// DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
// 优先级:中
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
// 禁止内存到内存的传输
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
// 配置DMA通道
DMA_Init(USART_TX_DMA_CHANNEL, &DMA_InitStructure);
// 使能DMA
DMA_Cmd (USART_TX_DMA_CHANNEL,ENABLE);
}
uint8_t t=0;
void USART1_IRQHandler(void) //(DEBUG_USARTx,USART_IT_RXNE)!
{
uint16_t i;
if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET) //重要提醒:这句话是打开串口接受一帧数据中断。每收到一帧数据进入一次中断
{
DMA_Cmd(DMA1_Channel5,DISABLE); //DMA DISABLE
t = DMA_GetCurrDataCounter(DMA1_Channel5); //DMA_GetCurrDataCounter();函数计算出本次的数据接受长度,从而进行数据处理。
Usart_SendArray(USART1,ReceiveBuff,RECEIVEBUFF_SIZE-t); // 發送字串陣列 = SENDBUFF_SIZE - Ê£Óàδ´«ÊäµÄÊý¾ÝÊýÁ¿£©
DMA_SetCurrDataCounter(DMA1_Channel5,RECEIVEBUFF_SIZE); //設置數據長度
DMA_Cmd(DMA1_Channel5,ENABLE); //啟動DMA Channel5
USART_ReceiveData(USART1); //USART接收數據
USART_ClearFlag(USART1,USART_FLAG_IDLE); //清除標誌位
for(i=0;i<RECEIVEBUFF_SIZE-t;i++)
{
SendBuff=ReceiveBuff;
}
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //始能串口1 TX
MYDMA_Enable(DMA1_Channel4);//開始串口1DMA發送 TX
}
}
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_Cmd(DMA_CHx, DISABLE ); //关闭USART1 TX DMA1 所指示的通道
DMA_SetCurrDataCounter(DMA_CHx,SENDBUFF_SIZE);//DMA通道的DMA缓存的大小
DMA_Cmd(DMA_CHx, ENABLE); //使能USART1 TX DMA1 所指示的通道
}
|
|