历史上的今天
今天是:2025年03月09日(星期日)
2019年03月09日 | STM32F103 UART中断接收 DMA发送
2019-03-09 来源:eefocus
以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);
}
史海拾趣
|
关键字:枪型摄像机 枪型摄像机是我们最常见也是应用最广泛的摄像机之一,银行、商场、体育馆、医院等公共场所随处可见,在家庭监控系统中,枪型摄像机是性价比较高的产品,一般情况下,同样的价格和技术参数,枪型摄像机的图像效果好于半 ...… 查看全部问答> |
|
最近用了一块i2c总线的ad芯片,现在遇到这个情况:芯片一开始正常工作,写进去的值和转化后的值都准确,工作一端时间后(时间不定)就出现了锁死现象,表现为sda被拉低,会有乱码出来(不是正常波形),scl比较正常,但少了一段.以接上拉电阻,10k ...… 查看全部问答> |
|
小弟用的平台是WinCE6.0,每次编译后只生成nk.bin文件,我需要的事nk.nb0文件,每次通过命令转换比较麻烦,在网上听说可以修改bib文件来直接生成nk.nb0文件,不知道那位高手知道,赐教~~~… 查看全部问答> |
|
void main() { unsigned char Message; //init SP=0x60; SCON = 0x50; TMOD = 0x20; // timer 1 mode 2 auto reload TH1= 0xfa; // 4800 8n1 TL1=0xfa; PCON=0x00; TR1 = 1; // run timer1 TR1=1; while(1) { REN=1;& ...… 查看全部问答> |
|
【我学LanuchPad经典分享 01】16位MSP430G系列微处理器的使用扩展 据说是TI 年度“某网友”觉得最有份量的应用笔记收集的哈!感觉不错!作为学习lanuchpad 足踪共享,结交一块学习的“道友”!… 查看全部问答> |
|
在我对M4开发板进行编程的这段时间里,最让我头疼的就是进入了这个函数:虽然它已经说明了:This is the code that gets called when the processor receives a fault interrupt. This simply enters an infinite loop, preserving the ...… 查看全部问答> |
|
在网上看了一下TFT画圆的的C程序,原理是先画1/8的圆,然后根据圆的对称性在算出其他7/8圆,现在我利用VHDL语言将1/8的圆画出来了,可是因为液晶屏是横向扫描像素,将1/8的某一个像素点算出来以后,另外的7个点,分别在圆的二,三,四 ...… 查看全部问答> |
|
最近做项目急用一种电源芯片,要求5V~20V都能正常工作。选择。。。 最近做项目急用一种电源芯片,要求5V~20V都能正常工作。选择。。。 为了赶样品情急之下选择了LMZ12001,唉呀,要求是能达到。但就是贵啊4.8美元。而且市场少量难买。 LMZ12001在我的电路里是直接的3点多V几开始工作了(我内部用了5V转3V3的芯片) ...… 查看全部问答> |
|
对于场效应管来说,在大学期间老师基本没有讲,让自己自学。到了工作的时候,我们发现场效应管应用还是比较广泛的。其实场效应管和三极管还是很相似的。在很多应用中,甚至可以直接贴换三极管。 1. 概述 场效应晶体管 ...… 查看全部问答> |




