OpenEdv-开源电子网

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

请问为什么我的中断现在只能进一个

[复制链接]

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-2-20
在线时间
2 小时
发表于 2015-11-23 08:01:39 | 显示全部楼层 |阅读模式
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);
}

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

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-9-1
在线时间
29 小时
发表于 2015-11-23 16:07:54 | 显示全部楼层
DMA_Priority_VeryHigh;都是一样的,哪个来就传哪个啊
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-2-20
在线时间
2 小时
 楼主| 发表于 2015-11-27 12:51:47 | 显示全部楼层
回复【2楼】nieyong:
---------------------------------
是呀一样的 刚上电的时候的 两个中断都进 等跑起来 1s左右吧 就只进一个了
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-2-20
在线时间
2 小时
 楼主| 发表于 2015-12-25 14:01:38 | 显示全部楼层
啦啦啦 有木有人呀
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 16:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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