<map id="nQXxZ"><datalist id="nQXxZ"><bdo id="nQXxZ"></bdo></datalist></map><td id="nQXxZ"></td>

    • <sup id="nQXxZ"><param id="nQXxZ"><samp id="nQXxZ"></samp><source id="nQXxZ"><form id="nQXxZ"></form></source></param></sup>
    • <samp id="nQXxZ"></samp>

        电子资讯网 > 控制/MCU > 正文

        如何采用STM32单片机读取可变长度数据到内存

        2020年04月01日 14:33 ? 次阅读

        首先要解决DMA怎么知道要接收的数据何时开始,何时结束的问题。而且每次传输完数据,要改变下一次数据长度。

        如果把DMA设成循环模式肯定是不行的,所以把DMA设置成正常模式。

        STM32的串口有监测总线是否处于空闲的功能,我们可以使用这个功能,当数据传输完总线变成空闲状态时产生中断,来对收到的数据进行处理。因此整个过程就变成:当一堆数据开始传输,DMA默默地把数据搬运到内存中,当这堆数据传输完成,总线变成空闲状态时,马上产生中断,在中断服务程序中去做相应处理。

        如何采用STM32单片机读取可变长度数据到内存

        初始化程序:

        #defineDMA_Rec_Len10//数据缓冲区大小

        u8value[DMA_Rec_Len];

        voiduart_init_DMA_IN(u32bound)

        {

        //GPIO端口设置

        GPIO_InitTypeDefGPIO_InitStructure;

        USART_InitTypeDefUSART_InitStructure;

        NVIC_InitTypeDefNVIC_InitStructure;

        DMA_InitTypeDefDMA_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//使能USART1,GPIOA时钟

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA传输

        //RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

        USART_DeInit(USART1);//复位串口1

        //USART1_TXPA.9

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA.9

        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出

        GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA9

        //USART1_RXA.10

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入

        GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA10

        //Usart1NVIC配置

        NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreempTIonPriority=3;//抢占优先级3

        NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//子优先级3

        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能

        NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化VIC寄存器

        //USART初始化设置

        USART_InitStructure.USART_BaudRate=bound;//一般设置为9600;

        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(USART1,&USART_InitStructure);//初始化串口

        USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);//开启空闲中断

        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);//使能串口1DMA接收

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

        //相应的DMA配置

        DMA_DeInit(DMA1_Channel5);//将DMA的通道5寄存器重设为缺省值串口1对应的是DMA通道5

        DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART1-》DR;//DMA外设ADC基地址

        DMA_InitStructure.DMA_MemoryBaseAddr=(u32)value;//DMA内存基地址

        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//数据传输方向,从外设读取发送到内存

        DMA_InitStructure.DMA_BufferSize=DMA_Rec_Len;//DMA通道的DMA缓存的大小

        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址寄存器不变

        DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存地址寄存器递增

        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//数据宽度为8位

        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;//数据宽度为8位

        DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//工作在正;捍婺J

        DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//DMA通道x拥有中优先级

        DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//DMA通道x没有设置为内存到内存传输

        DMA_Init(DMA1_Channel5,&DMA_InitStructure);//根据DMA_InitStruct中指定的参数初始化DMA的通道

        DMA_Cmd(DMA1_Channel5,ENABLE);//正式驱动DMA传输

        }

        中断服务程序:

        voidUSART1_IRQHandler(void)//串口1中断服务程序

        {

        chari;

        if(USART_GeTITStatus(USART1,USART_IT_IDLE)!=RESET)//接收中断(接收到的数据必须是0x0d0x0a结尾)

        {

        USART_ReceiveData(USART1);//读取数据注意:这句必须要,否则不能够清除中断标志位。

        Usart1_Rec_Cnt=DMA_Rec_Len-DMA_GetCurrDataCounter(DMA1_Channel5);//算出接本帧数据长度

        //***********帧数据处理函数************//

        printf(“Thelenght:%d\r\n”,Usart1_Rec_Cnt);

        printf(“Thedata:\r\n”);

        for(i=0;i

        {

        USART_SendData(USART1,value[i]);

        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

        }

        printf(“\r\nOver!\r\n”);

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

        USART_ClearITPendingBit(USART1,USART_IT_IDLE);//清除中断标志

        DMA_Cmd(DMA1_Channel5,DISABLE);

        //重新设置传输数据长度

        DMA_SetCurrDataCounter(DMA1_Channel5,DMA_Rec_Len);

        DMA_Cmd(DMA1_Channel5,ENABLE);//开始下一次DMA

        }

        }

        设置DMA为正常模式,即只传输一次,当完成一次数据传输后,进入中断,对接收到的数据进行处理。然后清除中断标志,重新启动DMA进行下一次传输。

        下载发烧友APP

        打造属于您的人脉电子圈

        关注电子资讯微信

        有趣有料的资讯及技术干货

        关注发烧友课堂

        锁定最新课程活动及技术直播

        电子资讯观察

        一线报道 · 深度观察 · 最新资讯
        收藏 人收藏
        分享:

        评论

        相关推荐

        STM32单片机固件库建立工程的方法及步骤

        1,新建项目,在新建工程的目录下新建几个文件夹: A,CORE (用来存放启动文件) B...

        发表于 2020-04-01 14:43 ? 0次阅读
        STM32单片机固件库建立工程的方法及步骤

        如何采用STM32单片机中断向量控制器NVIC来...

        先占优先级的概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后...

        发表于 2020-04-01 16:17 ? 27次阅读
        如何采用STM32单片机中断向量控制器NVIC来...

        stm32单片机按键控制的用法解析

        1 /* 2 ::按键控制 3 PA8接LED,PE2接按键 4 */ 5 ...

        发表于 2020-04-01 16:14 ? 42次阅读
        stm32单片机按键控制的用法解析

        STM32单片机串口DMA解析

        STM32有两个DMA控制器(DMA2只存在于大容量产品中),DMA1有7个通道,DMA2有5个通道...

        发表于 2020-04-01 15:40 ? 25次阅读
        STM32单片机串口DMA解析

        STM32单片机对TFTLCD的驱动设计

        TFTLCD使用80并口,80 并口有如下一些信号线: CS: TFTLCD 片选信号。 ...

        发表于 2020-04-01 14:42 ? 54次阅读
        STM32单片机对TFTLCD的驱动设计

        STM32单片机半主机模式的应用

        若出现如下编译错误:Error: L6915E: Library reports error: __...

        发表于 2020-04-01 15:43 ? 59次阅读
        STM32单片机半主机模式的应用

        STM32单片机PID算法的原则及应用方法

        一、总体原则 PID调试一般原则 a.在输出不振荡时,增大比例增益P。 b.在输出...

        发表于 2020-04-01 15:31 ? 70次阅读
        STM32单片机PID算法的原则及应用方法

        STM32单片机定时器的时钟源设置

        名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总...

        发表于 2020-04-01 15:30 ? 35次阅读
        STM32单片机定时器的时钟源设置

        如何将STM32单片机中的函数调用到入口参数

        STM32—数组作为被调用函数的入口参数时,要两个条件, 1:数组首地址 2:数组长度 ...

        发表于 2020-04-01 15:05 ? 54次阅读
        如何将STM32单片机中的函数调用到入口参数

        STM32F105系列单片机对USB设备电路的设...

        当STM32F105配置为USB设备时, PA9/OTG_FS_VBUS是用来检测presense ...

        发表于 2020-04-01 15:10 ? 85次阅读
        STM32F105系列单片机对USB设备电路的设...

        STM32单片机SysTick系统滴答功能解析

        其实,SysTick能实现的功能,都可以由TIM来实现。SysTick无非就是定时中断的功能,它完全...

        发表于 2020-04-01 14:27 ? 56次阅读
        STM32单片机SysTick系统滴答功能解析

        如何采用STM32单片机来产生PWM输出

        STM32的定时器除了基本定时器TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高...

        发表于 2020-04-01 16:27 ? 217次阅读
        如何采用STM32单片机来产生PWM输出

        如何升级STM32单片机的代码

        bootloader设置: static void check_boot_mode(void)...

        发表于 2020-04-01 15:53 ? 78次阅读
        如何升级STM32单片机的代码

        STM32单片机的PWM输入捕获模式设计

        (TIM_GetITStatus(TIM3,TIM_IT_CC1)==SET)//{ic1=TIM_...

        发表于 2020-04-01 14:50 ? 92次阅读
        STM32单片机的PWM输入捕获模式设计

        STM32单片机的FSMC对TFT的驱动

        开始只是谈到别人对FSMC的理解,注意这里只讨论FSMC控制TFT,也就是在FSMC的NOR\PSR...

        发表于 2020-04-01 14:22 ? 70次阅读
        STM32单片机的FSMC对TFT的驱动

        STM32单片机对NAND Flash的读写以及...

        NAND Flash的容量较大。整片Flash分为若干个块(Block),每个Block分为若干个页...

        发表于 2020-04-01 15:47 ? 466次阅读
        STM32单片机对NAND Flash的读写以及...

        STM32单片机对Systick心跳定时器的设计

        用途: 1.产生操作系统的时钟节拍 2.便于不同处理器之间程序移植 SysTick...

        发表于 2020-04-01 15:44 ? 80次阅读
        STM32单片机对Systick心跳定时器的设计

        如何采用STM32单片机实现IAP功能

        IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运...

        发表于 2020-04-01 15:33 ? 82次阅读
        如何采用STM32单片机实现IAP功能

        STM32单片机的独立看门狗和窗口看门狗的特点及...

        IWDG是一个独立看门狗,具有独立于系统的时钟,与片外看门狗更为相似,使用片内独立的阻容时钟发生电路...

        发表于 2020-04-01 15:28 ? 117次阅读
        STM32单片机的独立看门狗和窗口看门狗的特点及...

        如何在STM32单片机中加入RDP功能

        沿用之前CM3核的STM32F10X系列的加入RDP功能,之后在Segger的Unsecured C...

        发表于 2020-04-01 15:22 ? 87次阅读
        如何在STM32单片机中加入RDP功能

        如何利用STM32单片机串口发送字符串

        最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM3...

        发表于 2020-04-01 16:01 ? 92次阅读
        如何利用STM32单片机串口发送字符串

        STM32单片机中的独立看门狗与窗口看门狗有哪些...

        1.关于看门狗的解释不再说明,窗口看门狗简而言之即只能看某个窗口期即某段时间内才能够喂狗。32的独立...

        发表于 2020-04-01 15:55 ? 76次阅读
        STM32单片机中的独立看门狗与窗口看门狗有哪些...

        如何采用STM32中的控制定时器Tim1实现计数...

        STM32中的高级控制定时器(Tim1)是由一个16位的自动装载计数器组成,它由一个可编程预分频器驱...

        发表于 2020-04-01 15:25 ? 121次阅读
        如何采用STM32中的控制定时器Tim1实现计数...

        如何使用STM32单片机实现DMA的同时发送和接...

        在SPI通信中,可以同时开启发送和接收DMA请求,自动数据的发送和接收,完成数据的交换 基本步...

        发表于 2020-04-01 15:26 ? 111次阅读
        如何使用STM32单片机实现DMA的同时发送和接...

        STM32单片机优先级的定义

        先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占...

        发表于 2020-04-01 15:09 ? 87次阅读
        STM32单片机优先级的定义

        如何计算单片机的波特率

        在这个公式上,共有三个变量,其中两个我们是知道的,Fck和Tx/Rx波特率这两个是已知的,USART...

        发表于 2020-04-01 16:15 ? 122次阅读
        如何计算单片机的波特率

        STM32单片机的USART接收数据问题解决方案

        先使用USART中断函数接收数据,判断是否接收到每帧数据的起始标记字符。如果接收到就关闭USART中...

        发表于 2020-04-01 15:36 ? 87次阅读
        STM32单片机的USART接收数据问题解决方案

        如何采用STM32单片机产生PWM

        STM32产生PWM是非常的方便的,要需要简单的设置定时器,即刻产生! (1)使能定时器时钟:...

        发表于 2020-04-01 15:36 ? 134次阅读
        如何采用STM32单片机产生PWM

        如何构建STM32单片机keil的开发环境

        在工程文件下,新建Startup、Headers、User、Libraries、CMSIS、List...

        发表于 2020-04-01 14:52 ? 103次阅读
        如何构建STM32单片机keil的开发环境

        STM32单片机USB速度慢的原因解析

        全速的USB设备,最大速度12Mb/s,但是如果跑的是HID之类慢速设备的协议,那么速度就没有那么快...

        发表于 2020-04-01 15:06 ? 164次阅读
        STM32单片机USB速度慢的原因解析

        STM32单片机的EXIT中断解析

        工程概要说明:定义一个按键(可自己定义),每按键一次,响应中断一次,在中断函数中LED提示灯变化一次...

        发表于 2020-04-01 15:04 ? 118次阅读
        STM32单片机的EXIT中断解析

        STM32单片机GPIO寄存器的功能解析

        对于GPIO端口,每个端口有16个引脚,每个引脚的模式由寄存器的四个位控制,每四位又分为两位控制引脚...

        发表于 2020-04-01 14:54 ? 176次阅读
        STM32单片机GPIO寄存器的功能解析

        STM32单片机对ADS1246芯片的驱动

        ADS1246的SPI时序,这个是需要提一下的,一般来说,SPI协议在上升沿锁存数据,下降沿更新数据...

        发表于 2020-04-01 14:39 ? 111次阅读
        STM32单片机对ADS1246芯片的驱动

        STM32单片机的can总线的配置

        CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式 ...

        发表于 2020-04-01 14:31 ? 200次阅读
        STM32单片机的can总线的配置

        STM32单片机的SYSTick定时器的设置

        SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时...

        发表于 2020-04-01 14:27 ? 97次阅读
        STM32单片机的SYSTick定时器的设置

        STM32单片机FSMC的使用解析

        LCD有如下控制线: CS:Chip Select片选,低电平有效 RS:Registe...

        发表于 2020-04-01 14:17 ? 96次阅读
        STM32单片机FSMC的使用解析

        STM32单片机如何实现规则多通道转换

        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR...

        发表于 2020-04-01 16:22 ? 135次阅读
        STM32单片机如何实现规则多通道转换

        STM32单片机的断言机制函数assert_pa...

        这个宏定义的作用就是检查参数PERIPH,判断参数PERIPH是否为GPIOX(A.。.G)基址中的...

        发表于 2020-04-01 16:10 ? 119次阅读
        STM32单片机的断言机制函数assert_pa...

        如何采用STM32单片机实现SPI的驱动

        void SPI_cfg(void){ SPI_InitTypeDef SPI_InitStr...

        发表于 2020-04-01 15:56 ? 128次阅读
        如何采用STM32单片机实现SPI的驱动

        STM32单片机对红外接收系统的设计

        红外接收头一般是接收、放大、解调一体头,一般红外信号经接收头解调后,数据“0”和“1”的区别通常体现...

        发表于 2020-04-01 15:32 ? 116次阅读
        STM32单片机对红外接收系统的设计

        STM32单片机的IAP向量问题解决方案

        // 1:复制用户代码中的中断向量表到SRAM首地址 // 2: 开启SRAM的重映射功能,将...

        发表于 2020-04-01 15:24 ? 110次阅读
        STM32单片机的IAP向量问题解决方案

        STM32单片机的ADS1115通过模拟I2C驱...

        收获:对于I2C通信协议的理解更加深刻,对ADS1115也能进行单通道的使用。I2C的开始、发送/读...

        发表于 2020-04-01 16:49 ? 127次阅读
        STM32单片机的ADS1115通过模拟I2C驱...

        STM32单片机SPI的使用原理解析

        GPIO_InitTypeDef GPIO_InitStructure; //配置SPI2管脚...

        发表于 2020-04-01 16:35 ? 104次阅读
        STM32单片机SPI的使用原理解析

        STM32单片机重映射USART设计

        外部中断(EXTI)中与AFIO有关的寄存器是AFIO-EXTICR1、2、3,它们是用来选择EXT...

        发表于 2020-04-01 16:27 ? 79次阅读
        STM32单片机重映射USART设计

        STM32单片机的ADC多通道采样

        这里使用的是3362电位器(10K),即用STM32来测量PB0和GND两端的电压,这样的电路设计比...

        发表于 2020-04-01 16:12 ? 132次阅读
        STM32单片机的ADC多通道采样

        STM32单片机的CPU运行性能的算法测试

        此算法是基于操作系统的,理论上不限于任何操作系统,只要有任务调度就可以。本文将以FreeRTOST为...

        发表于 2020-04-01 16:01 ? 316次阅读
        STM32单片机的CPU运行性能的算法测试

        如何将STM32单片机的JTAG口作为GPIO使...

        针对F4系列,STM32F4库函数中,已经取消了GPIO_*PinRemapConfig()函数,对...

        发表于 2020-04-01 16:43 ? 115次阅读
        如何将STM32单片机的JTAG口作为GPIO使...

        STM32单片机的usb上电和断电函数的定义

        usb_pwr.c 这个文件看文件名就知道跟功耗有关了,有很多的状态:上电、掉电、挂起、恢复。

        发表于 2020-04-01 16:35 ? 106次阅读
        STM32单片机的usb上电和断电函数的定义

        STM32单片机对CAN过滤器的设置方法

        在使用STM32的CAN控制器进行数据收发,当用到位屏蔽模式的时候,就要设置过滤器了,这个关系到是否...

        发表于 2020-04-01 16:25 ? 123次阅读
        STM32单片机对CAN过滤器的设置方法

        如何通过STM32驱动nRF24L01发送数据

        最近在一个项目中用到了nRF24L01这个无线2.4G收发芯片,项目中有主机和分机,默认都是使用数据...

        发表于 2020-04-01 15:53 ? 104次阅读
        如何通过STM32驱动nRF24L01发送数据

        STM32单片机ADC的模拟看门狗的测试

        ADC的模拟看门狗用于检查电压是否越界。他又上下两个边界,可分别在寄存器ADC_HTR和ADC_LT...

        发表于 2020-04-01 16:49 ? 149次阅读
        STM32单片机ADC的模拟看门狗的测试

        STM32单片机对正交编码器的驱动

        STM32正交编码器驱动,引入(突变)带进位的位置环和速度环

        发表于 2020-04-01 16:12 ? 70次阅读
        STM32单片机对正交编码器的驱动

        如何利用STM32单片机发送字符串

        一、STM32有自己的字符发送函数。 void PC_SendChar(uint8_t Dat...

        发表于 2020-04-01 15:26 ? 123次阅读
        如何利用STM32单片机发送字符串

        基于STM32单片机的USB时钟配置设计

        RCC_DeInit();//将外设RCC寄存器重设为缺省值 /*EnableHSE*/ ...

        发表于 2020-04-01 15:20 ? 108次阅读
        基于STM32单片机的USB时钟配置设计

        STM32单片机的低功耗模式待机唤醒设计

        将程序下载到开发板上后,LED灯会不断地亮灭,当按下KEY2键超过3s时,LED灯灭,标志着单片机进...

        发表于 2020-04-01 14:40 ? 117次阅读
        STM32单片机的低功耗模式待机唤醒设计

        STM32的ADC单次转换设计

        //先配置IO口: ADC_InitTypeDef adcInitStruct; ///...

        发表于 2020-04-01 15:40 ? 111次阅读
        STM32的ADC单次转换设计

        STM32的ADC编程方法总结

        这里的ADC转换也来使用DMA---这个也是STM32的ADC转换最常见的方式。 第一步是了解...

        发表于 2020-04-01 15:30 ? 201次阅读
        STM32的ADC编程方法总结

        STM32单片机在KIEL4配置开发中的设置

        开发环境:KIEL4,芯片STM32F103VCT6:釼C3.5 1.配置开发环境。 2....

        发表于 2020-04-01 15:01 ? 79次阅读
        STM32单片机在KIEL4配置开发中的设置

        STM32单片机TIM模块定时器向上溢出的输出比...

        首先有一点需要注意:FWLib固件库目前的最新版应该是V2.0.x,V1.0.x版本固件库中,TIM...

        发表于 2020-04-01 16:20 ? 143次阅读
        STM32单片机TIM模块定时器向上溢出的输出比...

        STM32单片机如何通过定时器的控制输出PWM

        STM32F103ZET6里共有8个定时器,其中高级定时器有TIM1-TIM5、TIM8,共6个。 ...

        发表于 2020-04-01 15:56 ? 168次阅读
        STM32单片机如何通过定时器的控制输出PWM

        在keil中仿真stm32单片机

        发表于 2020-04-01 06:54 ? 803次阅读
        在keil中仿真stm32单片机

        STM32串口SPI主从通信源程序

        发表于 2020-04-01 03:08 ? 603次阅读
        STM32串口SPI主从通信源程序

        在keil中仿真stm32单片机

        发表于 2020-04-01 01:20 ? 207次阅读
        在keil中仿真stm32单片机

        电流检测哪种方法好用?

        发表于 2020-04-01 20:37 ? 6346次阅读
        电流检测哪种方法好用?