您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > STM32F4-UART-DMA-收发处理
Writebyalan,2017/10/14STM32F4使用USART1的DMA传送模式工作环境:STM32F4演示板主芯片:STM32F407VET6开发环境:STM32CubeMX4.20.1/FirmwarePackageforFamilySTM32F41.16.0MDK5.17.0引脚定议:PA9UART_TXPA10UART_RXPA4LED0PA5LED1PB1LED2PE11LED3PH0/PH125MHz晶振实验目标:1.操作GPIO闪灯2.使用UARTDMA发送模式每两秒发送一串字符3.使用UARTDMA接收模式建立一个持续的侦测串口输入,并将收到的检测到的数据更新到LED1~LED3。STEP1:使用STM32CubeMX建立项目,选择芯片型号Writebyalan,2017/10/14STEP2:修改STM32CubeMX项目设定1Writebyalan,2017/10/14STEP3:修改STM32CubeMX项目设定2Writebyalan,2017/10/14STEP4:更改时钟源和工作频率1Writebyalan,2017/10/14STEP5:更改时钟源和工作频率2(使用外部25MHz晶振,PLLM=25N=336P=2,SYSYCLK=168MHz,HCLK=168MHz,PCLK1=42MHz,PCLK2=84MHz)Writebyalan,2017/10/14STEP6:定义LED输入端点1Writebyalan,2017/10/14STEP7:定义LED输入端点2Writebyalan,2017/10/14STEP8:修改LED输出端点配置Writebyalan,2017/10/14STEP9:配置USART(1)Writebyalan,2017/10/14STEP10:配置USART(2)Writebyalan,2017/10/14STEP11:配置USART(3)Writebyalan,2017/10/14STEP12:配置USART(4)Writebyalan,2017/10/14STEP13:配置USART(5)Writebyalan,2017/10/14STEP14:中断配置1Writebyalan,2017/10/14STEP15:中断配置2Writebyalan,2017/10/14STEP16:生成代码1Writebyalan,2017/10/14STEP17:打开MDK工程文件,到止STM32FCuble的操作已经完成,STEP18:添加LED闪灯程序1在main.c文件中/*USERCODEBEGIN0*/和/*USERCODEEND0*/之间加入闪灯函数如下;/*USERCODEBEGIN0*/uint32_tvFlashRunLedTimer;voidDisplayShowRunLED(void){if((HAL_GetTick()-vFlashRunLedTimer)300){vFlashRunLedTimer=HAL_GetTick();HAL_GPIO_TogglePin(STATE_LED_GPIO_Port,STATE_LED_Pin);}}/*USERCODEEND0*/2在main.c文件中,main函数中的/*USERCODEBEGIN3*/和/*USERCODEEND3*/之间调用闪灯函数如下;/*USERCODEBEGIN3*/DisplayShowRunLED();//只需加入此行}/*USERCODEEND3*/Writebyalan,2017/10/143取消MDK的MicroLIB4编译后下载,测试闪灯程序,如果硬件和程序正常,灯会每0.6秒闪一次STEP19:DMA接收处理程序1在main.c文件中/*USERCODEBEGIN0*/和/*USERCODEEND0*/之间加入相关变量#defineCOM1_RS_BUFFSIZE50uint8_tvCom1TBuffer[COM1_RS_BUFFSIZE];//串口1接收缓冲uint8_tvCom1RBuffer[COM1_RS_BUFFSIZE];//串口1发送缓冲uint32_tvCom1RxpTr;//接受数据包当前指针volatileuint32_t*pCOM1_DMA_RXD_CNT=(&(DMA2_Stream2-NDTR));//RXDDMA指数器#definevCurrentRXDBuffPoint(COM1_RS_BUFFSIZE-(*pCOM1_DMA_RXD_CNT))//当前缓冲区栈顶指针2在main.c文件中/*USERCODEBEGIN0*/和/*USERCODEEND0*/之间加入接收初始化函数Writebyalan,2017/10/14/****************************************************************初始化UART1接收缓冲,使用DMA非阻断方式,这样做的好处是不会丢失任何数据,并且不会阻断其它程序运行,收到的数据能在规定的延时时间内能处理并做出反应即可。实现思路:1.定义一个环形缓冲区,UART的RXD数据自动进入缓冲,不需要程序控制,2.主程序每个处理周期调用缓冲扫描程序,处理接收到的数据****************************************************************/voidInitUART_DMA_CIRCULAR_Input(void){DMA2_Stream2-NDTR=COM1_RS_BUFFSIZE;//设定UART串口接收缓冲大小DMA2_Stream2-PAR=(uint32_t)(&(USART1-DR));//数据源头地址DMA2_Stream2-M0AR=(uint32_t)vCom1RBuffer;//数据目标地址SET_BIT(USART1-CR3,USART_CR3_DMAR);//串口数据接收使能__HAL_DMA_ENABLE(&hdma_usart1_rx);//使能RXD数据DMA通道vCom1RxpTr=0;//初始化接收处理指针}3在main.c文件中/*USERCODEBEGIN0*/和/*USERCODEEND0*/之间加入接收处理函数voidCom1Poll(void){uint32_tendpoint;uint8_tch;endpoint=vCurrentRXDBuffPoint;//取得栈顶指针while(endpoint!=vCom1RxpTr){ch=vCom1RBuffer[vCom1RxpTr];vCom1RxpTr++;if(vCom1RxpTr=COM1_RS_BUFFSIZE){vCom1RxpTr=0;}if(ch&0x01){HAL_GPIO_WritePin(Y0_GPIO_Port,Y0_Pin,GPIO_PIN_SET);}else{HAL_GPIO_WritePin(Y0_GPIO_Port,Y0_Pin,GPIO_PIN_RESET);}if(ch&0x02){HAL_GPIO_WritePin(Y1_GPIO_Port,Y1_Pin,GPIO_PIN_SET);}else{HAL_GPIO_WritePin(Y1_GPIO_Port,Y1_Pin,GPIO_PIN_RESET);}if(ch&0x04){HAL_GPIO_WritePin(Y2_GPIO_Port,Y2_Pin,GPIO_PIN_SET);}else{HAL_GPIO_WritePin(Y2_GPIO_Port,Y2_Pin,GPIO_PIN_RESET);}}}4在main.c文件中,main函数中的/*USERCODEBEGIN2*/和/*USERCODEEND2*/之间调用接收初始化函数如下;Writebyalan,2017/10/14/*USERCODEBEGIN2*/InitUART_DMA_CIRCULAR_Input();/*USERCODEEND2*/5在main.c文件中,main函数中的/*USERCODEBEGIN3*/和/*USERCODEEND3*/之间调用接收处理函数如下;/*USERCODEBEGIN3*/DisplayShowRunLED();Com1Poll();}/*USERCODEEND3*/6编译后下载,测试接收程序,如果硬件和程序正常,向板子发送数据,3个LED灯会显示最后一个字符的低3位状态STEP20:USARTDMA发送处理1在main.c文件中/*USERCODEBEGIN0*/和/*USERCODEEND0*/之间加入相关变量uint32_tvSendRepeatTimer;uint8_tvTXDBuffer[]=USARTDMASendTest!\r\n;2在main.c文件中,main函数中的/*USERCODEBEGIN3*/和/*USERCODEEND3*/之间调用发送处理程序如下;/*USERCODEBEGIN3*/DisplayShowRunLED();Com1Poll();if((HAL_GetTick()-vSendRepeatTimer)2000)Writebyalan,2017/10/14{vSendRepeatTimer=HAL_GetTick();HAL_UART_Transmit_DMA(&huart1,vTXDBuffer,sizeof(vTXDBuffer));}}/*USERCODEEND3*/3在stm32f4xx_it.c文件中/*USERCODEBEGIN0*/和/*USERCODEEND0*/之间加入变量外部申明/*USERCODEBEGIN0*/externUART_HandleTypeDefhuart1;/*USERCODEEND0*/4在stm32f4xx_it.c文件中/*USERCODEBEGINDMA2_Stream7_IRQn0*/和/*USERCODEENDDMA2_Stream7_IRQn0*/之间加入中断入理程序voidDMA2_Stream7_IRQHandler(void){/*USERCODEBEGINDMA2_Stream7_IRQn0*/if(__HAL_DMA_GET_IT_SOURCE(&hdma_usart1_tx,DMA_IT_TC)!=RESET){huart1.gState=HAL_UART_STATE_READY;}/*USERCODEENDDMA2_Stream7_IRQn0*/HAL_DMA_IRQHandler(&hdma_usart1_tx);/*USERCODEBEGINDMA2_Stream7_IRQn1*//*USERCODEENDDMA2_Stream7_IRQn1*/}5编译后下载,如果硬件和程序正常,板子每2秒向主机发送字符串USARTDMASendTest!\r\n
本文标题:STM32F4-UART-DMA-收发处理
链接地址:https://www.777doc.com/doc-4679953 .html