历史上的今天
返回首页

历史上的今天

今天是:2025年06月08日(星期日)

正在发生

2018年06月08日 | STM32的串口1发送、接收DMA模式函数配置

2018-06-08 来源:eefocus

/**********************************************************************************
**函数名称:void USART1_Config(void)
**函数功能:USART1串口引脚初始化
**输入参数:无
**返回参数:无
**函数调用:内部调用
**********************************************************************************/
static void USART1_Config(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;


   RCC_APB2PeriphClockCmd(USART1_RCC | RCC_APB2Periph_USART1, ENABLE);        //打开串口时钟
   
   
   /* USART1 GPIO config */
   /* Configure USART1 Tx (PA.9) as alternate function push-pull */
   GPIO_InitStructure.GPIO_Pin   = USART1_TX;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(USART1_PORT, &GPIO_InitStructure); 
   
   /* Configure USART1 Rx (PA.10) as input floating */
   GPIO_InitStructure.GPIO_Pin  = USART1_RX;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init(USART1_PORT, &GPIO_InitStructure);
   
   /* USART1 mode config */
   USART_InitStructure.USART_BaudRate   = BOOTRATE;
   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(USART1, &USART_InitStructure); 

   //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   //使能串口1中断

   USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);            //使能USART1发送DMA请求 
   USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);          //使能USART1接收DMA请求
       
   USART_Cmd(USART1, ENABLE);                                                  //启动串口 

}


/**********************************************************************************
**函数名称:void USART1_NVIC_Configuration(void)
**函数功能:USART1串口中断初始化
**输入参数:无
**返回参数:无
**函数调用:内部调用
**********************************************************************************/
static void USART1_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    //设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                      //串口接收中断打开
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = USART1_IRQn_Priority;  //设置中断优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}


/**********************************************************************************
**函数名称:void USART1_Init(void)
**函数功能:USART1串口初始化
**输入参数:无
**返回参数:无
**函数调用:内部调用
**********************************************************************************/
static void USART1_Init(void)
{
    USART1_Config();                    //USART1引脚功能初始化

        USART1_NVIC_Configuration();        //USART1中断初始化
}

/**********************************************************************************
**函数名称:static void DMA1_USART1_TX_Configuration(void)
**函数功能:DMA1_USART1_TX初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_TX_Configuration(void)
{
    DMA_InitTypeDef DMA_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);            //开启DMA时钟 

        /*
         *  DMA设置:
     *  设置DMA源:内存地址&串口数据寄存器地址
     *  方向:内存-->外设
     *  每次传输位:8bit
     *  传输大小DMA_BufferSize=SENDBUFF_SIZE
     *  地址自增模式:外设地址不增,内存地址自增1
     *  DMA模式:一次传输,非循环
     *  优先级:高
         */    
    DMA_DeInit(DMA1_Channel4);                                         //串口1的DMA传输通道是通道4
                                                                                                                                           
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);     //设置DMA源
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_SendBuff;           //DMA内存基地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                 //外设作为DMA的目的端
    DMA_InitStructure.DMA_BufferSize = USART1_SENDBUFF_SIZE;           //传输大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //外设地址不增加
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //内存地址自增1
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;                //外设数据宽度8bit
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;                                //内存数据宽度8bit
    DMA_InitStructure.DMA_Mode =  DMA_Mode_Circular;                   //DMA_Mode_Normal(只传送一次), DMA_Mode_Circular (不停地传送)
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //(DMA传送优先级为高)
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                           //非内存到内存
    
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);                  

        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);       //使能DMA通道4传输完成中断



}


/**********************************************************************************
**函数名称:static void DMA1_USART1_TX_NVIC_Configuration(void)
**函数功能:DMA中断初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_TX_NVIC_Configuration(void)
{
   NVIC_InitTypeDef NVIC_InitStructure;
   
   NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;  
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
   NVIC_Init(&NVIC_InitStructure);

}


/**********************************************************************************
**函数名称:static void DMA1_USART1_TX_Init(void)
**函数功能:USART1串口初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_TX_Init(void)
{
           DMA1_USART1_TX_Configuration();

        DMA1_USART1_TX_NVIC_Configuration();
}


/**********************************************************************************
**函数名称:static void DMA1_USART1_RX_Configuration(void)
**函数功能:DMA1_RX初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_RX_Configuration(void)
{        
        DMA_InitTypeDef DMA_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

        DMA_DeInit(DMA1_Channel5);

        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;           //DMA外设基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_RecvBuff;                    //DMA内存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                             //外设作为数据传输的来源
        DMA_InitStructure.DMA_BufferSize = USART1_RECVBUFF_SIZE;                            //DMA缓存大小
        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;            //内存数据宽度8bit
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                            //循环模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                //优先级:高
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                //非内存到内存

        DMA_Init(DMA1_Channel5, &DMA_InitStructure);                                                   //初始化DMA

        DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); //使能DMA通道5传输完成中断
        DMA_Cmd(DMA1_Channel5, ENABLE);                                        //使能DMA通道5
        

}


/**************************************************************
** 函数名称 :DMA1_USART1_RX_NVIC_Configuration(void)
** 功能说明 :NVIC初始化
** 输入参数 :无
** 输出参数 :无
** 返回参数 :无
** 注    意 :无
***************************************************************/
static void DMA1_USART1_RX_NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);        
}


/**********************************************************************************
**函数名称:void DMA1_USART1_RX_Init(void)
**函数功能:USART1串口初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_RX_Init(void)
{
           DMA1_USART1_RX_Configuration();

        DMA1_USART1_RX_NVIC_Configuration();
}


/**********************************************************************************
**函数名称:static void DMA1_USART1_Init(void)
**函数功能:DMA1串口初始化
**输入参数:无
**返回参数:无
**函数调用:外部调用
**********************************************************************************/
static void DMA1_USART1_Init(void)
{
           DMA1_USART1_TX_Init();

    DMA1_USART1_RX_Init();
}


/**********************************************************************************
**函数名称:void USART1_Send_Buf(u8 *buf , unsigned int len)
**函数功能:通过DMA发送串口数据
**输入参数:data -- 发送数据
**返回参数:0--发送不成功
**          1--发送成功
**函数调用:外部调用
**********************************************************************************/
void USART1_Send_Buf(u8 *buf , unsigned int len)
{
        DMA_InitTypeDef DMA_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);            //开启DMA时钟 

        /*
         *  DMA设置:
     *  设置DMA源:内存地址&串口数据寄存器地址
     *  方向:内存-->外设
     *  每次传输位:8bit
     *  传输大小DMA_BufferSize=SENDBUFF_SIZE
     *  地址自增模式:外设地址不增,内存地址自增1
     *  DMA模式:一次传输,非循环
     *  优先级:高
         */    
    DMA_DeInit(DMA1_Channel4);                                         //串口1的DMA传输通道是通道4
                                                                                                                                           
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);     //设置DMA源
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf;                               //DMA内存基地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                 //外设作为DMA的目的端
    DMA_InitStructure.DMA_BufferSize = len;                            //传输大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //外设地址不增加
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //内存地址自增1
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;                //外设数据宽度8bit
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;                                //内存数据宽度8bit
    DMA_InitStructure.DMA_Mode =  DMA_Mode_Normal;                     //DMA_Mode_Normal(只传送一次), DMA_Mode_Circular (不停地传送)
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //(DMA传送优先级为高)
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                           //非内存到内存
    
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);                  

        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);       //使能DMA通道4传输完成中断 
                                      
        DMA_Cmd(DMA1_Channel4, ENABLE);
         
}

推荐阅读

史海拾趣

Ferroperm公司的发展小趣事

Ferroperm公司非常重视产品的品质管理。他们建立了严格的质量管理体系,从原材料采购到产品生产、检测等各个环节都实行严格的质量控制。同时,Ferroperm还注重持续改进,不断引进先进的生产设备和检测技术,提高产品的质量和性能。这种对品质的执着追求使得Ferroperm的产品在市场上获得了良好的口碑和信誉。

3E SECURITY公司的发展小趣事

在追求经济效益的同时,3E SECURITY公司始终关注社会责任。公司积极参与社会公益活动,支持教育事业和环境保护事业。同时,公司还加强了对员工的人文关怀和职业发展支持,为员工提供了良好的工作环境和成长空间。这些举措不仅提升了公司的社会形象,还增强了员工的归属感和忠诚度,为公司的长期发展奠定了坚实的基础。


请注意,以上故事纯属虚构,仅用于展示电子行业中安全公司可能的发展路径和经历。实际情况可能因公司策略、市场环境等因素而有所不同。如果您需要关于3E SECURITY公司的真实发展故事,建议您查阅相关资料或联系该公司进行了解。

Heatron公司的发展小趣事

进入21世纪后,Heatron公司开始积极寻求国际合作机会,以进一步拓展其全球业务。公司先后与多个国家的知名企业建立了战略伙伴关系,共同开发新产品、新技术。通过资源共享和市场互补,Heatron不仅成功进入了多个新兴市场,还显著提升了其品牌在国际市场上的知名度和影响力。

极海半导体(Geehy)公司的发展小趣事

随着全球对环保和节能问题的日益关注,Heatron公司积极响应号召,致力于研发和生产环保节能的电加热产品。公司投入大量资源于新材料、新技术的研发中,成功推出了一系列低能耗、高效率的加热器产品。这些产品不仅满足了市场对环保节能的需求,还进一步巩固了Heatron在电子行业中的领先地位。

Hmc Inc公司的发展小趣事

“Global Memory Tech”公司在HMC技术的研发过程中,深刻认识到国际合作的重要性。该公司积极与全球各地的科研机构、高校和行业标准组织合作,共同推动HMC技术的标准化进程。通过不懈努力,Global Memory Tech成功推动了HMC相关标准的制定,为HMC技术的广泛应用奠定了坚实基础。同时,该公司还通过技术授权和合作生产的方式,与多家国际企业建立了紧密的合作关系。

南京绿芯(Grenergy)公司的发展小趣事

另一家名为“Innovative Memory Solutions”的公司,在2008年就开始布局HMC技术的研发。经过数年的潜心研究,该公司终于在2012年推出了首款商用HMC产品。这款产品的问世,不仅解决了传统DRAM带宽受限的问题,还显著降低了系统延迟。Innovative Memory Solutions通过积极的市场推广和与OEM厂商的合作,成功将HMC技术应用于高性能计算、数据中心等领域,实现了从研发到市场的成功跨越。

问答坊 | AI 解惑

单片机的片内寄存器如何使用

这是个AD转换器 本来是信号经运放放大后接入AD的差分输入端 但是片内有可编程放大器(1-128倍) 我却不知道如何对AD片内的寄存器编程 有谁用过么?…

查看全部问答>

模拟电路版块又有了一位新版主

今天早上发现我们模拟版块又多了一位新版主ttianjiao,欢迎啊!…

查看全部问答>

加载驱动DLL

奇怪了,请问各位 我在CE的工程文件夹Release中修改platform.reg和platform.bib 然后make image 来向内核添加DLL驱动 之后在CE系统下的注册表编辑器中查看buildIn 发现已经添加成功 但是为什么驱动不能打开呢?…

查看全部问答>

关于MicrosoftActiveSync 同步文件夹

大家好,MicrosoftActiveSync 我设置文件同步后,我的桌面会有“WM_Administrat My Documents”这个文件, 可是,我电脑重启以后,我还要重新设置文件同步,“WM_Administrat My Documents”就已经没用了, 这是怎么回事啊,我现在需要一个固定的 ...…

查看全部问答>

印制板短路检测电路

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 …

查看全部问答>

STM8,PA2外部输入高,GPIO_ReadInputPin(GPIOA,GPIO_PIN_2)返回多少?

函数原型是 BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)…

查看全部问答>

关于2812数据存储的问题

请问大家,2812是一个32位的处理器,是不是意味着再想起内部saram存取数据时都是一次存取32位吗?如果是的话,我现在用的AD是16位的,那存进ram时是不是2812的高16位清0啊,还是分两个字节存取阿?还有就是2812的数据线只有16根,这就意味着2812访 ...…

查看全部问答>

运放稳定性-(第三第四部分)

本帖最后由 dontium 于 2015-1-23 13:28 编辑 第三部分:Ro与Rout 第四部分:环路稳定性主要技巧与经验 …

查看全部问答>

【M4开发板Hanker试用狂-Shower.Xu】-10、《寄人》-从SD卡更新字库到Flash

最近学习遇到障碍了,换了个方向,捣鼓了一下汉字库的更新,方法很多,从SD更新可能方便些。谁知道本以为简单的一个程序,也花费了快一周的时间....老规矩,图,视频,代码$(\'swf_dyb\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height ...…

查看全部问答>

2600-PCT-x/4200-PCT-x参数曲线跟踪仪配置

  可配置功率电平 : – From 200V to 3kV – From 1A to 100A • 动态范 围宽: – From μV to 3kV – From fA to 100A • 电容-电压方法: – ±400V多 频C-V – 200V斜 坡速率 C-V – 20V甚 低频 (VLF ) C-V R ...…

查看全部问答>