OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2794|回复: 1

配了一套DMA串口数据收发的程序,但没有效果,有没有大佬帮我看一下!

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-9-9
在线时间
18 小时
发表于 2019-12-28 21:12:08 | 显示全部楼层 |阅读模式
10金钱
贴代码:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"  
#include "dma.h"

#define UPPERRBSIZE 8200
#define UPPERTBSIZE 8200
u8 upperRxBuffer[UPPERRBSIZE];
u8 upperTxBuffer[UPPERRBSIZE];

uint8_t data[4] = {0x01,0x03,0x04,0x06};

void UpperUsart1Init(u32 baudRate)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;       
        DMA_InitTypeDef  DMA_InitStructure;
       
        //开启串口时钟、DMA时钟以及相应GPIO时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
                //串口1对应引脚复用映射
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
        //USART1端口配置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //速度50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
        GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10       
       
        // USART1_DMA_RX DMA2_Stream5 DMA_Channel_4
          DMA_DeInit(DMA2_Stream5);
                while (DMA_GetCmdStatus(DMA2_Stream5) != DISABLE){}//等待DMA可配置
          DMA_InitStructure.DMA_Channel = DMA_Channel_4;
          DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USART1->DR);
          DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&upperRxBuffer;
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
          DMA_InitStructure.DMA_BufferSize = UPPERRBSIZE;
          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_Circular;//如果是Normal只能接受一次,故采用循环模式
                DMA_InitStructure.DMA_Priority = DMA_Priority_High;
                DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
                DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
                DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
                DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
          DMA_Init(DMA2_Stream5, &DMA_InitStructure);
       
        // USART1_DMA_TX DMA2_Stream7 DMA_Channel_4
        DMA_DeInit(DMA2_Stream7);
        while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE){}//等待DMA可配置
  DMA_InitStructure.DMA_Channel = DMA_Channel_4;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(USART1->DR);
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&upperTxBuffer;
        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
        DMA_InitStructure.DMA_BufferSize = UPPERTBSIZE;
        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_Circular;   //DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
        DMA_Init(DMA2_Stream7, &DMA_InitStructure);

        //USART2设置 115200 8 1 0 NONE
        USART_InitStructure.USART_BaudRate = baudRate;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_Init(USART1,&USART_InitStructure);
       
        // Configure one bit for preemption priority
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
          // Enable DMA2_Stream5 Interrupt
          NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
          // Enable DMA2_Stream7 Interrupt
          NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
          // Enable USART2 Interrupt
          NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);       
       
        //开启串口、DMA和串口总线空闲中断
        DMA_Cmd(DMA2_Stream5,ENABLE);
        DMA_Cmd(DMA2_Stream7,DISABLE);
        USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);  
        DMA_ITConfig(DMA2_Stream5, DMA_IT_TC, ENABLE);
        DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);
        DMA_ClearITPendingBit(DMA2_Stream5, DMA_IT_TCIF5); //标志位设置为默认值
        DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);         
        USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
        USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);
        USART_Cmd(USART1, ENABLE);       
}

void DMA2_Stream5_IRQHandler(void)
{
        if(SET == DMA_GetITStatus(DMA2_Stream5, DMA_IT_TCIF5))
        {
                DMA_Cmd(DMA2_Stream5,DISABLE);
                DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5);
                DMA_Cmd(DMA2_Stream5,ENABLE);       
               
                DMA_SetCurrDataCounter(DMA2_Stream7,UPPERTBSIZE);
                printf("AAA");
                memcpy(upperTxBuffer,data,UPPERTBSIZE);               
                DMA_Cmd(DMA2_Stream7,ENABLE);               
        }
}


void DMA2_Stream7_IRQHandler(void) //UART1_TX
{
        if(SET == DMA_GetITStatus(DMA2_Stream7,DMA_IT_TCIF7))
        {
                DMA_Cmd(DMA2_Stream7,DISABLE);
                DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
        }
}

int main()
{
        UpperUsart1Init(115200);
        while(1);
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-9-9
在线时间
18 小时
 楼主| 发表于 2019-12-28 23:29:47 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 21:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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