OpenEdv-开源电子网

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

从串口输入数据通过DMA直接写入Flash失败,请问原因

[复制链接]

2

主题

14

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-5-11
在线时间
12 小时
发表于 2020-6-3 11:03:38 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 wangSQ 于 2020-6-4 11:45 编辑
串口中断能够成功进入,但是dma通道传输貌似有问题,请大佬帮忙看看原因
另外:请问DMA在M2M模式下通道是可以任意选择的吗?只要在外设基地址也填写flash或者sram地址就可以了吗?因为之后还要求将flash里的数据取到sram里用的是Nano板


使用DMA1_Channel5,配置函数如下

void MYDMA1CH5_Config(u32 cpar,u32 cmar,u16 cndtr){
        
        DMA_InitTypeDef DMA_InitStructure;
        
         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);                                                                //使能DMA传输时钟
        
        DMA_DeInit(DMA1_Channel5);                                                                                                                           //将DMA的通道1寄存器重设为默认

        DMA1_MEM_LEN=cndtr;
        
        DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;                                                                  //DMA外设基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = cmar;                                                                          //DMA内存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                                                  //数据传输方向,从外设到内存
        DMA_InitStructure.DMA_BufferSize = cndtr;                                                                                  //DMA通道的DMA缓存的大小
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                                  //外设地址寄存器不变
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                                  //内存地址寄存器递增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;                  //数据宽度为8位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;                                 //数据宽度为8位
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                                                  //循环,超过buf大小则循环覆盖
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                                         //高优先级
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                                          //不设置内存到内存传输
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);                                                                          //完成DMA初始化
}


========================================================================================
使用USART1配置如下
void uart_init(u32 bound)
{
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟

        //USART1_TX   GPIOA.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

        //USART1_RX          GPIOA.10初始化
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

        //Usart1 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化NVIC寄存器

        //USART 初始化设置

        USART_InitStructure.USART_BaudRate = bound;//串口波特率
        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_Rx | USART_Mode_Tx;        //收发模式

        USART_Init(USART1, &USART_InitStructure); //初始化串口1
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
        USART_Cmd(USART1, ENABLE);                    //使能串口1
        
        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);   //使能串口1 DMA接收

}


==============================================================================
采取USART1的方式写入数据,每收到一次数据,进行一次dma传输, 这里串口有显示”Moving data from usart1_rx to flash...“,说明进入了中断,但是没有“Write Flash Complete!!"的提示信息,说明通道5的传输又问题,求求大佬帮忙看看怎么回事:
void USART1_IRQHandler(void){
        char i;
        u32 USART1_REC_CNT;
        if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET){
                //USART_ReceiveData(USART1);//读取数据 清除中断标志位
               
                USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
                  
                MYDMA_Enable(DMA1_Channel5);//开始一次从rx到flash的搬运
                printf("\r\nMoving data from usart1_rx to flash...\r\n");
                while(1){
                        if(DMA_GetFlagStatus(DMA1_FLAG_TC5)!=RESET){        //判断通道5传输完成
                                printf("\r\nWrite Flash Complete!!\r\n");
                                printf("\r\n============================================\r\n");
                                DMA_ClearFlag(DMA1_FLAG_TC5);//清除通道5传输完成标志
                                break;
                        }
                }
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        }
}


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

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2017-2-18
在线时间
1913 小时
发表于 2020-6-3 12:46:14 | 显示全部楼层
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-5-11
在线时间
12 小时
 楼主| 发表于 2020-6-3 20:38:57 | 显示全部楼层
peng1554 发表于 2020-6-3 12:46
看能参考网友的方法不
http://www.openedv.com/forum.php?mod=viewthread&tid=64048&highlight=%B4%AE%BF% ...

可是我这样为什么会卡在中断啊,不是慢的问题
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2021-7-29
在线时间
2 小时
发表于 2021-8-2 19:35:35 | 显示全部楼层
关注中
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 19:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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