stm32f103 DMA接收定长数据和不定长数据

发布者:创意火花最新更新时间:2020-08-03 来源: 51hei关键字:stm32f103  DMA接收  定长数据  不定长数据 手机看文章 扫描二维码
随时随地手机看文章

最近做了DMA接收定长数据和不定长数据的程序,现在来分享一下定长:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "dma.h"


#define USART1_RXBUF_SIZE 200        //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.

u8 u1rxbuf[USART1_RXBUF_SIZE];        //发送数据缓冲区1
u8 u2rxbuf[USART1_RXBUF_SIZE];        //发送数据缓冲区2
u8 witchbuf=0;                  //标记当前使用的是哪个缓冲区,0,使用u1rxbuf;1,使用u2rxbuf;

u16 rxcnt=0;

//处理DMA1 通道5的接收完成中断
void DMA1_Channel5_IRQHandler(void)
{
                if(DMA_GetITStatus(DMA1_IT_TC5)!= RESET)//DMA接收完成标志
                {
                                DMA_Cmd(DMA1_Channel5, DISABLE );   //关闭USART1 TX DMA1 所指示的通道  
                                if(witchbuf)                        //之前用的u2rxbuf,切换为u1rxbuf
                                {
                                                //printf("use u1rxbufrn");
                                                DMA1_Channel5->CMAR=(u32)u1rxbuf;
                                                witchbuf=0;                     //下一次切换为u2rxbuf
                                }else                               //之前用的u1rxbuf,切换为u2rxbuf
                                {
                                                //printf("use u2rxbufrn");
                                                DMA1_Channel5->CMAR=(u32)u2rxbuf;
                                                witchbuf=1;                     //下一次切换为u1rxbuf
                                }
                                rxcnt+=200;
                                DMA_SetCurrDataCounter(DMA1_Channel5,USART1_RXBUF_SIZE);//DMA通道的DMA缓存的大小
                                DMA_Cmd(DMA1_Channel5, ENABLE);     //使能USART1 TX DMA1 所指示的通道        
                                DMA_ClearITPendingBit(DMA1_IT_TC5); //清除中断标志  
                }
}
//初始化IO 串口2
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率         
void USART2_Init(u32 bound)
{  
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);//使能GPIOA,D时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;        //PA2
    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_3;//PA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位

         
    USART_InitStructure.USART_BaudRate = bound;//波特率设置
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
    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(USART2, &USART_InitStructure); ; //初始化串口

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

}


int main(void)
{         
        u16 i;
        u16 pro=0;//进度
  u8 oldsta=0;
  u8 *p;

        delay_init();                     //延时函数初始化         
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
  USART2_Init(115200);
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();                                   //初始化LCD         
//        KEY_Init();                                //按键初始化
  POINT_COLOR=RED;//设置字体为红色
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");         

  USART1_DMA_RX_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)u1rxbuf,USART1_RXBUF_SIZE);//设置串口1的DMA接收
  USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);    //使能串口1的DMA接收     

         
        LCD_ShowString(30,70,200,16,16,"DMA TEST");                  
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/15");        
         LCD_ShowString(30,130,200,16,16,"KEY0:Start");
                  
        i=0;
        while(1)
        {   
      if(oldsta!=witchbuf)
                        {
                                        oldsta=witchbuf;
                                        if(oldsta)p=u1rxbuf;    //当前正在使用u2rxbuf接收,所以u1rxbuf是有数据的
                                        else p=u2rxbuf;
                                        for(i=0;i                                        {
                                                        USART2->DR=p;  
                                                        while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
                                        }  
                        }               
        }
}



不定长:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "dma.h"

/************************************************
************************************************/



#define USART1_RXBUF_SIZE 200        //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.

extern u8 receive_data[128];        //发送数据缓冲区1
extern u8 receive_flag;

int main(void)
{         
        delay_init();                     //延时函数初始化         
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();                                   //初始化LCD         

  USART1_DMA_RX_Config();//设置串口1的DMA接收
        
  POINT_COLOR=RED;//设置字体为红色
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");                     
        LCD_ShowString(30,70,200,16,16,"DMA TEST");                  
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/15");        
         LCD_ShowString(30,130,200,16,16,"KEY0:Start");
        while(1)
        {   
                while(receive_flag == 0);
                receive_flag = 0;
                printf("%s",receive_data);
        }
}

[1] [1]
关键字:stm32f103  DMA接收  定长数据  不定长数据 引用地址:stm32f103 DMA接收定长数据和不定长数据

上一篇:STM32 IIC通信之PAJ7620U2手势识别模块驱动程序源码详解
下一篇:基于STM32F103平台CANOPEN工业协议源码

推荐阅读最新更新时间:2024-11-06 12:40

基于STM32F103入门1——点亮LED灯
1:新建固件库工程文件 1.1找到一个固件库模板 1.2:打开KEIL5新建工程 最终效果: 1.3:添加相关文件 然后我们针对不同文件夹 我们添加不同的文件进来。 双击STARTUP 添加我们固件库的启动文件 STARTUP:添加Libraries—— CMSIS—— startup中的启动文件 USER:添加固件库的User文件夹中的.c文件 CMSIS 添加Libraries—— CMSIS文件夹中的.c文件 DOC:添加固件库中Doc文件夹的readme.txt FWLIB:添加Libraries—— STM32F10x_StdPeriph_Driver文件夹中的.c文件 添加完效
[单片机]
基于<font color='red'>STM32F103</font>入门1——点亮LED灯
STM32F103串口1和串口2不同波特率之间交换数据问题
前几天写一个东西,要用到STM32F103的串口1和串口2以不同的波特率交换数据,也就是说串口1波特率为9600,串口2波特率为115200,串口1可以把接收到的数据通过串口2发送出去,串口2也可以把接收到的数据通过串口1发送出去。低波特率向高波特率发送数据没问题,高波特率向低波特率发送数据会丢数据,原因是低波特率的串口还没发送完数据高波特率的串口就又发数据过来了,处理不过来。在同事的在帮助下,写出一个先进先出环形队列(FIFO)程序。接收数据用中断,发送数据用在主函数中查询发送完成标志位。希望对大家有点帮助,可能程序不完美,但程序可以用。定义一个fifo.h部件和一个fifo.c文件。其他的都在主函数中调用。 #ifndef
[单片机]
STM32F103RC不能下载的原因分析
STM32F103RC不能下载的原因分析 第一次用STM32,用的是STM32F103RC,折腾了两天才能下载程序。我想整个步骤告诉大家,以防再范同样的错误。 1、焊接电源,测试电源没问题之后焊接STM32,之后焊接MAX3232。 2、给电路板供电,此时STM32的VDDA,Vbat是没有供电的,接上串口,打开FLASH loader软件,点下一步,不能识别。 3、在2的基础上给Vbat供电,仍旧不能识别。 4、在2的基础上给VDDA供电,仍旧不能识别。 5、打电话给利源的技术支持,要求Boot1接地。在2的基础上将Boot1接地,仍旧不能识别。 6、看datesheet,用户FLASH存储器被选作B
[单片机]
基于stm32f103zet6的外部中断学习
一、关于中断中的结构体EXTI_InitTypeDef 原型:uint32_t EXTI_InitTypeDef::EXTI_Line { uint32_t EXTI_Line FunctionalState EXTI_LineCmd EXTIMode_TypeDef EXTI_Mode EXTITrigger_TypeDef EXTI_Trigger }含有4个成员 1、Specifies the EXTI lines to be enabled or disabled. This parameter can be any combination of EXTI_Lines EXTI_Lines的取值可以是下面的数字 #defi
[单片机]
STM32F103之IAR调试配置
一、简介 本文以STM32F103为例,介绍IAR for RAM 7.20如何配置STM32F103调试工程。 二、实验平台 电脑平台:Windows7 64位旗舰 编译软件:IAR for RAM 7.20 硬件平台:STM32F103 烧录器:ST-LINK V2 三、版权声明 四、实验前提 1、在进行本文步骤前,请先安装IAR for RAM 7.20版本;准备好STM32F103硬件及烧录平台。 五、基础知识 暂无 六、源码地址 暂无 七、关联文章 暂无 八、实验内容 1.配置工程
[单片机]
<font color='red'>STM32F103</font>之IAR调试配置
新一代嵌入式微处理器STM32F103的开发与应用
   摘要: 基于Co rtex- M3内核的STM 32F103系列芯片是新型的32位嵌入式微处理器, 它是不需操作系统的ARM, 其性能远高于51系列单片机, 但开发过程与51系列单片机一样简便, 因而在很多应用场合可替代51系列单片机。本文从STM 32F103系列芯片性能特点和片上资源入手, 重点介绍其开发工具以及开发流程。并以温度测量为例, 具体说明了基于Keil? Vision4软件的工程建立、源程序编辑、编译, 基于J- L ink仿真器的程序下载, 程序在线调试, 片上运行等过程, 最终测量的温度转换为数字量, 通过串口发送至PC 机显示。    1 引言   嵌入式微处理器正越来越广泛的应用在生产生活的各个领
[安防电子]
新一代嵌入式微处理器<font color='red'>STM32F103</font>的开发与应用
STM32f103 tim3_etr完成高频信号的频率计算
简介:timx可以定时,可以进行输入捕获,输入捕获可以测频率可测脉冲宽度,这就是这个实验要用到的功能。测量脉冲个数:每一个TIM都一个自己的计数器,和一个自己的预装载寄存器ARR.这里既然这是为了计数,那么设置ARR的值为0xFFFF,最大值。 学习stm32已经有一段时间了,接到第一个项目的时候是关于stm32f051的ad配置和da配置,本科时候连51都没接触过的人一上来就是32位单片机,着实让我蛋疼菊紧的很。还好慢慢的啃了中文手册和网上的一些例程,总算是完成的功能。这些个有时间再整理上传吧。 之后又弄了些103的东西,今天主要整理一下在进行信号频率计算的时候遇到的一些问题和解决办法,以便日后查看。也希望给碰到类似问题
[单片机]
STM32串口DMA超时接收方法,可大大节约CPU时间
本办法使用定时器定时查询DMA接收到的数据,如果超过设定的周期则认为本次数据包结束,将数据拷贝到缓冲区,交由其他程序处理。可以接收任意大小的数据包,尤其适用于MODBUS等协议,曾经用于GPS、GPRS等接收,很实用。本方法占用CPU时间极少,尤其是波特率很高时,效果更加明显。 当某一个串口的数据接收超时以后,定时器中断中将数据拷贝到缓冲区,在主程序中可以判断数据标志UART1_Flag,大于0的时候即代表有数据接收到,可以处理,处理完后将此变量清零即可。 两个数据包间隔较小时,可以将定时器的周期调短些。 //超时时间定义 #define UART1_TimeoutComp 2 //20ms #define UART2
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved