野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15903|回复: 4

改编课件22-DMA-PtoM, DMA定长从串口usart读取数据在通过串口发送出来

[复制链接]
发表于 2020-3-31 15:31:11 | 显示全部楼层 |阅读模式
改编课件22-DMA-PtoM, DMA定长从串口usart读取数据在通过串口发送出来,,,折腾了大半天,,也参考了不定长加串口中断,, ,,串口不定长加中断没有研究出来,,就先把这个给弄出来了,,回头在继续弄不定长加串口中断

回复

使用道具 举报

 楼主| 发表于 2020-3-31 15:31:59 | 显示全部楼层
[mw_shl_code=c,true]/**
  ******************************************************************************
  * @file    main.c
  * @author  fire
  * @version V1.0
  * @date    2013-xx-xx
  * @brief   测试led
  ******************************************************************************
  * @attention
  *
  * 实验平台:秉火 F103-霸道 STM32 开发板
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :http://firestm32.taobao.com
  *
  ******************************************************************************
  */
       
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_dma_mtp.h"

extern uint8_t SendBuff[SENDBUFF_SIZE];

#define SOFT_DELAY Delay(0x0FFFFF);

void Delay(__IO u32 nCount);

/**
  * @brief  主函数
  * @param  无  
  * @retval 无
  */
int main(void)
{       
        uint16_t i=0;
        /* LED 端口初始化 */
        LED_GPIO_Config();
       
        USART_Config();
        USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Rx, ENABLE);
  USARTx_DMA_Config();
        while (1)
        {
               
                       
if(DMA_GetFlagStatus(DMA1_FLAG_TC5)==1)
{
        for(i=0; i<SENDBUFF_SIZE; i++)
        {
        Usart_SendByte(SendBuff);
        }
        DMA_ClearFlag(DMA1_FLAG_TC5);


       

}
               
               
               
//    LED1_TOGGLE
//    Delay(0xFFFFF);               
        }
}

void Delay(__IO uint32_t nCount)         //简单的延时函数
{
        for(; nCount != 0; nCount--);
}
/*********************************************END OF FILE**********************/


















[/mw_shl_code]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-31 15:32:25 | 显示全部楼层
[mw_shl_code=c,true]#ifndef __BSP_DMA_MTP_H
#define __BSP_DMA_MTP_H

#include "stm32f10x.h"
#include <stdio.h>

// 串口工作参数宏定义
#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
   
#define  DEBUG_USART_TX_GPIO_PORT       GPIOA   
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10

#define  USART_TX_DMA_CLK               RCC_AHBPeriph_DMA1
#define  USART_TX_DMA_CHANNEL           DMA1_Channel4
#define  USART_TX_DMA_FLAG_TC           DMA1_FLAG_TC4
#define  USART_DR_ADDRESS        (USART1_BASE+0x04)


#define  USART_RX_DMA_CLK               RCC_AHBPeriph_DMA1
#define  USART_RX_DMA_CHANNEL           DMA1_Channel5
#define  USART_RX_DMA_FLAG_TC           DMA1_FLAG_TC5
#define  USART_DR_ADDRESS        (USART1_BASE+0x04)







#define  SENDBUFF_SIZE          5
void Usart_SendByte(uint8_t data);
void USARTx_DMA_Config(void);
void USART_Config(void);
#endif  /* __BSP_DMA_MTP_H */
[/mw_shl_code]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-31 15:33:20 | 显示全部楼层
[mw_shl_code=c,true]#include "bsp_dma_mtp.h"

uint8_t SendBuff[SENDBUFF_SIZE];

/**
  * @brief  USART GPIO 配置,工作参数配置
  * @param  无
  * @retval 无
  */
void USART_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        // 打开串口GPIO的时钟
        DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
       
        // 打开串口外设的时钟
        DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

        // 将USART Tx的GPIO配置为推挽复用模式
        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
       
        // 配置串口的工作参数
        // 配置波特率
        USART_InitStructure.USART_BaudRate = DEBUG_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_Rx | USART_Mode_Tx;
        // 完成串口的初始化配置
        USART_Init(DEBUG_USARTx, &USART_InitStructure);       
       
        // 使能串口
        USART_Cmd(DEBUG_USARTx, ENABLE);            
}

///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
                /* 发送一个字节数据到串口 */
                USART_SendData(DEBUG_USARTx, (uint8_t) ch);
               
                /* 等待发送完毕 */
                while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);               
       
                return (ch);
}

// Memory -> P (USART->DR)
void USARTx_DMA_Config(void)
{
        DMA_InitTypeDef DMA_InitStruct;
       
        RCC_AHBPeriphClockCmd(USART_TX_DMA_CLK, ENABLE);       
        DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)USART_DR_ADDRESS;
        DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)SendBuff;
        DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;       
        DMA_InitStruct.DMA_BufferSize = SENDBUFF_SIZE;
        DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;       
        DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStruct.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;       
        DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStruct.DMA_Priority = DMA_Priority_High;
        DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(USART_RX_DMA_CHANNEL, &DMA_InitStruct);
        DMA_ClearFlag(USART_RX_DMA_FLAG_TC);
        DMA_Cmd(USART_RX_DMA_CHANNEL, ENABLE);
}
//    // 开启DMA时钟
//    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//    // 设置DMA源地址:串口数据寄存器地址*/
//    DMA_InitStructure.DMA_PeripheralBaseAddr =  (uint32_t)USART1->DR;
//    // 内存地址(要传输的变量的指针)
//    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Usart_Rx_shuzu;   //接收数据数组指针
//    // 方向:从内存到外设     #define DMA_DIR_PeripheralDST     ((uint32_t)0x00000010)   从存贮器读
//     //                       #define DMA_DIR_PeripheralSRC     ((uint32_t)0x00000000)   从外设读
//    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//    // 传输大小
//    DMA_InitStructure.DMA_BufferSize = USART1_RX_BUFF_geshu;
//    // 外设地址不增      
//    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模式,一次或者循环模式
//  //  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
//    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
//    // 优先级:中   
//    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
//    // 禁止内存到内存的传输
//    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
//    // 配置DMA通道         
//    DMA_Init(USART1_RX_DMA_CHANNEL, &DMA_InitStructure);     
//    // 清除DMA所有标志
//    DMA_ClearFlag(DMA1_FLAG_TC5);
//    DMA_ITConfig(USART1_RX_DMA_CHANNEL, DMA_IT_TE, ENABLE);
//    // 使能DMA
//    DMA_Cmd (USART1_RX_DMA_CHANNEL,ENABLE);


void Usart_SendByte(uint8_t data)
{
        USART_SendData(USART1, data);
        while( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
}






[/mw_shl_code]
回复 支持 反对

使用道具 举报

发表于 2020-3-31 23:07:56 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-29 17:20 , Processed in 0.036091 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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