找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2903|回复: 2
打印 上一主题 下一主题
收起左侧

STM32 USART通过DMA发送程序

[复制链接]
跳转到指定楼层
楼主
ID:302293 发表于 2019-5-29 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stm32f10x.h"
#define se 3//传输的字节数
u32 SendBuff[3];
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
//毫秒级的延时
void delay_ms(u16 time)
{   
   u16 i=0;  
   while(time--)
   {
      i=12000;  //自己定义
      while(i--) ;   
   }
}
/***********************************************************************
************************************************************************/
void DMA_Config(void)

{
    DMA_InitTypeDef DMA_InitStructure;

   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);    //开启DMA时钟
                    //配置DMA中断

     /*设置DMA源:内存地址&串口数据寄存器地址*/
  DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;      

    /*内存地址(要传输的变量的指针)*/
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;

    /*方向:从内存到外设*/        
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;   

    /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/   
  DMA_InitStructure.DMA_BufferSize = se;

    /*外设地址不增*/        
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    /*内存地址自增*/
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;   

    /*外设数据单位*/   
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

    /*内存数据单位 8bit*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;     

    /*DMA模式:一次传输,循环*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;     

    /*优先级:中*/   
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  

    /*禁止内存到内存的传输    */
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

    /*配置DMA1的4通道*/           
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);        

      DMA_Cmd (DMA1_Channel4,ENABLE);                    //使能DMA
      DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);  //配置DMA发送完成后产生中断
}
        

//系统时钟配置
void RCC_Configuration(void)
{  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能串口1的GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,  ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);

}
/*****************************************************************************
*****************************************************************************/
//串口GPIO口配置
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

/* LED0*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //悬浮输入
GPIO_Init(GPIOA, &GPIO_InitStructure);


USART_InitStructure.USART_BaudRate = 9600;      //设定波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;  //传输数据位数
USART_InitStructure.USART_StopBits = USART_StopBits_1;   //停止位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);       //初始化串口1

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);     //使能串口1 读中断
USART_Cmd(USART1,ENABLE);  //串口1使能
USART_ClearFlag(USART1,USART_IT_TC );//发送完成中断

}
/*****************************************************************************
*****************************************************************************/
//中断配置
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);     //先占优先权2,从优先级2位
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;    //开串口中断1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;   //指定抢占优先级别1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;    //指定相应优先级别0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*****************************************************************************
*****************************************************************************/
void USART1_IRQHandler( u32 temp_trx)       //串口接收中断,并将接收到得数据发送出
{

        
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//判断 是否 接收中断  
{
    temp_trx = USART_ReceiveData(USART1);
  USART_SendData(USART1,USART_ReceiveData(USART1));


}
}

int main(void)
{
RCC_Configuration();//系统时钟配置
   DMA_Config();  
NVIC_Configuration();//中断配置

GPIO_Configuration();//GPIO口配置
while(1)          //LED灯循环亮灭,串口循环发送ASCII“9”
{
  delay_ms(500);

USART_SendData(USART1,9);
  delay_ms(50);
         USART_SendData(USART1,0xdf);        
   delay_ms(50);
         USART_SendData(USART1,0xec);         
  delay_ms(50);
         GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_13)));

}
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:721221 发表于 2020-4-2 19:47 | 只看该作者
今天刚看到这里在学习DMA,看了你的程序   发现了一个不知道是不是问题的问题(我没有找到使能USART的DMA请求函数)
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

我刚学  也不太懂
回复

使用道具 举报

板凳
ID:302293 发表于 2020-9-17 17:26 | 只看该作者
PAIDAXINGG 发表于 2020-4-2 19:47
今天刚看到这里在学习DMA,看了你的程序   发现了一个不知道是不是问题的问题(我没有找到使能USART的DMA请 ...

   串口的数据用DMA发送出去的,不占用中断资源
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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