野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11523|回复: 25

从USART1串口接收数据,用DMA转移到数组中不行,求大神,已经弄一天了

[复制链接]
发表于 2016-1-7 16:41:58 | 显示全部楼层 |阅读模式
下面是程序:
mian.c
#include "stm32f10x.h"
#include "usart.h"
#include "dma.h"
#include "string.h"

extern uint8_t SrcBuf[];

int main(void)
{
        uint8_t flag=1;
        RCC_Config();
        GPIO_Config();
        USART_Config();
        DMAx_Config();

        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
        DMA_Cmd(DMA1_Channel5,ENABLE);
       
        printf("测试\r\n");
        printf(SrcBuf);
        while(flag)
        {
                if(strstr(SrcBuf,"ON"))
                {
                        flag=0;
                        printf(SrcBuf);
                        GPIO_ResetBits(GPIOB,GPIO_Pin_0);
                }
        }
         
}

回复

使用道具 举报

 楼主| 发表于 2016-1-7 16:42:49 | 显示全部楼层
dma.h
#ifndef __DMA_H
#define __DMA_H

#include "stm32f10x.h"

void DMAx_Config(void);



#endif
下面的是dma.c
#include "dma.h"

uint8_t SrcBuf[10];
void DMAx_Config(void)
{

       
        DMA_InitTypeDef DMA_InitStructure;

        DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)USART1->DR;                //USART1μÄDR¼Ä′æÆ÷£¬¼′êy¾Y¼Ä′æÆ÷
        DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SrcBuf;
        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
       
        DMA_InitStructure.DMA_BufferSize=10;
        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;
        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_M2M=DMA_M2M_Disable;
       
        DMA_Init(DMA1_Channel5,&DMA_InitStructure);                //USART1_RXÔúDMA1μÄí¨μà5
//        DMA_Cmd(DMA1_Channel5,ENABLE);
}



回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-7 16:43:39 | 显示全部楼层
usart.h
#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"
#include "stdio.h"

void RCC_Config(void);
void GPIO_Config(void);
void USART_Config(void);

#endif


下面是usart.c
#include "usart.h"

void RCC_Config(void)
{
        SystemInit();
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB \
        |RCC_APB2Periph_USART1,ENABLE);
}

void GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
        GPIO_SetBits(GPIOB,GPIO_Pin_0);
}


void USART_Config(void)
{
        USART_InitTypeDef USART_InitStructure;
       
        USART_InitStructure.USART_BaudRate=115200;
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;
        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_Tx|USART_Mode_Rx;
       
        USART_Init(USART1,&USART_InitStructure);
       
//        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  //ê1Äü½óêÕÖD¶Ï
        USART_Cmd(USART1,ENABLE);
       
        USART_ClearFlag(USART1,USART_FLAG_TC);
}

int fputc(int ch,FILE *f)
{
        USART_SendData(USART1,(uint8_t)ch);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
        return ch;
}

回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-7 16:45:32 | 显示全部楼层
接收数据的数组里没有任何东西,求助

测试结果

测试结果
回复 支持 反对

使用道具 举报

发表于 2016-1-7 17:48:42 | 显示全部楼层
最烦帮人家看程序了,你参考我们配套的例程,用那个scanf的例程,可以从上位机给单片机发
回复 支持 反对

使用道具 举报

发表于 2016-1-7 17:51:47 | 显示全部楼层
void DMAx_Config(void)
{

      
        DMA_InitTypeDef DMA_InitStructure;

        DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)USART1->DR;                //USART1μÄDR¼Ä′æÆ÷£¬¼′êy¾Y¼Ä′æÆ÷
        DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SrcBuf;
        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
      
        DMA_InitStructure.DMA_BufferSize=10;
       DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;   //至少这里是错的
        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_M2M=DMA_M2M_Disable;
      
        DMA_Init(DMA1_Channel5,&DMA_InitStructure);                //USART1_RXÔúDMA1μÄí¨μà5
//        DMA_Cmd(DMA1_Channel5,ENABLE);
}

参考例程,有串口DMA传输的例程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-7 17:54:26 | 显示全部楼层
fire 发表于 2016-1-7 17:48
最烦帮人家看程序了,你参考我们配套的例程,用那个scanf的例程,可以从上位机给单片机发

没有看到有SCANF的例程,就是DMA从外设USART1到存储器,也需要用串口接收吗?我看很多书里,都没有,直接从串口助手发过去,就会存到存储器里
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-7 17:57:31 | 显示全部楼层
亽亼 发表于 2016-1-7 17:51
void DMAx_Config(void)
{

改正也不行,请问你以前有做过这个实验吗,用DMA从USART1到存储器
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-7 17:58:31 | 显示全部楼层
亽亼 发表于 2016-1-7 17:51
void DMAx_Config(void)
{

那个例程是从存储器到USART1外设的,那个没问题
回复 支持 反对

使用道具 举报

发表于 2016-1-7 18:04:41 | 显示全部楼层
烟酒僧 发表于 2016-1-7 17:58
那个例程是从存储器到USART1外设的,那个没问题

那肯定是有啊           ,DMA的那个例程就是      
回复 支持 反对

使用道具 举报

发表于 2016-1-7 18:39:52 | 显示全部楼层
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;         
DMA没配置好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-7 18:42:48 | 显示全部楼层
亽亼 发表于 2016-1-7 18:39
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;         
DMA没配置好

这个是没关系的,nomal是一次,circular是循环
回复 支持 反对

使用道具 举报

发表于 2016-1-8 08:30:09 | 显示全部楼层
你有没有改了试试的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-8 10:44:25 | 显示全部楼层
亽亼 发表于 2016-1-8 08:30
你有没有改了试试的?

嗯嗯,都试了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-8 10:47:56 | 显示全部楼层
fire 发表于 2016-1-7 18:04
那肯定是有啊           ,DMA的那个例程就是

DMA只有两个例程,一个是DMA-ADC,一个是DMA-USART1,后面那个是USASRT1发数据的,没有收数据的,我网上找了找,好像还有个什么DMA中断
回复 支持 反对

使用道具 举报

发表于 2016-1-8 12:35:12 | 显示全部楼层
烟酒僧 发表于 2016-1-7 17:54
没有看到有SCANF的例程,就是DMA从外设USART1到存储器,也需要用串口接收吗?我看很多书里,都没有,直接 ...

串口助手直接发过去,不也是得经过USART口吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-8 15:57:07 | 显示全部楼层
qduwg 发表于 2016-1-8 12:35
串口助手直接发过去,不也是得经过USART口吗?

我现在对这些东西学很模糊
回复 支持 反对

使用道具 举报

发表于 2016-1-8 16:11:24 | 显示全部楼层
烟酒僧 发表于 2016-1-8 15:57
我现在对这些东西学很模糊

哈哈,学STM32就是很模糊的。必须首先搞清楚好多概念的问题。否则程序根本看不明白的。我以前的几个帖子也是都栽在这个基础上面。不过,我都弄明白了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-8 17:10:59 | 显示全部楼层
qduwg 发表于 2016-1-8 16:11
哈哈,学STM32就是很模糊的。必须首先搞清楚好多概念的问题。否则程序根本看不明白的。我以前的几个帖子 ...

你学STM32多久啦?有没有这个例程?或是自己做个这个实验?
回复 支持 反对

使用道具 举报

发表于 2016-1-8 18:39:08 | 显示全部楼层
烟酒僧 发表于 2016-1-8 17:10
你学STM32多久啦?有没有这个例程?或是自己做个这个实验?

我学的时间不长,也就几个月吧。我现在不在家。板子不在身边。无法帮你调试。明天我看看有机会试试。帮你测试一下昂。
回复 支持 反对

使用道具 举报

发表于 2016-1-11 11:50:46 | 显示全部楼层
你的这个程序我已经调试好了。取得重大突破哦。

完全可以通过PC串口助手发送指令,不但可以开灯,还可以关灯了。你以前只是一个开灯的功能。我加上了关灯功能了。呵呵。

DMAUSART1.jpg


DMAUSART2.jpg
回复 支持 1 反对 0

使用道具 举报

发表于 2016-1-14 18:38:18 | 显示全部楼层
我是用CUBE 初始化代码  UART+DMA RX
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-27 16:44:23 | 显示全部楼层
qduwg 发表于 2016-1-11 11:50
你的这个程序我已经调试好了。取得重大突破哦。

完全可以通过PC串口助手发送指令,不但可以开灯,还可 ...

感谢,我整个寒假都没看这些,我找时间看看
回复 支持 反对

使用道具 举报

发表于 2016-4-26 10:54:41 | 显示全部楼层
qduwg 发表于 2016-1-11 11:50
你的这个程序我已经调试好了。取得重大突破哦。

完全可以通过PC串口助手发送指令,不但可以开灯,还可 ...

你好  
我的也是用DAM接收串口数据但是一直接收不到  不知道为什么 用的的usart空闲中断  可以请教下吗
回复 支持 反对

使用道具 举报

发表于 2016-4-26 10:55:09 | 显示全部楼层
qduwg 发表于 2016-1-11 11:50
你的这个程序我已经调试好了。取得重大突破哦。

完全可以通过PC串口助手发送指令,不但可以开灯,还可 ...


你好!我的也是用DAM接收串口数据但是一直接收不到  不知道为什么 用的的usart空闲中断  可以请教下吗
回复 支持 反对

使用道具 举报

发表于 2016-5-21 20:45:52 | 显示全部楼层
如果采用DMA方式,数组定义必须用 volatile 修饰,不采用优化代码;否则该值不能被(除CPU外的)未知原因更改;具体看 volatile 定义吧;有些未用volatile修饰也能通过,跟个别编译器有关。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 04:53 , Processed in 0.040344 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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