硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4716|回复: 1
收起左侧

[有问必答] 串口USART1  DMA收发

[复制链接]

6

主题

44

回帖

62

积分

初级会员

积分
62
发表于 2017-9-22 16:46:39 | 显示全部楼层 |阅读模式
/ DMA配置:
#include "stm32f4xx.h"
#include "dma.h"
#define BUFFER_SIZE    32
//uint32_t USART1_SEND_DATA[BUFFER_SIZE];
#define DMA_FLAG_TCIF     DMA_FLAG_TCIF0

u8 USART1_SEND_DATA[512];
u8 USART1_RECEIVE_DATA[512];
u8 USART1_TX_Finish;// USART1发送完成标志量

void DMA_Configuration(void)

{
   DMA_InitTypeDef DMA_InitStructure;
     USART_InitTypeDef USART_InitStructure;
     NVIC_InitTypeDef NVIC_InitStructure;
   /* DMA clock enable */
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//DMA2
     //中断优先级配置:
   /* Configure one bit for preemption priority */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
   //Enable DMA Channel4 Interrupt
     NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
   /*Enable DMA Channel5 Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream5_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1024;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
   /* DMA1 Channel4 (triggered by USART1 Tx event) Config */
   DMA_DeInit(DMA2_Stream7);
   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);
   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)USART1_SEND_DATA;
   DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
   DMA_InitStructure.DMA_BufferSize = 0;
   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_InitStructure.DMA_Mode = DMA_Mode_Normal;
   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
   /* 禁用FIFO模式 */   
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;     
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  /* 单次模式 */
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
   DMA_Init(DMA2_Stream7, &DMA_InitStructure);
     /* 清除DMA数据流传输完成标志位 */
  DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF);
  /* 使能DMA数据流,开始DMA数据传输 */
  DMA_Cmd(DMA2_Stream7, ENABLE);
  DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);
   DMA_ITConfig(DMA2_Stream7, DMA_IT_TE, ENABLE);
   /* Enable USART1 DMA TX request */
   USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
  DMA_Cmd(DMA2_Stream7, DISABLE);
  /* DMA1 Channel5 (triggered by USART1 Rx event) Config */
   DMA_DeInit(DMA2_Stream5);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)USART1_RECEIVE_DATA;
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
  DMA_InitStructure.DMA_BufferSize = 1024;
  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_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
// DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  /* 单次模式 */
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_Init(DMA2_Stream5, &DMA_InitStructure);
     /* 清除DMA数据流传输完成标志位 */
  DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF);
  
  /* 使能DMA数据流,开始DMA数据传输 */
  DMA_Cmd(DMA2_Stream5, ENABLE);

  DMA_Init(DMA2_Stream5, &DMA_InitStructure);
  DMA_ITConfig(DMA2_Stream5, DMA_IT_TC, ENABLE);
  DMA_ITConfig(DMA2_Stream5, DMA_IT_TE, ENABLE);
/* Enable USART1 DMA RX request */
   USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
   DMA_Cmd(DMA2_Stream5, ENABLE);
     
}
//DMA1_Channel5中断服务函数
void DMA2_Stream5_IRQHandler(void)
{
   DMA_ClearITPendingBit(DMA2_Stream5,DMA_IT_TCIF5);
   DMA_ClearITPendingBit(DMA2_Stream5,DMA_IT_TEIF5);
   DMA_Cmd(DMA2_Stream5, DISABLE);//关闭DMA,防止处理其间有  数据
  // DMA1_Stream5->CNDTR = 580;//重装填
   DMA_Cmd(DMA2_Stream5, ENABLE);//处理完,重开DMA
}
//DMA1_Channel4中断服务函数
//USART1使用DMA发数据中断服务程序
void DMA2_Stream7_IRQHandler(void)
{
   DMA_ClearITPendingBit(DMA2_Stream7,DMA_IT_TCIF4);
   DMA_ClearITPendingBit(DMA2_Stream7,DMA_IT_TEIF4);
   DMA_Cmd(DMA2_Stream7, DISABLE);//关闭DMA
   USART1_TX_Finish=1;//置DMA传输完成
}
int main(void)
{

    int i=0;
    u8 data[1024];
  u32    a[1024];
    u16 times=0;
    uint32_t ecc;
    uint32_t ulPageNo;
    uint32_t k;
    //NAND_ID* pNandId;
    //NAND_MEMORY_INFO *pNandMemInfo;
    //NAND_ADDRESS WriteReadAddr;
    u8 BufNand[1024];
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);        //延时初始化
    uart_init(115200);    //串口初始化波特率为115200
    NAND_Init();
  DMA_Configuration();
}
怎么我这个DMA初始化函数;我进DMA这个函数单步仿真;函数每步都执行;就是在执行完最后一句;出来后就死掉了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2017-9-23 00:50:49 | 显示全部楼层
可以参考我们V5板子裸机例子基础篇里面的串口DMA搞下:https://forum.anfulai.cn/forum.php?mod=viewthread&tid=1285
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 03:59 , Processed in 0.039748 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表