我想用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会进入中断(之后会改变他的目标地址,但这部分我还没写,现在问题就是进入不了中断)