OpenEdv-开源电子网

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

PC机通过串口发送数据给STM32,STM32接收用DMA,把收到的数据通过串口发送给PC机

[复制链接]

27

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
848
金钱
848
注册时间
2013-12-25
在线时间
103 小时
发表于 2014-4-11 11:18:01 | 显示全部楼层 |阅读模式

PC机通过串口发送数据给STM32,STM32接收用DMA,把收到的数据通过串口发送给PC机,我的程序问题是PC机还没给STM32发数据,但是STM32不停的给PC机发送00,求各位高手帮忙。。。
#include "UART.H"

u8  USART_RX_BUF[4]; //接收缓冲,最大48个字节
_UART1 UART1;

void uart_init(u32 bound)
{
  USART_InitTypeDef  USART_InitStruct;
  GPIO_InitTypeDef   GPIO_InitStruct;
  NVIC_InitTypeDef   NVIC_InitStruct;
  DMA_InitTypeDef    DMA_InitStruct;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);  //使能GPIO和串口1的时钟
  USART_DeInit(USART1);  //复位串口1

  //GPIO初始化 
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;          // PA.9 USART1_TX
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;  //IO口的速度
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;   // 推挽复用输出

  GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;          // PA.10 USART1_RX
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;   // 浮空输入
   
  GPIO_Init(GPIOA, &GPIO_InitStruct);

  //DMA初始化
  DMA_DeInit(DMA1_Channel4); //DMA1 通道4
  DMA_InitStruct.DMA_PeripheralBaseAddr=UART1_DR_Address;                 // 从UART1_DR 中拷贝数据
  DMA_InitStruct.DMA_MemoryBaseAddr=(u32)&UART1.UART1ConvertedValue;     //  UART1数据接收结果保存缓冲
  DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST;                          //DMA数据拷贝方向,从内存到外设
  DMA_InitStruct.DMA_BufferSize=4;                                   // DMA拷贝数据一次循环的个数
  DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;        // 外设地址是否增加
  DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;         //内存地址连续增加
  DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;     // 外设数据类型,8字节
  DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;    // 内存数据类型
  DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;              // 工作在正常模式;
  DMA_InitStruct.DMA_Priority = DMA_Priority_High;          //  优先级
  DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;            //  是否允许内存到内存传输

  DMA_Init(DMA1_Channel4,&DMA_InitStruct);

//  DMA_ITConfig(DMA1_Channel4, DMA_IT, ENABLE);  // //DMA14传输完成中断

  USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);    //串口DMA接收使能

  DMA_Cmd(DMA1_Channel4, ENABLE);            // 使能DMA,启动 DMA

  //USART初始化
  USART_InitStruct.USART_BaudRate= bound;                             //波特率
  USART_InitStruct.USART_WordLength= USART_WordLength_8b;             //8位字长
  USART_InitStruct.USART_StopBits= USART_StopBits_1;                  //1个停止位
  USART_InitStruct.USART_Parity= USART_Parity_No;                     //无奇偶校验
  USART_InitStruct.USART_Mode= USART_Mode_Rx|USART_Mode_Tx;           //收发模式
  USART_InitStruct.USART_HardwareFlowControl= USART_HardwareFlowControl_None;    //无硬件数据流控制

  USART_Init(USART1,&USART_InitStruct);

  //NVIC初始化
  NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;             //串口中断1
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=3;    //抢占优先级3
  NVIC_InitStruct.NVIC_IRQChannelSubPriority= 3;           //子优先级3
  NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;               //使能中断

  NVIC_Init(&NVIC_InitStruct);  //中断优先级初始化

//  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启串口接收中断

  USART_Cmd(USART1, ENABLE);  //使能串口

}

/***************************
       串口发送函数
****************************/
void RS232_Send_Data(u8 *buf,u8 len)
{
 u8 t;
   for(t=0;t<len;t++)  //循环发送数据
 {    
  while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);  
  USART_SendData(USART1,buf[t]);
 } 
 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);   
}

//开启一次DMA传输
void MYDMA_Enable()
{
   u8 i;
   for(i=0;i<4;i++)
   {
     USART_SendData(USART1, UART1.UART1ConvertedValue);
   }
  
}

 

 

 

 

 

 

 

 

 

 


 

海到无边天作岸?
山登绝顶我为峰
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-11 12:12:42 | 显示全部楼层
你在main中循环调用发送函数了???
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

27

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
848
金钱
848
注册时间
2013-12-25
在线时间
103 小时
 楼主| 发表于 2014-4-15 15:45:03 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
对啊,有啥问题了啊????还请讲解
海到无边天作岸?
山登绝顶我为峰
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-15 15:50:09 | 显示全部楼层
回复【3楼】为你分心:
---------------------------------
像原子哥的那样,定义一个变量,收到数据就发送,没有收到就不发送,这样就不会一直发送0啦
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

27

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
848
金钱
848
注册时间
2013-12-25
在线时间
103 小时
 楼主| 发表于 2014-4-16 20:57:36 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
我在主函数中这样写的,结果现在啥也收不到了
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);    //串口DMA接收使能    
      DMA_Cmd(DMA1_Channel5, ENABLE);  //使能USART1 RX DMA1 所指示的通道
while(1)
{          
           if(DMA_GetFlagStatus(DMA1_FLAG_TC5)!=RESET) //判断通道5传输完成
     {
       USART_SendData(USART1, SendBuff[1]);
       DMA_ClearFlag(DMA1_FLAG_TC5);//清除通道5传输完成标志
   break; 
    }
}
海到无边天作岸?
山登绝顶我为峰
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-17 08:16:00 | 显示全部楼层
回复【5楼】为你分心:
---------------------------------
这。。。

好好研究一下原子哥的串口实验吧,看看怎么写的。。。你是用中断接收数据,main大循环里面发送数据是不是???
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-11 23:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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