打印

请教香主,如何启动DMA传输?

[复制链接]
3074|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangxk|  楼主 | 2009-4-11 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用DMA发送串口数据,如何启动传输呢,是要专门设置定时器启动吗?
沙发
香水城| | 2009-4-11 10:33 | 只看该作者

软件启动DMA,然后每当发送寄存器空时,DMA传送一次数据

详见STM32参考手册的24.3.12节。

使用特权

评论回复
板凳
smallfishyjt| | 2009-4-11 18:27 | 只看该作者

看你想怎么启动了

DMA的启动方式有很多中种的 
如果你需要定时来启动就用定时器来启动
但是从你说的来看是想通过串口的收发来启动传输
可以看一下USART里面的DMA模式

使用特权

评论回复
地板
zhangxk|  楼主 | 2009-4-12 10:45 | 只看该作者

还是不启动

按照参考手册和例程程序的顺序都试了,还是不能启动传输。

初始化程序:
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

     /* Configure USARTx_Tx as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIOA_Tx1Pin;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USARTx_Rx as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIOA_Rx1Pin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    DMA_UART1Tx_StructInit();
    DMA_Init(DMA1_Channel4, &DMA_UART1TxStructure);

    BSP_IntVectSet(BSP_INT_ID_DMA1_CH4, DMA1_CH4_Uart1TxFinish);
    BSP_IntPrioSet(BSP_INT_ID_DMA1_CH4, DMA1_CH4_UART1Tx_UIP);
    BSP_IntEn(BSP_INT_ID_DMA1_CH4);

    /* USARTx configuration ------------------------------------------------------*/
    /* USARTx configured as follow:
         - BaudRate = 115200 baud  
         - Word Length = 8 Bits
         - One Stop Bit
         - No parity
         - Hardware flow control disabled (RTS and CTS signals)
         - Receive and transmit enabled
    */
    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_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure);

    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

发送子程序:
    DMA_Cmd(DMA1_Channel4, DISABLE);
    DMA_UART1TxStructure.DMA_MemoryBaseAddr = (u32)TxBuf;
    DMA_UART1TxStructure.DMA_BufferSize = temp;
    DMA_Init(DMA1_Channel4, &DMA_UART1TxStructure);
    DMA_Cmd(DMA1_Channel4, ENABLE);
    USART_Cmd(USART1, ENABLE);


这样还是不行,运行后没有数据从串口发出去。

使用特权

评论回复
5
zhangxk|  楼主 | 2009-4-12 12:11 | 只看该作者

找到了问题的原因

问题出在了 DMA_UART1TxStructure.DMA_PeripheralBaseAddr 这个地址变量的赋值上,我是这样操作的:

DMA_UART1TxStructure.DMA_PeripheralBaseAddr = (u32)USART1->DR;

这样也试过:

DMA_UART1TxStructure.DMA_PeripheralBaseAddr = USART1->DR;

两种方式的结果 DMA_PeripheralBaseAddr 都是 0。
后来我直接地址赋值问题就解决了:

DMA_UART1TxStructure.DMA_PeripheralBaseAddr = 0x40013804;

USART1->DR 是接收数据寄存器地址,为什么它的地址值是 0 呢?

使用特权

评论回复
6
lut1lut| | 2009-4-13 11:53 | 只看该作者

拜托,一个是内容,一个是地址

使用特权

评论回复
7
zhangxk|  楼主 | 2009-4-13 12:42 | 只看该作者

是的,问题解决了,谢谢

使用特权

评论回复
8
btyang| | 2009-9-9 14:52 | 只看该作者
请问香主你的STM32 手册能不能给个下载链接 啊
我想看看
谢谢

使用特权

评论回复
9
香水城| | 2009-9-9 23:48 | 只看该作者
请问香主你的STM32 手册能不能给个下载链接 啊
我想看看
谢谢
btyang 发表于 2009-9-9 14:52


请看置顶帖“如何查找STM32的官方文档

使用特权

评论回复
10
btyang| | 2009-9-10 19:48 | 只看该作者
谢谢香主,香主万岁

使用特权

评论回复
11
无冕之王| | 2009-9-10 23:33 | 只看该作者
学习中。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

69

帖子

1

粉丝