Stm32使用Usart代码例子(轮询、中断、DMA)

发布者:Xiangsi最新更新时间:2024-10-09 来源: cnblogs关键字:Stm32  Usart  轮询  中断  DMA 手机看文章 扫描二维码
随时随地手机看文章

  static int rx_index = 0;  

   

  if (USART_GetITStatus(USART3, USART_IT_TXE) != RESET) // Transmit the string in a loop  

  {  

    USART_SendData(USART3, StringLoop[tx_index++]);  

   

    if (tx_index >= (sizeof(StringLoop) - 1))  

      tx_index = 0;  

  }  

   

  if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) // Received characters modify string  

  {  

    StringLoop[rx_index++] = USART_ReceiveData(USART3);  

   

    if (rx_index >= (sizeof(StringLoop) - 1))  

      rx_index = 0;  

  }  

}  

   

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

   

int main(void)  

{  

    RCC_Configuration();  

   

    GPIO_Configuration();  

   

    NVIC_Configuration();  

   

  USART3_Configuration();  

   

  while(1); // Don't want to exit  

}  

   

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

 最后,是使用DMA的方法,使用usart5,管脚:pc12,pd2,来源:https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/DMA%20Memory%20To%20UART5&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B¤tviews=760


// STM32 UART5 DMA TX (Tx PC.12, Rx PD.2) STM32F4 Discovery - sourcer32@gmail.com  

   

#include 'stm32f4_discovery.h'  

   

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

   

void RCC_Configuration(void)  

{  

  /* --------------------------- System Clocks Configuration -----------------*/  

  /* UART5 clock enable */  

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);  

   

  /* GPIOC and GPIOD clock enable */  

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE);  

   

  /* DMA1 clock enable */  

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);  

}  

   

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

   

void GPIO_Configuration(void)  

{  

  GPIO_InitTypeDef GPIO_InitStructure;  

   

  /*-------------------------- GPIO Configuration ----------------------------*/  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // PC.12 UART5_TX, potential clash SDIN CS43L22  

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  GPIO_Init(GPIOC, &GPIO_InitStructure);  

   

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // PD.2 UART5_RX  

  GPIO_Init(GPIOD, &GPIO_InitStructure);  

   

  /* Connect USART pins to AF */  

  GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_UART5);  

  GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_UART5);  

}  

   

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

   

void UART5_Configuration(void)  

{  

    USART_InitTypeDef USART_InitStructure;  

   

  /* USARTx configuration ------------------------------------------------------*/  

  /* USARTx configured as follow: 

        - BaudRate = 115200 baud 

        - Word Length = 8 Bits 

        - One Stop Bit 

        - No parity 

        - Hardware flow control disabled (RTS and CTS signals) 

        - Receive and transmit enabled 

  */  

  USART_InitStructure.USART_BaudRate = 115200;  

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;  

  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(UART5, &USART_InitStructure);  

   

  USART_Cmd(UART5, ENABLE);  

}  

   

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

   

char Buffer[] = 'The quick brown fox jumps over the lazy dogrn';  

   

void DMA_Configuration(void)  

{  

  DMA_InitTypeDef  DMA_InitStructure;  

   

  DMA_DeInit(DMA1_Stream7);  

   

  DMA_InitStructure.DMA_Channel = DMA_Channel_4;  

  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; // Transmit  

  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Buffer;  

  DMA_InitStructure.DMA_BufferSize = (uint16_t)sizeof(Buffer) - 1;  

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&UART5->DR;  

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;  

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;  

  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;  

  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;  

  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;  

  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;  

   

  DMA_Init(DMA1_Stream7, &DMA_InitStructure);  

   

  /* Enable the USART Tx DMA request */  

  USART_DMACmd(UART5, USART_DMAReq_Tx, ENABLE);  

   

  /* Enable DMA Stream Transfer Complete interrupt */  

  DMA_ITConfig(DMA1_Stream7, DMA_IT_TC, ENABLE);  

   

  /* Enable the DMA RX Stream */  

  DMA_Cmd(DMA1_Stream7, ENABLE);  

}  

   

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

   

void DMA1_Stream7_IRQHandler(void)  

{  

  /* Test on DMA Stream Transfer Complete interrupt */  

  if (DMA_GetITStatus(DMA1_Stream7, DMA_IT_TCIF7))  

  {  

    /* Clear DMA Stream Transfer Complete interrupt pending bit */  

    DMA_ClearITPendingBit(DMA1_Stream7, DMA_IT_TCIF7);  

  }  

}  

   

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

   

void NVIC_Configuration(void)  

{  

  NVIC_InitTypeDef NVIC_InitStructure;  

   

  /* Configure the Priority Group to 2 bits */  

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  

   

  /* Enable the UART5 RX DMA Interrupt */  

  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream7_IRQn;  

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

  NVIC_Init(&NVIC_InitStructure);  

}  

   

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

   

int main(void)  

{  

    RCC_Configuration();  

   

  NVIC_Configuration();  

   

    GPIO_Configuration();  

   

  UART5_Configuration();  

   

  DMA_Configuration();  

   

  while(1); // Don't want to exit  

}  

   

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

   

#ifdef  USE_FULL_ASSERT  

   

/** 

  * @brief  Reports the name of the source file and the source line number 

  *   where the assert_param error has occurred. 

  * @param  file: pointer to the source file name 

  * @param  line: assert_param error line source number 

  * @retval None 

  */  

void assert_failed(uint8_t* file, uint32_t line)  

{  

  /* User can add his own implementation to report the file name and line number, 

     ex: printf('Wrong parameters value: file %s on line %drn', file, line) */  

   

  /* Infinite loop */  

  while (1)  

  {  

  }  

}  

#endif  

/** 

  * @} 

  */  

   

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

[1] [2] [3]
关键字:Stm32  Usart  轮询  中断  DMA 引用地址:Stm32使用Usart代码例子(轮询、中断、DMA)

上一篇:STM32点LED灯
下一篇:STM32配置IIC接口通信方式参考源码

推荐阅读最新更新时间:2026-02-26 10:35

STM32:DMA实例之串口(USART)通信
硬件平台:stm32f10xZET6 开发环境:keil MDK uVision v4.10 开发语言:C、ST_lib_3.5固件库 /* 代码演示 main.c */ #include stm32f10x.h #include bsp_usart1.h #include bsp_led.h extern uint8_t SendBuff ; static void Delay(__IO u32 nCount); /** * @brief 主函数 */ int main(void) { /* USART1 config 115200 8-N-1 */ USART1_Config(); USART1_
[单片机]
STM32基于固件库学习笔记(6)使用DMA实现USART1发送数据
DMA简介 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。换而言之就是当外设有数据发送给mcu,此时可以使用DMA接收到用户定义空间(不占用cpu),接收完成在产生中断发给mcu(才占用CPU)反正一样。 当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。 两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设
[单片机]
<font color='red'>STM32</font>基于固件库学习笔记(6)使用<font color='red'>DMA</font>实现<font color='red'>USART</font>1发送数据
STM32—cubeMX+DMA+USART 接收任意长度的数据
前言     之前的一篇文章中我为了可以实现USART接收任意长度的数据,对HAL的库进行了修改,可以实现接收以0x0a结尾的任意长度数据,即认为接收到0x0a时接收结束,见链接:HAL USART接收任意长度。   然而,上述这种方法并不合适,原则上HAL库一般不去修改,不便于其他人移植程序,降低了程序中库的适用性,这是很不好的习惯,所以这种方法并不可取。   后查资料得知STM32中还可以利用DMA的方式实现串口的任意长度数据的接收,故开始学习DMA+串口接收任意长度的数据这种方式。 cubeMX软件配置过程 首先,第一步都是进行时钟树的配置,配置好系统的时钟,不同的芯片配置不同的时钟频率,如图。
[单片机]
<font color='red'>STM32</font>—cubeMX+<font color='red'>DMA</font>+<font color='red'>USART</font> 接收任意长度的数据
stm32 usartDMA模式下只能发送一次
  问题描述:使用STM32 cube生成usart2 DMA direct mode(不使用FIFO,normal模式,STM32f407)配置代码,usart2可以使用阻塞方式发送,使用DMA发送则只能发送第一次,复位后还只能发送一次。   单步调试发现DMA方式下的发送在发送第一次之后,husart- State 标志变为 HAL_USART_STATE_BUSY就再也不变了。比较直接的解决思路就是在DMA发送中断中给这个标志修改为HAL_USART_STATE_READY,修改之后还是不好用(我认为是可以通过修改多个相关寄存器解决的,但是个人倾向于不深入了解其寄存器,而是用封装度更高的HAL系列函数)。   读stm32f
[单片机]
STM32 USART 串口 DMA 接收和发送的源码详解
硬件平台:STM32F103ZET6; 开发环境:KEIL 4; 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信息上传)。 串口DMA发送: 发送数据的流程: 前台程序中有数据要发送,则需要做如下几件事 1. 在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。 2. 将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道) 3. 开启DMA,一旦开启,则DMA开始发送数据,说明一下:在KEIL调试好的时候,DMA和调试是
[单片机]
STM32实现USART+DMA接收未知长度的数据和发送
前言:开始学USART+DMA的时候看到帖子《STM32 UART DMA实现未知数据长度接收》,觉得方法妙极了。此下出自此帖子——(整体的思路是这样的,一开始设置好DMA接收,可以把缓冲区长度设置为帧最大长度,我们可以把RX连接到定时器的管脚输入端,并且一开始设置输入并且使能引脚下降沿中断,当帧的第一个字节发送时,因为起始位为低电平,空闲时UART为高电平,满足条件,进入中断,禁止中断,并且在中断中开启定时器,该定时器工作在复位模式,上升沿复位,并且设置好定时器输出比较值为超时时间,比如20ms,这样,在传输后面字节时,肯定会有高低电平出现,即便是传输的是0x00,0xFF,虽然UART数据区不变,但是都为1,或都为0,但是因为
[单片机]
STM32 USART串口DMA接收和发送模式
串口DMA发送: 发送数据的流程: 前台程序中有数据要发送,则需要做如下几件事 1. 在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。 2. 将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道) 3. 开启DMA,一旦开启,则DMA开始发送数据,说明一下:在KEIL调试好的时候,DMA和调试是不同步的,即不管Keil 是什么状态,DMA总是发送数据。 4. 等待发送完成标志位,即下面的终端服务函数中的第3点设置的标志位。或者根据自己的实际情况来定,是否要一直等待这个标志位,也可以通过状态机的方式来循
[单片机]
<font color='red'>STM32</font> <font color='red'>USART</font>串口<font color='red'>DMA</font>接收和发送模式
STM32USART1用DMA方式发送与接收
USART1的DMA发送比较简单,在要发送之前,重新设置好DMA_BufferSize的大小,然后启动DMA就行了。不过在设置这一值时,得先关闭DMA通道。代码如下: DMA_ClearFlag(DMA1_FLAG_TC4); //清DMA发送完成标志 DMA_Cmd(DMA1_Channel4, DISABLE); //停止DMA DMA1_Channel4- CNDTR = sizeof(TxBuffer1) / sizeof(TxBuffer1 );//重设传输长度 DMA_Cmd(DMA1_Channel4, ENABLE); //启动DMA USART1的DMA接收:如果向USART1发送了数据,则数据会通
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved