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

DMA1 Channel5 进不了中断

[复制链接]
jiyu75 提问时间: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个回答
jiyu75 回答时间: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

查看全部评分

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

评分

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

查看全部评分

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

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

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版