你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

DMA1 Channel5 进不了中断

[复制链接]
憨客鱼 提问时间:2019-11-14 09:31 /
我使用双USART USART1 采用DMA1 Channel4    USART2 采用 DMA1 Channel5
但是 Channel5的中断一直进不去,我把2路通道互换,Channel5中断还是进不去,不知道什么原因


/*---------------------------------------------------------------------*/
/*  INIT IO                                                                                                                                                                  */
/*  INPUT:NONE                                                         */
/*  OUTPUT:NONE                                                        */
/*---------------------------------------------------------------------*/
void bsp_uart_init(){
    //GPIO¶Ë¿ÚÉèÖÃ
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef UART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;
       
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);        //ʹÄÜUART1
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);        //ʹÄÜUART1       
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //?? PB,PE ???? ;  
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);


        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);               
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;     //???????1??
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority  = 1;               
    NVIC_InitStructure.NVIC_IRQChannelSubPriority  = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //????
  NVIC_Init(&NVIC_InitStructure);                        //???
       
       
    //UART1_TX   GPIOA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë               
    GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.9

    //UART1_RX          GPIOA.10³õʼ»¯
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_10;//PA10
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_AF_PP;        //¸´ÓÃÍÆÍìÊä³ö
    GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.10  
               
               
                       
       
        /************DMA1_Channel2***********/
        DMA_DeInit(DMA1_Channel4);                                                 //??7???,??UART1???
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)UART_TX_BUF;        //????  UART1_TxBuff
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;           //??:??-->??  ?????
  DMA_InitStructure.DMA_BufferSize = 0;                                                           //????
  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??:????,???
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //???:?
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                 //memory-to-memory ??
  DMA_Init(DMA1_Channel4, &DMA_InitStructure);
        DMA_ClearFlag(DMA1_FLAG_TC4);
       

  DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);        //DMA??????       
       
       
    //UART1 NVIC ÅäÖÃ
//    NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn;
//    NVIC_InitStructure.NVIC_IRQChannelPriority = 3;                //×ÓÓÅÏȼ¶3
//    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQͨµÀʹÄÜ
//    NVIC_Init(&NVIC_InitStructure);        //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷

    //UART ³õʼ»¯ÉèÖÃ
//   GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_3);
//   GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_3);


    UART_InitStructure.USART_BaudRate = BAUD_9600;//´®¿Ú²¨ÌØÂÊ
    UART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
    UART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
    UART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ
    UART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
    UART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //ÊÕ·¢Ä£Ê½

    USART_Init(USART1, &UART_InitStructure); //³õʼ»¯´®¿Ú1
//    UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖжϠ      
                USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//½«UART1µÄ·¢ËÍDMA¹¦ÄÜ´ò¿ª
                USART_DMACmd(USART1,USART_DMAReq_Rx,DISABLE);//½«UART1µÄ·¢ËÍDMA¹¦ÄÜ´ò¿ª               
    USART_Cmd(USART1, ENABLE);                    //ʹÄÜ´®¿Ú1
                DMA_Cmd(DMA1_Channel4, ENABLE);                                //   ----------------------



                 ////////------------------UART2-------------------------------------///////////
        //         RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);        //UART2
        //         RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);        //UART2               
       

       
       NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                                //????1????
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;           //???????
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                               //??????
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //????1??
        NVIC_Init(&NVIC_InitStructure);  


        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;     //???????1??
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority  = 2;               
    NVIC_InitStructure.NVIC_IRQChannelSubPriority  = 4;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //????
  NVIC_Init(&NVIC_InitStructure);               

       
    DMA_DeInit(DMA1_Channel5);                                 // ?????
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);// ???????????
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)UART2_TX_BUF;         // ??????????
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                      // ???????,????? -> ?????
    DMA_InitStructure.DMA_BufferSize = 0;                     // ????????,?????????0,???????????,???????
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        // ??????????,??????DMA?????
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 // ???????????
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // ??????8?,1???
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         // ??????8?,1???
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           // ??????
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                 // ?????
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                            // ????????DMA??
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);               // ????   
                DMA_ClearFlag(DMA1_FLAG_GL5);                                 // ??DMA????//UART2?TX?DMA1??7
    DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);            // ????DMA????
       

                 UART_InitStructure.USART_BaudRate = BAUD_115200;//´®¿Ú²¨ÌØÂÊ
    UART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
    UART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
    UART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ
    UART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
    UART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //ÊÕ·¢Ä£Ê½
               
    USART_Init(USART2, &UART_InitStructure); //³õʼ»¯´®¿Ú1
               
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖжϠ      
                USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);//½«UART1µÄ·¢ËÍDMA¹¦ÄÜ´ò¿ª
                USART_DMACmd(USART2,USART_DMAReq_Rx,DISABLE);//½«UART1µÄ·¢ËÍDMA¹¦ÄÜ´ò¿ª               
    USART_Cmd(USART2, ENABLE);                    //ʹÄÜ´®¿Ú1                
               
//    USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖжϠ      

    DMA_Cmd(DMA1_Channel5, ENABLE);                            // ????DMA??,??????               
               
}


/*---------------------------------------------------------------------*/
/*  INIT IO                                                                                                                                                                  */
/*  INPUT:NONE                                                         */
/*  OUTPUT:NONE                                                        */
/*---------------------------------------------------------------------*/
unsigned char UART1_DMA_SendDat(unsigned char *DataAddress,unsigned int len)
{
        unsigned int len2;

  usart_tx_finish &= ~UART1_FLAG;
        while(len>(UART_TX_LEN-UART1_TxCnt))//??????????????????????????
        {
    if(usart_tx_finish&UART1_FLAG)break;
        }
  memcpy(UART_TX_BUF+UART1_TxCnt,DataAddress,len);

  UART1_DMA_TX_CH->CCR &= (unsigned int)(~UART1_DMA_TX_EN);//??DMA??1
  len2=UART1_TxCnt-UART1_DMA_TX_CH->CNDTR;                                        //??????????
  UART1_TxCnt+=len;                //UART1_TxCnt?????,?????UART1_TxBuff????????       
       
  UART1_DMA_TX_CH->CMAR = (u32)UART_TX_BUF+len2;//????
  UART1_DMA_TX_CH->CNDTR = UART1_DMA_TX_CH->CNDTR+len;//??DMA ??????       
       
  UART1_DMA_TX_CH->CCR |= UART1_DMA_TX_EN;//??DMA??1       
       
        while((usart_tx_finish&UART1_FLAG)==0);       

  return 1;         
}

/*---------------------------------------------------------------------*/
/*  INIT IO                                                                                                                                                                  */
/*  INPUT:NONE                                                         */
/*  OUTPUT:NONE                                                        */
/*---------------------------------------------------------------------*/
void DMA1_Channel4_IRQHandler(void)
{
        if(DMA_GetITStatus(UART1_DMA_TX_TC) == SET)//?????????
        {
                DMA1->IFCR = UART1_DMA_TX_TC;        //??????
                UART1_TxCnt=0;//??????
    usart_tx_finish |= UART1_FLAG;
        }
}

/*---------------------------------------------------------------------*/
/*  INIT IO                                                                                                                                                                  */
/*  INPUT:NONE                                                         */
/*  OUTPUT:NONE                                                        */
/*---------------------------------------------------------------------*/
unsigned char UART2_DMA_SendDat(unsigned char *DataAddress,unsigned int len)
{
        unsigned int len2;

  usart2_tx_finish &= ~UART1_FLAG;
        while(len>(UART2_TX_LEN-UART2_TxCnt))//??????????????????????????
        {
    if(usart2_tx_finish&UART2_FLAG)break;
        }
  memcpy(UART2_TX_BUF+UART2_TxCnt,DataAddress,len);

  UART2_DMA_TX_CH->CCR &= (unsigned int)(~UART2_DMA_TX_EN);//??DMA??1
  len2=UART2_TxCnt-UART2_DMA_TX_CH->CNDTR;                                        //??????????
  UART2_TxCnt+=len;                //UART1_TxCnt?????,?????UART1_TxBuff????????       
       
  UART2_DMA_TX_CH->CMAR = (u32)UART2_TX_BUF+len2;//????
  UART2_DMA_TX_CH->CNDTR = UART2_DMA_TX_CH->CNDTR+len;//??DMA ??????       
       
  UART2_DMA_TX_CH->CCR |= UART2_DMA_TX_EN;//??DMA??1       
         
       
        while((usart2_tx_finish&UART2_FLAG)==0);       

  return 1;         
}

/*---------------------------------------------------------------------*/
/*  INIT IO                                                                                                                                                                  */
/*  INPUT:NONE                                                         */
/*  OUTPUT:NONE                                                        */
/*---------------------------------------------------------------------*/
void DMA1_Channel5_IRQHandler(void)
{
        if(DMA_GetITStatus(UART2_DMA_TX_TC) == SET)//?????????
        {
                DMA2->IFCR = UART2_DMA_TX_TC;        //??????
                UART2_TxCnt=0;//??????
    usart2_tx_finish |= UART2_FLAG;
                   
        }
}


收藏 评论5 发布时间:2019-11-14 09:31

举报

5个回答
憨客鱼 回答时间:2019-11-14 09:35:51
#define UART1_DMA_TX_CH      DMA1_Channel4
#define UART1_DMA_TX_IRQ     DMA1_Channel4_IRQn
#define UART1_DMA_TX_EN                        DMA_CCR2_EN
#define UART1_DMA_TX_TC      DMA1_IT_TC4

#define UART2_DMA_TX_CH      DMA1_Channel5
#define UART2_DMA_TX_IRQ     DMA1_Channel5_IRQn
#define UART2_DMA_TX_EN                        DMA_CCR2_EN
#define UART2_DMA_TX_TC      DMA1_IT_TC5
mylovemcu 回答时间:2019-11-14 10:34:05
通道5是USART1的RX,通道6才是USART2的RX,所以你肯定进不去通道5的中断啊  
改成通道6就可以了

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

慎微 回答时间:2019-11-14 10:39:50
用cubeMX来初始化代码定义的话,能看到 channel 与其他设置的冲突。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

憨客鱼 回答时间:2019-11-14 13:12:57
mylovemcu 发表于 2019-11-14 10:34
通道5是USART1的RX,通道6才是USART2的RX,所以你肯定进不去通道5的中断啊  
改成通道6就可以了 ...

多谢!
yklstudent 回答时间:2019-11-14 13:43:31
写程序还是要多看芯片手册,不能主观凭空想象

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版