出现的问题:
先使用USART中断函数接收数据,判断是否接收到每帧数据的起始标记字符。如果接收到就关闭USART中断,然后开启DMA用于后续串口数据的接收。但是出现一个问题是每帧数据的起始标记为:A5 4A 05 00 00 40 81
然后开启DMA传输后所接收收到的第一个数据为0x81,也就是起始标志字符的最后一个数据。
造成这样问题的原因是:
在USART初始化时使用了函数:USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
虽然此时DMA没有被使能,但是硬件上已经开始做DMA传输检测了。
解决办法:
将函数:USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);从串口初始化函数中删除掉,然后和使能DMA传输函数放在一起。这样就成功解决问题了
关键字:STM32 USART 接收数据 DMA传输
引用地址:
STM32的USART接收数据通过DMA传输所遇到的问题
推荐阅读最新更新时间:2024-03-16 15:43
【STM32】HAL库-备份寄存器(BKP)
简介 备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。 他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。 当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。 使能对备份寄存器和RTC的访问 复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。执行以下操作可以使能对备份寄存器和RTC的访问。 通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟 电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。 使用电池或其他电源连接到VBAT脚上,当VDD断电时,可以保存
[单片机]
STM32学习笔记-STM32堆栈区(一)
一个由C/C++编译的程序占用的内存分为以下几个部分: 栈区(stack):编译器自动分配释放,存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 程序代码区—存放函数体的二进制代码 编译后,各个区存储内容举例说明如下:
[单片机]
stm32GPIO中的8种模式
一、推挽输出:可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。 二、开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。开漏形式的电路有以下几个特点:
[单片机]
STM32F103xC 之 USART/UART分解
芯片:STM32F103RCT6 (64pin ,256K ,LQFP ,-40~85) 对象:USART STM32F103xC 芯片嵌入三个通用同步/异步接收器发送器(USART1,USART2和USART3)和两个通用异步接收器发送器(UART4和UART5)。 这五个接口提供异步通信,IrDA SIR ENDEC支持,多处理器通信模式,单线半双工通信模式,并具有LIN主/从功能。 USART1接口能够以高达4.5 Mbit / s的速度进行通信(连接APB2总线)。 其他可用接口的通信速率高达2.25 Mbit / s(连接APB1总线)。 USART1,USART2和USART3还提供CT
[单片机]
keil环境下stm32 对printf映射
printf虽然是C语言的标准函数,但是是针对有stdin, stdout设备的系统的,在嵌入式平台上是没有标准的stdin, stdout的,需要映射到串口后某个输出对象的,而嵌入式平台各不相同,如果又没有操作系统的支持,就只能靠自己实现了,因此STM32下的printf不在标准库里,而在定制的库里。而且一般在嵌入式平台一般也不用printf,可以自己使用sprintf()函数先将数据格式化到缓冲里,然后数据想输出到哪里就输出到哪里。 如果使用的是MDK,请在工程属性的“Target“-》”Code Generation“中勾选”Use MicroLIB“ #ifndef __UART_INTERFACE_H #defin
[单片机]
STM32-自学笔记(8.使用STM32的SysTick定时器控制LED灯闪烁)
SysTick定时器,被称为“系统节拍时钟”。SysTick属于ARM Cortex-M3内核的一个内设,STM32也带有SysTick定时器。 SysTick定时器的基本结构 SysTick工作原理: SysTick从时钟源接口获得时钟驱动 从重装寄存器将重装值读入当前计数寄存器中,并在时钟驱动下进行减一计数。 当SysTick发生下溢时,将计数标志位置位,并且触发SysTick溢出中断,同时进行一次重装值载入操作。 实验说明: 使用STM32的SysTick定时器产生长度为1s的时间间隔,并以此时间间隔闪烁LED灯。 硬件电路: GPIOA.4引脚接LED灯,再接一个限流电阻,最后接地。如图 软件设
[单片机]
STM32 EXTI外部中断
外部中断引脚配置初始化:以PA0为例说明 1、外设端口时钟打开 RCC- APB2ENR|=1 2; //使能PORTA时钟 2、端口设置为输入 GPIOA- CRL&=0XFFFFFFF0;//PA0设置成输入 GPIOA- CRL|=0X00000008; 3、端口选择上拉/下拉方式 GPIOA- ODR&=0xFFFFFFFE; //A0默认下拉 4、中断触发方式选择 Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发 5、嵌套向量中断控制(抢占优先级,响应优先级,组) MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //抢占2,子优先级2,组2
[单片机]
STM32 HAL库学习系列第11篇---定时器TIM---看门狗基本配置及使用
基本配置 使用cube配置溢出时间 记住准时喂狗 独立看门狗: /* IWDG 1s 超时溢出 */ MX_IWDG_Init(IWDG_PRESCALER_64,625); /* 启动独立看门狗 */ HAL_IWDG_Start(&hiwdg); LED1_ON; /* while部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控 * 如果我们知道这部 分代码的执行时间,比如是50ms,那么我们可以设置独立看门狗的 * 溢出时间是60ms,比50ms多一点, 如果要被监控的程序没有跑飞正常执行的话,那么 * 执行完毕之后就会执行喂狗的程序,如果程序跑飞
[单片机]