初级会员

- 积分
- 55
- 金钱
- 55
- 注册时间
- 2014-2-20
- 在线时间
- 2 小时
|
5金钱
我用DMA2通道采集ADC数据,用DMA4用串口发数据,但是现在中断要么只进2通道要么只进4通道,有人知道为什么吗?
DMA配置如下
GPIO_InitTypeDef GPIO_InitStructure;
#ifdef SPI_1298
SPI_InitTypeDef SPI_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 启动 SPI1 的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/* 启动 DMA 的时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
SPI_Cmd(SPI1, DISABLE);
// 设置 SPI1 的CLK、MOSI引脚为推拉式输出模式 PA5 PA7
GPIO_InitStructure.GPIO_Pin = GPIO_ADS_SCLK | GPIO_ADS_DIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//SPI1 MISO PA6
GPIO_InitStructure.GPIO_Pin = GPIO_ADS_DOUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//SPI1 CS -- PA4
GPIO_InitStructure.GPIO_Pin = GPIO_ADS_CS;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
#ifdef DMA_MODE
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* SPI_SLAVE_Rx_DMA_Channel configuration ---------------------------------------------*/
DMA_DeInit(DMA1_Channel2);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI_MASTER_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)g_nRecBuf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 27;
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_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);
DMA_Cmd(DMA1_Channel2,DISABLE);
DMA_DeInit(DMA1_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI_MASTER_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI_MASTER_Buffer_Tx;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 27;
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_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel3, DISABLE);
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel4_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
DMA_DeInit(DMA1_Channel4);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);//(uint32_t)SPI_MASTER_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)g_Sendbuf;//发送
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//传输方向
DMA_InitStructure.DMA_BufferSize = 16;
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_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
DMA_Cmd(DMA1_Channel4, DISABLE);
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx , ENABLE);
//串口1配置如下
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* 启动USART1的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* 设置Tx引脚为推拉输出模式,推拉式输出级既提高电路的负载能力,又提高开关速度 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 设置Rx引脚为浮空输入模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 使能 USART1 中断 */
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 配置 USART1 */
USART_InitStructure.USART_BaudRate = 230400 ;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 数据长度=8位 */
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_Tx | USART_Mode_Rx; /* 允许接收和发送 */
USART_Init(USART1, &USART_InitStructure);
//
// /* 使能接收中断 */
// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
/* 使用DMA方式发送*/
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
/* 使能接收中断 */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
/* 使能USART1 */
USART_Cmd(USART1, ENABLE);
DMA4通道
u32 g_SendIndex = 0;
void DMA1_Channel4_IRQHandler(void)
{
DMA_ClearFlag(DMA1_FLAG_TC4);
DMA_Cmd(DMA1_Channel4,DISABLE);
DMA1_Channel4->CMAR = (uint32_t)g_Sendbuf + (g_SendIndex & 0xFF);//发送
Flag_Uart_Send = 0;
g_SendIndex+=16;
}
DMA2通道
void DMA1_Channel2_IRQHandler(void)
{
// SPI_CS_HIGH;
#ifdef DMA_MODE
static u8 ncnt = 0;
ncnt++;
DMA_Cmd(DMA1_Channel2,DISABLE);
DMA_Cmd(DMA1_Channel3,DISABLE);
DMA_ClearITPendingBit(DMA1_IT_TC2);
DMA_cnt++;
g_bDMAFlag = 1;
if(ncnt >= 2 )
{
ncnt = 0;
if(0x00 == OSSemAccept(str_Sem))
{
OSSemPost(str_Sem);
}
}
#endif
DMA_ClearFlag(DMA1_IT_TC2);
}
|
|