OpenEdv-开源电子网

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

stm32f030 USART-DMA问题出错

[复制链接]

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2016-6-3
在线时间
15 小时
发表于 2016-7-8 15:05:16 | 显示全部楼层 |阅读模式
5金钱
求大神指点!在while用USART_SendData( USART1,0x11);试了一下可以发,但是用DMA发送一次后进入startup_stm32f0xx_ld.s就出不来了
下面是部分函数


int main(void)
{
        u8 i,j,k;
        SYSCLK1_Config();
        GPIO_ConfigInit();       
        Usart1_InitConfig(2,9,2);                                                                                                               
        Nvic_ConfigInit();
        while(1)
        {
                Usart1_BufSend(zhen111,5);
                DMAChanal2_InitConfig(Usart1DR_Add,Usart1_TxBuf,(u32) Usart1Tx_Num);
       }
}
void Nvic_ConfigInit(void)

{
NVIC_InitTypeDef        NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 4;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = SPI1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 5;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 7;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority =0x02;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void Usart1_InitConfig(u16 ComBaud,u16 Datlenth, u16 parity)
{
                USART_InitTypeDef USART_InitStruct;
                u16        tempdatlenth = 0;         
          u16        tempparity = 0;         
                u32 baudrate;
        switch(ComBaud)
        {
                case _B2400:
                        baudrate = 2400;
                        break;
                case _B4800:
                        baudrate = 4800;
                        break;
                case _B9600:
                        baudrate = 9600;
                        break;
                case _B19200:
                        baudrate = 19200;
                        break;
                case _B38400:
                        baudrate = 38400;
                        break;
                case _B57600:
                        baudrate = 57600;
                        break;
                case _B115200:
                        baudrate = 115200;
                        break;       
                default:
                        baudrate = 9600;
                        break;
        }
        if(Datlenth == 9)
        {
                tempdatlenth = USART_WordLength_9b;       
        }
        else
        {
                tempdatlenth = USART_WordLength_8b;
                parity = 0;
        }
        if(!parity)
        {
                tempparity = USART_Parity_No;
        }
        else if(parity == 1)
        {
                tempparity = USART_Parity_Odd;
        }
        else
        {
                tempparity = USART_Parity_Even;
        }       
       
        USART_DeInit(USART1);
  USART_InitStruct.USART_BaudRate = baudrate;
  USART_InitStruct.USART_WordLength = tempdatlenth;
  USART_InitStruct.USART_StopBits = USART_StopBits_1;
  USART_InitStruct.USART_Parity = tempparity;
  USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
       
  USART_Init(USART1,&USART_InitStruct);                 
       
        USART_ClearFlag(USART1, USART_FLAG_TC);
  USART_ITConfig(USART1, USART_IT_TC, ENABLE);                                       

       
  USART_DMACmd(USART1, USART_DMAReq_Rx|USART_DMAReq_Tx, ENABLE);
  USART_Cmd(USART1, ENABLE);                  

}

void USART1_IRQHandler(void)                //TIM1_UP_IRQHandler
{
        //u8 i;
        FlagStatus        Usart1IT_TCFlag;
        Usart1IT_TCFlag = USART_GetITStatus(USART1, USART_IT_TC);
        if(Usart1IT_TCFlag == SET)
        {
                //while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                //USART_ClearITPendingBit(USART1,USART_FLAG_WU );
                USART_ClearITPendingBit(USART1, USART_IT_TC);
                USART_ClearITPendingBit(USART1, USART_IT_TXE);
                //delay(100);
                //assert_param(IS_USART_ALL_PERIPH(USART1));
                //assert_param(IS_USART_DATA(DATA));
                //USART_RequestCmd (USART1, USART_Request_TXFRQ,ENABLE);
                //USART_RequestCmd (USART1, USART_Request_RXFRQ,DISABLE);
                //USART_GetITStatus (USART1, USART_IT_TXE);
//                USART_SendData( USART1,0x11);
               
                SetUsart1Tx_Status(0);
                                                                                                        //·¢Ëííê3éÇå3y·¢Ëí×′쬱êÖ¾
        }
          //if(USART_GetFlagStatus(USART1,USART_FLAG_ORE))    //ORE interrupt
                //USART_ClearITPendingBit(USART1, USART_IT_ORE);
        if(USART_GetITStatus(USART1,USART_IT_IDLE)!=RESET)//′®¿ú¿ÕÏD
        {
                //FLASH_WriteHalfWord(FlashPag127_addr, testtt1, 0x05);
                //DMA_Cmd(DMA1_Channel5, DISABLE);//1رÕDMA,·àÖ1′|àíÆä¼äóDêy¾Y
                USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);//¿aÆô¿ÕÏDÖD¶Ï
                //USART_ReceiveData(USART1);
                //delay(1);
                //USART_Rxlength=Usart1_RxNumMax-DMA_GetCurrDataCounter(DMA1_Channel5);
                //Usart1_Rx_bz=0x05;
               

                //DMA_Cmd(DMA1_Channel5, ENABLE);//′ò¿aDMA,·àÖ1′|àíÆä¼äóDêy¾Y

                //Usart1_Rx_bz=5;//ËμÃ÷óD¿¨·¢DÅoÅoóóD»Ø¸′Ãüáî               
        }

}

void DMA1_Channel2_3IRQHandler(void)                //这一句单写2会报错,不知问什么
{
        FlagStatus DMAIT_TCFlag;
        DMAIT_TCFlag = DMA_GetITStatus(DMA1_IT_TC2);
        if(DMAIT_TCFlag == SET)
        {
                        DMA_ClearITPendingBit(DMA1_IT_TC2);
                        DMA_Cmd(DMA1_Channel2, DISABLE);
        }
}


void  Usart1_BufSend(u8 *sendbuf,u8 sendnum)
{
        u8 i=0;
        if(sendnum > Usart1_TxNumMax)
        {
                sendnum = 1;
        }
  while(Usart1Tx_Status);
        Usart1Tx_Num = sendnum;                  //ìîD′·¢Ëí¸öêy
        for(i=0;i<sendnum;i++)                       
        {
                Usart1_TxBuf[i] = sendbuf[i];                        //&#189;&#171;òa·¢&#203;íμ&#196;êy&#190;Y·&#197;μ&#189;·¢&#203;í&#187;o′&#230;
        }
        Usart1Tx_Status = 1;                                //&#214;&#195;&#206;&#187;·¢&#203;í±ê&#214;&#190;
}


void Usart_SendCheck(void)
{
        if(Usart1Tx_Status ==1 )
        {               
                Usart1Tx_Status = 2;       
                DMAChanal2_InitConfig(Usart1TDR_Add,Usart1_TxBuf,(u32) Usart1Tx_Num);
        }

}
void DMAChanal2_InitConfig(uint32_t DMA_PeriphAddrtemp,u8* DMA_MemoryAddrtemp,uint32_t DMA_BufferSizetemp)
{
        DMA_InitTypeDef DMA_InitStruct;
       
        DMA_DeInit(DMA1_Channel2);
        DMA_StructInit(&DMA_InitStruct);
        /*-------------- Reset DMA init structure parameters values ------------------*/
  /* Initialize the DMA_PeripheralBaseAddr member */
  DMA_InitStruct.DMA_PeripheralBaseAddr = DMA_PeriphAddrtemp;                //éè&#182;¨íaéèμ&#216;&#214;·
  /* Initialize the DMA_MemoryBaseAddr member */
  DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)DMA_MemoryAddrtemp;                //éè&#182;¨&#196;ú′&#230;μ&#216;&#214;·                 
  /* Initialize the DMA_DIR member */
  DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;                // íaéè×&#238;&#206;a&#196;&#191;μ&#196;μ&#216;&#214;·DMA_DIR_PeripheralSRC;
  /* Initialize the DMA_BufferSize member */
  DMA_InitStruct.DMA_BufferSize = DMA_BufferSizetemp;
  /* Initialize the DMA_PeripheralInc member */
  DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  /* Initialize the DMA_MemoryInc member */
  DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
  /* Initialize the DMA_PeripheralDataSize member */
  DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  /* Initialize the DMA_MemoryDataSize member */
  DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  /* Initialize the DMA_Mode member */
  DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
  /* Initialize the DMA_Priority member */
  DMA_InitStruct.DMA_Priority = DMA_Priority_Low;
  /* Initialize the DMA_M2M member */
  DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
       
        DMA_Init(DMA1_Channel2,&DMA_InitStruct);
        DMA_ClearFlag(DMA1_FLAG_TC2);
        DMA_ClearFlag(DMA1_FLAG_GL2);
        DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
//        uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx)
//        FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG)
//        void DMA_ClearFlag(uint32_t DMAy_FLAG)
//        ITStatus DMA_GetITStatus(uint32_t DMAy_IT)

        DMA_Cmd(DMA1_Channel2, ENABLE);
}

最佳答案

查看完整内容[请看2#楼]

原因找到了,是void DMA1_Channel2_3IRQHandler(void)少写了一个_,应该为DMA1_Channel2_3_IRQHandler(void)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2016-6-3
在线时间
15 小时
 楼主| 发表于 2016-7-8 15:05:17 | 显示全部楼层
原因找到了,是void DMA1_Channel2_3IRQHandler(void)少写了一个_,应该为DMA1_Channel2_3_IRQHandler(void)
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-7-8
在线时间
1 小时
发表于 2016-7-8 15:15:47 | 显示全部楼层
你在while里面一直初始化DMA,不死机?
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2016-6-3
在线时间
15 小时
 楼主| 发表于 2016-7-8 15:49:50 | 显示全部楼层
是因为,进了中断标志位没有清,所以无法启动,清除方法和STM32F103有区别,还得找找
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-8 16:27:57 | 显示全部楼层
030的中断优先级,只有0-3,你设置的什么鬼
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-8 16:31:38 | 显示全部楼层
你还在循环里面初始化DMA你都无限初始化DMA,他还能好好的跑
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-8 16:32:38 | 显示全部楼层
你还在循环里面初始化DMA你都无限初始化DMA,他还能好好的跑
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 07:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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