Bailuobozhi 2023-02-03 23:08 采纳率: 0%
浏览 23

32的dma进不了中断

我想用DAM中断配合32的串口来实现双缓冲,但是在配置DAM的时候发现竟然总是进入不了中断,

我检查了每个语句,也对照着网上的代码进行了修改,我把他们有的 都放进去了,但是就是不行

后来我检查了我的头文件宏定义,也看了中断函数的定义,似乎都是没什么问题。

只不过!

我发现一个奇怪的事情,在右键头文件的 DMA1_Channel5_IRQHandler 时候会显示没有定义,但是在点击其他的中断函数名字的时候都会跳转到相应的函数所在位置。不知道和这个有关没有,我也没有发现到解决的方法

下面把我的头文件粘给各位

#ifndef _DMA_H
#define _DMA_H
#include "stm32f10x.h"
#include <stdio.h>
#include <USART.h>


// 串口工作参数宏定义
#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
    
#define  DEBUG_USART_TX_GPIO_PORT       GPIOA   
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10
//中断函数
#define  DMA_INT_IRQ                    DMA1_Channel5_IRQn
#define  DMA_IRQHandler                 DMA1_Channel5_IRQHandler
// 串口对应的DMA请求通道
#define  USART_TX_DMA_CHANNEL     DMA1_Channel5
// 外设寄存器地址
#define  USART_DR_ADDRESS        (USART1_BASE+0x04)
// 一次发送的数据量
#define  SENDBUFF_SIZE            5


void DMA_USART_Config(void);
void DMA_Config(void);




#endif

这个是。c文件的内容
#include "DMA.h"

uint8_t SendBuff[SENDBUFF_SIZE]={0};
//extern uint8_t SendBuff[SENDBUFF_SIZE];
/************************************************************

   关于USART的配置,区别在于不用使能中断了

*************************************************************/
void DMA_USART_Config()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    //引脚时钟设置
    DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK,ENABLE);
    //USART时钟设置
    DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK,ENABLE);
    
    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
    
    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = DEBUG_USART_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_HardwareFlowControl = USART_HardwareFlowControl_None;
    // 配置工作模式,收发一起
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    // 完成串口的初始化配置
    USART_Init(DEBUG_USARTx, &USART_InitStructure);    
    
    // 使能串口
    USART_Cmd(DEBUG_USARTx, ENABLE);        
}

/******************************************************************

            DMA的配置,是把内存里的东西放到USART里用串口输出

******************************************************************/
void DMA_Config()
{
    NVIC_InitTypeDef NVIC_InitStructure;
   
    //
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_InitStructure.NVIC_IRQChannel =DMA_INT_IRQ;
    NVIC_Init(&NVIC_InitStructure);        

      DMA_InitTypeDef DMA_InitStructure;
      // 开启DMA时钟
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
      //将DMA的通道1寄存器重设为缺省值
      DMA_DeInit(USART_TX_DMA_CHANNEL);  
        // 设置DMA源地址:串口数据寄存器地址*/
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;                                                                           
        // 内存地址(要传输的变量的指针)
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
        // 方向:从外设到内存
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        // 传输大小    
        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_High; 
        // 禁止内存到内存的传输
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        // 配置DMA通道           
        DMA_Init(USART_TX_DMA_CHANNEL, &DMA_InitStructure);    
    // 使能通道 
    DMA_Cmd(USART_TX_DMA_CHANNEL, ENABLE);        
        //DMA5传输完成中断
        DMA_ITConfig(USART_TX_DMA_CHANNEL, DMA_IT_TC, ENABLE);  
    //使能USART1的接收DMA请求
    USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
        // 使能DMA
        DMA_Cmd (USART_TX_DMA_CHANNEL,ENABLE);
}


void DMA_IRQHandler (void)
{
    printf("getfull");
  LED1_TOGGLE
    if(DMA_GetITStatus(DMA1_IT_TC5)) //通道5传输完成中断TC 还有传输 过半中断HT 错误中断TE 全局中断GL
     {
             
       //DataCounter = DMA_GetCurrDataCounter(DMA1_Channel5);//获取剩余长度,一般都为0,调试用
        DMA_ClearITPendingBit(DMA1_IT_GL5);    //清除全部中断标志

//       //转换可操作BUF
//        if(Free_Buf_No==BUF_NO1)
//        {   
//            DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_DMA_Buf1;
//            DMA_Init(DMA1_Channel5, &DMA_InitStructure);
//            Free_Buf_No=BUF_NO2;
//        }
//        else
//        {
//            DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_DMA_Buf2;
//            DMA_Init(DMA1_Channel5, &DMA_InitStructure);
//            Free_Buf_No=BUF_NO1;
//        }
//        Buf_Ok=TRUE; //有准备好的数据了
     }
}    

这个是中断函数,

感谢各位

我希望能够达到 的效果就是在电脑用串口发送一定量数据后,DAM会进入中断(之后会改变他的目标地址,但这部分我还没写,现在问题就是进入不了中断)

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-02-04 08:56
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 2月3日

悬赏问题

  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。