OpenEdv-开源电子网

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

STM32F207 USART1 TX DMA方式,无法进入中断,并且只能够发送一次完整帧

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-1-20
在线时间
9 小时
发表于 2016-5-12 11:45:28 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 MoWangCZ 于 2016-5-12 12:23 编辑

现象描述:
1.STM32F207能够发送一次数据帧
2.DMA发送完成中断没有触发,进不了DMA中断

下面是我的DMA配置,DMA发送,DMA中断,请大家和原子哥帮我看看

DMA和串口配置代码
[mw_shl_code=c,true]void usartDmaInit(void)
{
        int Timeout = 5000;
        NVIC_InitTypeDef NVIC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;

        //使能DMA总线时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
        //去初始化STREAM 7 ,USART1_TX流 将使用CHANNEL 4
        DMA_DeInit(DMA2_Stream7);

        //wait the DMA reset OK
        while(DMA_GetCmdStatus(DMA2_Stream7) != DISABLE){}

        //Configure DMA Stream
        DMA_InitStructure.DMA_Channel = DMA_Channel_4;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)usartBuf;
        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
        DMA_InitStructure.DMA_BufferSize = 200;
        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_High;
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
        DMA_Init(DMA2_Stream7,&DMA_InitStructure);

        DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);
        
        #if 0
        while ((DMA_GetCmdStatus(DMA2_Stream7) != ENABLE) && (Timeout-- > 0))
        {
        }

        if(Timeout == 0){
                while(1);
        }
        #endif
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);

        DMA_Cmd(DMA2_Stream7,DISABLE);        
}

void usart1Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        memset(usartBuf , 0x35 , sizeof(usartBuf));
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        //管脚配置
        //Reconnect the pin to the AF
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

        //Set the Usart TX as alternate function
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin = GPIO_PinSource9;
        
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        
        //Set the Usart RX as alternate function
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin = GPIO_PinSource10;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        //USART配置
        USART_InitStructure.USART_BaudRate = 115200;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;

        USART_Init(USART1,&USART_InitStructure);
        //使能串口DMA
        USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
        USART_ClearITPendingBit(USART1, USART_IT_TC);//清除中断TC位        
        USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
        //初始化DMA
        usartDmaInit();
        
}
[/mw_shl_code]

下面是DMA发送代码
[mw_shl_code=c,true]void msgOut(unsigned short len)
{
        int i = 0;
        volatile int count = 0;
        if(len > 200)
                return;
        Usart1DmaSendOverFlag = 0;
        
        DMA_SetCurrDataCounter(DMA2_Stream7,len);
        DMA_Cmd(DMA2_Stream7 , ENABLE);
        //查看是否error
        while(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TEIF7) == SET){
                count++;
                if(count > 200){
                        break;
                }
        }
}

//输出
void strout(char *p)
{
        int len = 0;
        len = strlen(p);
        msgOut(len);
}

int main(void)
{
        
        usart1Init();
        //getSysClk();
//        printk("we have end of the usart init\r\n");
        while(1){
                myDelay(500);
                memset(usartBuf , 0 , sizeof(usartBuf));
                strcpy(usartBuf , "helloworld\r\n");
                strout(usartBuf);
//                printk("hello world\r\n");
        }
        return 0;
}[/mw_shl_code]

下面是DMA中断代码:
[mw_shl_code=applescript,true]void DMA2_Stream7_IRQHandler(void)
{
        //这里中断都不能够进入
        if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7))
//        if(DMA_GetITStatus(DMA2_Stream7, DMA_IT_TCIF7))
        {
                /* Clear DMA Stream Transfer Complete interrupt pending bit */
                DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);
//                DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
                Usart1DmaSendOverFlag = 1;                                                                                //允许再次发送
                DMA_Cmd(DMA2_Stream7, DISABLE);
        }
}void DMA2_Stream7_IRQHandler(void)
{
        //这里中断都不能够进入
        if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7))
//        if(DMA_GetITStatus(DMA2_Stream7, DMA_IT_TCIF7))
        {
                /* Clear DMA Stream Transfer Complete interrupt pending bit */
                DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);
//                DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
                Usart1DmaSendOverFlag = 1;                                                                                //允许再次发送
                DMA_Cmd(DMA2_Stream7, DISABLE);
        }
}[/mw_shl_code]

以上就是我的相关代码,请大家帮我看看,谢谢

最佳答案

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

问题解决了,是pinsource问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-1-20
在线时间
9 小时
 楼主| 发表于 2016-5-12 11:45:29 | 显示全部楼层
问题解决了,是pinsource问题
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-1-20
在线时间
9 小时
 楼主| 发表于 2016-5-12 12:54:30 | 显示全部楼层
@正点原子 原子哥,麻烦看看呢,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 04:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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