历史上的今天
返回首页

历史上的今天

今天是: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);

}

 


推荐阅读

史海拾趣

Collins Electronics Corp公司的发展小趣事

随着全球环保意识的提高,Collins Electronics Corp开始关注其生产活动对环境的影响。他们引入了环保材料和生产工艺,减少了废弃物和有害物质的排放。同时,公司还开展了一系列环保宣传活动,提高员工和客户的环保意识。这些举措不仅提升了公司的社会责任形象,也为其赢得了更多消费者的青睐。公司还研发了节能型电子产品,为推动行业的绿色发展做出了贡献。

Antex公司的发展小趣事

近年来,Antex公司不断升级产品,推出了包括Antex滚珠轴承、Antex齿轮环等在内的多款高端产品。这些产品以其卓越的性能和稳定的品质,赢得了全球客户的青睐。凭借这些优秀产品,Antex在大型回转轴承市场中的份额逐渐提升,目前已占据全球约40%的市场份额。

Eurosil Electronics Ltd公司的发展小趣事

随着技术的不断成熟,Eurosil开始将产品推向市场。公司凭借优质的产品和卓越的服务,逐渐在电子行业中树立了良好的品牌形象。同时,Eurosil积极拓展国际市场,与多家国际知名企业建立了合作关系,将产品销往全球各地。这一过程中,Eurosil不仅扩大了市场份额,也积累了丰富的国际经验。

CANDD公司的发展小趣事

在快速发展的过程中,CANDD公司始终注重企业文化的建设。公司倡导创新、协作、诚信和担当的核心价值观,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的培训和成长,为员工提供了广阔的职业发展空间。这些举措不仅激发了员工的工作热情,还为公司培养了一批忠诚、有能力的员工队伍。在企业文化的引领下,CANDD公司不断向前发展,成为了电子行业的佼佼者。

这些故事虽然基于虚构的CANDD公司,但它们所反映的电子行业发展趋势和企业管理理念是真实存在的。通过这些故事,我们可以更好地理解电子行业的发展历程和未来趋势。

安碁科技(AKER)公司的发展小趣事

安碁科技在发展过程中,积极寻求与高校、研究机构的合作,以推动技术创新和人才培养。例如,2009年,公司与逢甲大学进行产学合作,共同研发超小型石英振动子。这种合作模式不仅为公司带来了先进的技术和研发资源,也促进了产学研之间的紧密合作和共同发展。此外,安碁科技还不断拓展业务领域,从石英振荡器逐步扩展到汽车电子、工业控制、消费电子等多个领域,实现了业务的多元化发展。

Altech公司的发展小趣事

在电子行业的发展历程中,Altech公司凭借其敏锐的市场洞察力,率先投入研发铝合金汽车线束导体。随着新能源汽车市场的崛起,对高效、轻量化的线束导体需求日益增长。Altech公司成功研发出铝合金汽车线束导体,不仅满足了市场对轻量化的需求,还提高了导电性能,为新能源汽车行业带来了革命性的变革。

问答坊 | AI 解惑

简要分析枪型摄像机的成分

  关键字:枪型摄像机   枪型摄像机是我们最常见也是应用最广泛的摄像机之一,银行、商场、体育馆、医院等公共场所随处可见,在家庭监控系统中,枪型摄像机是性价比较高的产品,一般情况下,同样的价格和技术参数,枪型摄像机的图像效果好于半 ...…

查看全部问答>

wince中断共享

现在2440上有四个DMA,但是DMA1由SPI0和I2S占用了,请问我该如何在这SPI0和IIS之间共享这个DMA1的中断呀?谢谢了!…

查看全部问答>

一个关于i2c总线锁死的问题

最近用了一块i2c总线的ad芯片,现在遇到这个情况:芯片一开始正常工作,写进去的值和转化后的值都准确,工作一端时间后(时间不定)就出现了锁死现象,表现为sda被拉低,会有乱码出来(不是正常波形),scl比较正常,但少了一段.以接上拉电阻,10k ...…

查看全部问答>

关于生成NK.NB0的问题

小弟用的平台是WinCE6.0,每次编译后只生成nk.bin文件,我需要的事nk.nb0文件,每次通过命令转换比较麻烦,在网上听说可以修改bib文件来直接生成nk.nb0文件,不知道那位高手知道,赐教~~~…

查看全部问答>

C51通过串口向计算机发送数据时收到规则乱码,请高手指点!

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调试程序有感:关于程序编译中进入错误中断的体会!

在我对M4开发板进行编程的这段时间里,最让我头疼的就是进入了这个函数:虽然它已经说明了:This is the code that gets called when the processor receives a fault interrupt.  This simply enters an infinite loop, preserving the ...…

查看全部问答>

用FPGA在液晶面板上画圆。

  在网上看了一下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. 概述        场效应晶体管 ...…

查看全部问答>