打印

stm32 的DMA

[复制链接]
1938|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenzongxi123|  楼主 | 2012-1-31 18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
     //开始一次DMA传输!
     DMA_Cmd(DMA1_Channel4, ENABLE);
     while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
     {
     }
  


如果和串口调试工具连接能收到数据?
将串口的发送用DMA方式实现?
和 USART_SendData(USART1, TX_Buferr[i])功能一样?

这个地方没理解,还请版主讲解一下,谢谢
沙发
香水城| | 2012-1-31 18:40 | 只看该作者
光这么几行代码,什么也做不了!

使用特权

评论回复
板凳
chenzongxi123|  楼主 | 2012-2-1 08:09 | 只看该作者
本帖最后由 chenzongxi123 于 2012-2-1 08:12 编辑

2# 香水城

这是完整程序,现在串口调试工具没有收到数据,是哪里有问题呢,是不是没有发送函数?

#include "stm32f10x.h"
uint32_t Txbuff[8]={1,2,3,1,2,3,1,2};

void RCC_Configuration(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);         //DAM时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);        //串口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA,ENABLE);
}

void GPIO_Configuration(void)         
{                     
GPIO_InitTypeDef GPIO_InitStructure;            //LED0初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           //PA10为RXD,初始化  开发板上的RXD和TXD连接
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;              //PA9为TXD,初始化
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}  

void USATR_Configuration( uint32_t USART_BaudRate)
{
USART_InitTypeDef USART_InitStructure;               //串口初始化
USART_InitStructure.USART_BaudRate = USART_BaudRate;
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_Cmd(USART1,ENABLE);                //打开串口
}

void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Txbuff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 8;
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_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4,&DMA_InitStructure);
}

void Delay(vu32 times)
{
while(times--);
}
int main(void)
{
int i;
int j=0;
uint32_t Rxbuff[3]={0};
RCC_Configuration();               //RCC是第一个初始化
GPIO_Configuration();
  
USATR_Configuration(9600);
DMA_Configuration();            

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);       //使能串口1的 DMA 发送
DMA_Cmd(DMA1_Channel4,ENABLE);        //开始一次DMA传输
while(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)  
  {
   GPIO_ResetBits(GPIOA,GPIO_Pin_8);
  }
}

使用特权

评论回复
地板
香水城| | 2012-2-1 09:48 | 只看该作者
1)很多人都栽在串口调试工具上,请直接用示波器看看。
2)STM32固件库中有使用DMA+USART发送的例子,你可以去看看。

使用特权

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

本版积分规则

0

主题

6

帖子

0

粉丝