OpenEdv-开源电子网

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

STM32F072实现USART4+DMA是否可行?

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-6-3
在线时间
13 小时
发表于 2019-8-4 17:06:25 | 显示全部楼层 |阅读模式
5金钱
我已经实现了USART1+DMA传输的程序功能,现在卡在USART4+DMA?请问这个芯片是否支持呢?还有就是我把USART1+DMA的工程拿来修改下GPIO usart DMA通道,怎么不成功呢?欢迎一起交流

微信图片_20190804170536.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-8-5 01:49:32 | 显示全部楼层
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-6-3
在线时间
13 小时
 楼主| 发表于 2019-8-5 12:54:43 | 显示全部楼层
正点原子 发表于 2019-8-5 01:49
看起来是可以的哦

/**
  ********************************  STM32F0xx  *********************************
  * @文件名     : bsp.c
  * @作者       : strongerHuang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2016年05月30日
  * @摘要       : BSP板级支持包源文件
  ******************************************************************************/
/*----------------------------------------------------------------------------
  更新日志:
  2016-05-30 V1.0.0:初始版本
  ----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "usb_usart1.h"
#include "zigbee_usart4.h"
#define  DATA_LEN                 50
uint8_t Sendcount_4=1;                                                        //发送计数
uint8_t Sendfinish_4=0;
extern uint8_t Sendsize_4;
extern uint8_t  Test_Buf[];
extern uint8_t  Receive_Buf[];
uint8_t Usart_Rx_Sta;
uint32_t Receive_buff_length;
uint32_t time=0;
/************************************************
函数名称 : RCC_Configuration
功    能 : 时钟配置
参    数 : 无
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void RCC_Configuration(void)
{
  /* 使能AHB时钟 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_DMA1, ENABLE);

  /* 使能APB1时钟 */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE);

}


/************************************************
函数名称 : NVIC_Configuration
功    能 : NVIC配置
参    数 : 无
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* 外设中断 */
  NVIC_InitStructure.NVIC_IRQChannel = USART3_4_IRQn;                  //IRQ通道:串口4
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;                    //优先级 :1级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                    //使能IRQ通道
  NVIC_Init(&NVIC_InitStructure);
}

/************************************************
函数名称 : BSP_Initializes
功    能 : 底层初始化
参    数 : 无
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void BSP_Initializes(void)
{
  RCC_Configuration();                                               //时钟配置

  NVIC_Configuration();                                              //NVIC配置
}



/************************************************
函数名称 : USART_GPIO_Configuration
功    能 : USART所使用管脚输出输入定义
参    数 : 无
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void USART_GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

        GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_4);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_4);

  /* 定义USART TX_RX 引脚为复用输出 */
  GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0| GPIO_Pin_1);              //引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                       //复用模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  //高速
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                     //推完输出
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                       //上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/************************************************
函数名称 : USART_Configuration
功    能 : 配置USART
参    数 : 无
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void USART_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
  /******************************************************************
  USART参数初始化:  波特率     传输位数   停止位数  校验位数
                    115200         8         1        0(NO)
  *******************************************************************/
  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(USART4, &USART_InitStructure);                          //初始化USART4

        USART_ITConfig(USART4, USART_IT_IDLE, ENABLE);                     //使能USART4空闲总线中断

  USART_Cmd(USART4, ENABLE);                                         //使能USART4

  USART_DMACmd(USART4, USART_DMAReq_Rx | USART_DMAReq_Rx, ENABLE);   //串口DMA收发使能

  DMA_DeInit(DMA1_Channel6);                                         //复位DMA1_Channel6

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(USART4->RDR));         //外设地址
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Receive_Buf;                 //内存地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //传输方向:外设 -> 内存
  DMA_InitStructure.DMA_BufferSize = DATA_LEN;                     //传输长度
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //外设递增:NO
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //内存递增:YES
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;    //数据宽度:Byte
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                      //循环模式:NO
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;            //优先级:高
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                       //内存-内存:NO
  DMA_Init(DMA1_Channel6, &DMA_InitStructure);

//  DMA_RemapConfig(DMA1,DMA1_CH6_USART4_RX);                                                                                                        //DMA1的通道6重映射为USART4_RX
  DMA_ClearFlag(DMA1_FLAG_TC6);
  DMA_ITConfig(DMA1_Channel6, DMA_IT_TE, ENABLE);
  DMA_Cmd(DMA1_Channel6, ENABLE);                                    //使能DMA(开始传输)       
}
/************************************************
函数名称 : USART4_SendByte
功    能 : 串口4发送一字节数据
参    数 : Data --- 数据
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void USART4_SendByte(uint8_t Data)
{
  while((USART4->ISR & USART_FLAG_TXE) == RESET);
  USART4->TDR = (Data & (uint16_t)0x01FF);
}
void USART3_4_IRQHandler(void)
{

        //串口空闲中断
if(USART_GetITStatus(USART4,USART_IT_IDLE)!=RESET)
{
        int q;
        uint16_t buff_length;
        DMA_Cmd(DMA1_Channel6, DISABLE);
        DMA_ClearFlag( DMA1_FLAG_TC6 );
        buff_length = DATA_LEN - DMA_GetCurrDataCounter(DMA1_Channel6);
        Receive_buff_length= buff_length;
        DMA1_Channel6->CNDTR = DATA_LEN;
        time++;
        //置标志位表示接收完成
        for(q=0;q<10;q++)
        {
                Test_Buf[q]=Receive_Buf[q];
        }
        q=0;

  DMA_Cmd(DMA1_Channel6, ENABLE);      
       
        Usart_Rx_Sta = 0x03;
       
        USART_ReceiveData( USART4 );
}
        if(USART_GetITStatus(USART4, USART_IT_TC) != RESET)  //Hart通信发送中断 ---发送完成中断
        {
               
                if(Sendcount_4==Sendsize_4)
                {
                        Sendfinish_4=1;
                        Sendcount_4=1;
                }
                else
                {
                        USART_SendData(USART4,Receive_Buf[Sendcount_4]);
                        Sendcount_4++;
                }
                USART_ClearITPendingBit(USART4,USART_IT_TC);
        }
USART_ClearITPendingBit(USART4,USART_IT_IDLE);       

  if((USART4->ISR & USART_FLAG_RXNE) == USART_FLAG_RXNE)
  {
    USART4_SendByte((uint8_t)(USART4->RDR));     //发送接收到的字符数据
  }
}
/************************************************
函数名称 : USART_Initializes
功    能 : 串口初始化
参    数 : 无
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void USART_Initializes(void)
{
  USART_GPIO_Configuration();
  USART_Configuration();
}
/************************************************
函数名称 : DMA_MemoryToPeripheral
功    能 : DMA传输(内存 -> 外设)
参    数 : PeripheralAddr--- 外设地址
            MemoryAddr ------ 内存地址
            BufferSize ------ 长度
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void DMA_MemoryToPeripheral(uint32_t MemoryAddr, uint32_t PeripheralAddr, uint16_t BufferSize)
{
  DMA_InitTypeDef DMA_InitStructure;

  DMA_DeInit(DMA1_Channel7);                                         //复位DMA1_Channel2

  DMA_InitStructure.DMA_PeripheralBaseAddr = PeripheralAddr;         //外设地址
  DMA_InitStructure.DMA_MemoryBaseAddr = MemoryAddr;                 //内存地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                 //传输方向:内存 -> 外设
  DMA_InitStructure.DMA_BufferSize = BufferSize;                     //传输长度
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //外设递增:NO
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //内存递增:YES
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;    //数据宽度:Byte
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                      //循环模式:NO
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;            //优先级:高
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                       //内存-内存:NO
  DMA_Init(DMA1_Channel7, &DMA_InitStructure);
  DMA_RemapConfig(DMA1,DMA1_CH7_USART4_TX);
  DMA_Cmd(DMA1_Channel7, ENABLE);                                    //使能DMA(开始传输)
}


/************************************************
函数名称 : USART1_SendNByte
功    能 : 串口4发送N个字符
参    数 : pData ----- 字符串
            Length --- 长度
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void USART4_SendNByte(uint8_t *pData, uint16_t Length)
{
  while(Length--)
  {
    USART4_SendByte(*pData);
    pData++;
  }
}
int main(void)  
{       
        BSP_Initializes();
        USART_Initializes();


        while(1)
        {
    /* 发送 */
                if((time>1)&&(Usart_Rx_Sta==0x03))
        {
                Test_Buf[Receive_buff_length]=0x99;
                Sendsize_4=Receive_buff_length+1;
                USART_SendData(USART4,Test_Buf[0]);       
    DMA_MemoryToPeripheral((uint32_t)Test_Buf, (uint32_t)(&(USART4->TDR)), Receive_buff_length+1);
    while(!DMA_GetFlagStatus(DMA1_IT_TC7))
    {                                            //等待传输完成
    }
    DMA_ClearFlag(DMA1_IT_GL7);                  //清除标志位
                Usart_Rx_Sta=0;
        }       
}                                                                                        //usb转串口引脚初始化

/**** Copyright (C)2016 strongerHuang. All Rights Reserved **** END OF FILE ****/
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-6-3
在线时间
13 小时
 楼主| 发表于 2019-8-5 12:57:47 | 显示全部楼层
结果就是这样,不对啊。
QQ图片20190805125603.jpg
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-6-29
在线时间
12 小时
发表于 2019-11-18 14:00:22 | 显示全部楼层
你好,现在解决了吗,我用STM32F0串口DMA也遇到类似的问题了,1 2串口都可以,到了3串口就不行了
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-6-3
在线时间
13 小时
 楼主| 发表于 2019-12-2 18:53:47 | 显示全部楼层
GZQ 发表于 2019-11-18 14:00
你好,现在解决了吗,我用STM32F0串口DMA也遇到类似的问题了,1 2串口都可以,到了3串口就不行了

我工程用到了usart1和usart4两个串口,经过测试串口1可以使用,串口4配置失败,我画板子没有把usart2给引出来了,自己给自己造孽啊。
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-12-3 09:24:13 | 显示全部楼层
http://www.openedv.com/forum.php?mod=viewthread&tid=273874

参考大佬的工程,虽然也没有串口4的DMA
茵茵猪头
回复

使用道具 举报

0

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2021-7-12
在线时间
7 小时
发表于 2021-7-15 13:48:05 | 显示全部楼层
可以试一下。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 23:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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