STM32F103 UART中断接收 DMA发送

发布者:caoda143最新更新时间:2019-03-09 来源: eefocus关键字:STM32F103  UART  中断接收  DMA发送 手机看文章 扫描二维码
随时随地手机看文章

以USART3为例,


(1)首先在【stm32f1xx_hal_conf.h】中使能DMA模块,工程增加stm32f1xx_hal_dma.c。


(2)main.c中头部增加以下声明


UART_HandleTypeDef huart3;

DMA_HandleTypeDef hdma1_uart3;

(3)main.c中增加USART的初始化


/* USART3 init function */

static void MX_USART3_UART_Init(void)

{

huart3.Instance = USART3;

huart3.Init.BaudRate = 115200;

huart3.Init.WordLength = UART_WORDLENGTH_8B;

huart3.Init.StopBits = UART_STOPBITS_1;

huart3.Init.Parity = UART_PARITY_NONE;

huart3.Init.Mode = UART_MODE_TX_RX;

huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;

huart3.Init.OverSampling = UART_OVERSAMPLING_16;

if (HAL_UART_Init(&huart3) != HAL_OK)

{

Error_Handler();

}

}

(4)stm32f1xx_hal_msp.c增加


extern  UART_HandleTypeDef huart3;

extern DMA_HandleTypeDef hdma1_uart3;

 

......................

 

void HAL_UART_MspInit(UART_HandleTypeDef* huart)

{

 

GPIO_InitTypeDef GPIO_InitStruct;


if (huart->Instance == USART3)

{

/* USER CODE BEGIN USART3_MspInit 0 */

 

/* USER CODE END USART3_MspInit 0 */

/* Peripheral clock enable */

__HAL_RCC_USART3_CLK_ENABLE();

__HAL_RCC_DMA1_CLK_ENABLE();

 

/**USART3 GPIO Configuration

PB10     ------> USART3_TX

PB11     ------> USART3_RX

*/

GPIO_InitStruct.Pin = GPIO_PIN_10;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 

GPIO_InitStruct.Pin = GPIO_PIN_11;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);



hdma1_uart3.Instance = DMA1_Channel2;

hdma1_uart3.Init.Direction = DMA_MEMORY_TO_PERIPH;

hdma1_uart3.Init.PeriphInc = DMA_PINC_DISABLE;

hdma1_uart3.Init.MemInc = DMA_MINC_ENABLE;

hdma1_uart3.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;

hdma1_uart3.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;

hdma1_uart3.Init.Mode = DMA_NORMAL;

hdma1_uart3.Init.Priority = DMA_PRIORITY_LOW;

HAL_DMA_DeInit(&hdma1_uart3);

HAL_DMA_Init(&hdma1_uart3);


__HAL_LINKDMA(huart, hdmatx, hdma1_uart3);

 

HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 2, 0);

HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);


/* Peripheral interrupt init */

HAL_NVIC_SetPriority(USART3_IRQn, USART_IRQn_PP, 0);

HAL_NVIC_EnableIRQ(USART3_IRQn);


__HAL_UART_ENABLE_IT(&huart3, USART_IT_RXNE);//使能串口3  读数据寄存器非空中断RXNE

/* USER CODE BEGIN USART3_MspInit 1 */

 

/* USER CODE END USART3_MspInit 1 */

}

 

}

 

void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)

{

 

if (huart->Instance == USART3)

{

/* USER CODE BEGIN USART3_MspDeInit 0 */

 

/* USER CODE END USART3_MspDeInit 0 */

/* Peripheral clock disable */

__HAL_RCC_USART3_CLK_DISABLE();

__HAL_RCC_DMA1_CLK_DISABLE();


/**USART3 GPIO Configuration

PB10     ------> USART3_TX

PB11     ------> USART3_RX

*/

HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10 | GPIO_PIN_11);

HAL_DMA_DeInit(&hdma1_uart3);

/* Peripheral interrupt DeInit*/

HAL_NVIC_DisableIRQ(USART3_IRQn);

HAL_NVIC_DisableIRQ(DMA1_Channel2_IRQn);


__HAL_UART_DISABLE_IT(&huart3, USART_IT_RXNE);

/* USER CODE BEGIN USART3_MspDeInit 1 */

 

/* USER CODE END USART3_MspDeInit 1 */

}

 

}

(5)stm32f1xx_it.c增加


extern UART_HandleTypeDef huart3;

extern DMA_HandleTypeDef hdma1_uart3;

 

.............................

 

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

函数名称:USART3_Own_IRQHandler

函数描述:USART3中断服务自定义代码部分

输入参数:pLinuxClass:传入LINUX_OBJECT

返回值:无

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

void USART3_Own_IRQHandler(LINUX_CLASS *pLinuxClass)

{

unsigned char  ucValue;

 

// 使用了DMA发送,一定要加UART_FLAG_RXNE判断,否则成功回复一次后,会一直进下面这段,不知道原因

if ((__HAL_UART_GET_IT_SOURCE(&huart3, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE)!= RESET))// 接收中断

{

pLinuxClass->Rx_FROM_linux[pLinuxClass->Rx_FROM_linux_Counter] = (uint8_t)(huart3.Instance->DR & 0x00FF);

pLinuxClass->Rx_FROM_linux_Counter++;


if (pLinuxClass->Rx_FROM_linux_Counter >= RX_LINUX_MAX)

{

pLinuxClass->Rx_FROM_linux_Counter = 0; 

}


pLinuxClass->RX_BYTE_TimeoutCounter_Lock = 0; // 接收数据字节间超时计时器开启

pLinuxClass->RX_BYTE_TimeoutCounter = 0;


__HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_RXNE );

}


if ((__HAL_UART_GET_IT_SOURCE(&huart3, UART_IT_TC) != RESET) && (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC)!= RESET))

{

huart3.State = HAL_UART_STATE_BUSY_RX;


__HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC );


WRITE_485UN; // 485通讯方式

}


// 溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题

if (__HAL_UART_GET_FLAG(&huart3,USART_FLAG_ORE) != RESET) 

{

__HAL_UART_CLEAR_FLAG(&huart3,USART_FLAG_ORE);  // read SR


ucValue = (uint8_t)( huart3.Instance->DR & (uint8_t)0x00FF); // read DR 

}


(void)ucValue;

}

 

void USART3_IRQHandler(void)

{

/* USER CODE BEGIN USART3_IRQn 0 */

USART3_Own_IRQHandler(&LINUX_OBJECT);

/* USER CODE END USART3_IRQn 0 */

 

/* USER CODE BEGIN USART3_IRQn 1 */

 

/* USER CODE END USART3_IRQn 1 */

}

 

void DMA1_Channel2_IRQHandler(void)

{

HAL_DMA_IRQHandler(&hdma1_uart3);

}

 


关键字:STM32F103  UART  中断接收  DMA发送 引用地址:STM32F103 UART中断接收 DMA发送

上一篇:stm32定时器实现PWM输出控制无源蜂鸣器(HAL)
下一篇:STM32——高级定时器、通用定时器、基本定时器的区别

推荐阅读最新更新时间:2024-03-16 16:25

UART】USCI:UART模式
msp430f541x、msp430f543x多达4个通用串行通信接口(USCI)模块,支持多种串行通信模式,不同的 USCI 模块支持不同的模式。 USCI_Ax模块支持: UART模式; IrDA通信的脉冲整形; LIN通信的自动波特率检测; SPI模式; USCI_Bx模块支持: IIC模式; SPI模式; UART模式: 在异步模式下,USCI_Ax模块通过两个外部引脚UCAxRXD和UCAxTXD将芯片连接到外部系统。当UCSYNC 位清零时,选择UART模式。 UART模块特征包括: 带奇校验、偶校验或非奇偶校验的7或8位数据;
[单片机]
SPI,UART,I2C都有什么区别,及其各自的特点
区别: SPI:高速同步串行口。3~4线接口,收发独立、可同步进行 UART:通用异步串行口。按照标准波特率完成双向通讯,速度慢 I2C:一种串行传输方式,三线制,网上可找到其通信协议和用法的 3根线实现数据双向传输 串行外围接口 Serial peripheral interface UART:通用异步收发器 UART是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能: 将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字
[单片机]
STM32开发 -- UART应用层通信协议分析
拿到一份UART的通信协议,上手来操作之前先做一下分析。 一、帧格式说明 先看一下它的帧格式说明: 1、 帧头标志Head 不论是命令帧还是响应帧,帧头标志都是0x92。 2、 协议版本 协议版本号(4bit),目前值为1 加密方式(4bit),0表示采取“数据不加密+校验和”方式。 所以,当前此字段完整值为0x10 3、 控制字段中的C/R比特 用于指示该帧是命令帧还是应答帧,1表示命令帧,0表示应答帧。 4、 控制字段中的T/F比特 用于指示传输数据类型,1表示透明的非结构化数据,0表示正常的数据帧。 5、 虚拟通道 虚拟地址(4bit):代表数据帧的源地址标识。目前为保留位,取值为0。 通道序号(4bit):0表示虚通道0
[单片机]
STM32F103系列 PB4引脚问题
因为STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能 1、禁用PB4复用功能 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); 或者GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); 用这两天其中一条,完全禁用JTAG+SW-DP或者屏蔽JTAG-DP,用来释放各个io。 注意:还是用以下这条来释放PB4吧,因为上面两条会禁用SW和JTAG,造成无法调试 GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,
[单片机]
STM32F103控制ADS1115采集模拟信号
程序已经通过 0、定义通道 #define TongDao0 0xc2e3 #define TongDao1 0xd2e3 #define TongDao2 0xe2e3 #define TongDao3 0xf2e3 1、STM32F103的IIC端口初始化 void ads1115_io_init(void) { GPIO_InitTypeDef GPIO_InitStruct; // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitS
[单片机]
STM32F10XX中SPI的DMA发送数据
参考资料: http://blog.csdn.net/jdh99/article/details/7603029 http://www.openedv.com/posts/list/3159.htm 上面提到的两篇博文比较详细深刻的说明了DMA的工作方式以及SPI的DMA传输方式的特点。结合对Stm32F103VET6中SPI的DMA传输方式的配置和学习谈谈感受,在看下面的内容之前请先看上面的两篇参考博文,这里就不在说明。 要使用SPI的DMA功能,首先配置好SPI外设,这里以SPI1为例子。下面的代码初始化了SPI1对应的GPIO以及SPI1工作的模式。 void SpiCC3000Init(void
[单片机]
STM32F10XX中SPI的<font color='red'>DMA</font><font color='red'>发送</font>数据
【STM32】4—UART串口(查询模式)
0 实验预期效果 完成串口数据的接收和发送 1 相关原理图 2 硬件配置 DAPLINK、STM32F407VET6: TXD —— PA10 注意!!!!一定要看清!!!不要接错!!TXD是接PA10!!! RXD —— PA9 注意!!!!一定要看清!!!不要接错!!RXD是接PA9!!! GND —— GND 5V —— 5V 3 软件配置 USART相关知识 USART 简介、功能说明、框图见博客:【STM32】基于STM32F407实现串口通信_Max_Shy的博客-CSDN博客_stm3
[单片机]
【STM32】4—<font color='red'>UART</font>串口(查询模式)
基于FPGA的UART接口模块设计
  UART(UniversalAnynchronousReceiverTransmitter,通用异步接收发送器)是广泛应用的串行数据传输协议之一,其应用范围遍及计算机外设、工控自动化等场合。虽然USB传输协议比UART协议有更高的性能,但电路复杂开发难度大,并且大多数的微处理器只集成了UART,因此UART仍然是目前数字系统之间进行串行通信的主要协议。   随着FPGA的广泛应用,经常需要FPGA与其他数字系统进行串行通信,专用的UART集成电路如8250,8251等是比较复杂的,因为专用的UART集成电路既要考虑异步的收发功能,又要兼容RS232接口设计,在实际应用中,往往只需要用到UART的基本功能,使用专用芯片会造成
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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