# if 1
		while(1)
		{
			//读取串口接收数据
			#ifdef USE_DMA
			if(USART3_RxFinished == 1){    //判断有没有数据函数
					show_menu();
          USART3_RxFinished = 0; 
                if(strcmp((char*)USART3_RxBuffer,"1")==0)
                {
                    GPIO_ResetBits(GPIOE,GPIO_Pin_3);
                }
					printf("uart3_rcv = %s\r\n", USART3_RxBuffer);
					memset(USART3_RxBuffer, 0, USART3_RX_BUFFER_SIZE);
          DMA_SetCurrDataCounter(DMA1_Channel3, USART3_RX_BUFFER_SIZE);
          DMA_Cmd(DMA1_Channel3, ENABLE);   //重启
      }
			#else
			printf("uart3_rcv = %c\r\n", uart3_cmd);
			#endif
			SysTick_delay_ms(1000);
		}
		# endif		

	while(1);

先定义USART3_RxFinished =0 ;在我们定义的usart.c 中

uint8_t USART3_RxBuffer[USART3_RX_BUFFER_SIZE]; 
volatile uint16_t USART3_RxCount = 0;
volatile uint8_t USART3_RxFinished = 0;

当我们完成产生中断,触发

void USART3_IRQHandler(void)内有USART3_RxFinished =1; 

即当产生中断,串口接收到一个字节(我们通过串口工具发送的),触发 USART3_IRQHandler

DMA自动将串口接收到的字节搬运到 USART3_RxBuffer 缓冲区,  if(strcmp((char*)USART3_RxBuffer,"1")==0)
                {
                    GPIO_ResetBits(GPIOE,GPIO_Pin_3);
                }

通过对比USART3_RxBuffer  与  我们输入的数字 “1”  ,匹配则返回0,电位下拉(  GPIO_ResetBits(GPIOE,GPIO_Pin_3);)  LED-PC3亮灯

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐