#define BUFFERSIZE 200 uint8_t ReceiveBuff[BUFFERSIZE]; uint8_t recv_end_flag = 0,Rx_len; UART_HandleTypeDef huart1; DMA_HandleTypeDef hdma_usart1_rx; GPIO_InitTypeDef GPIO_InitStruct; void UART1_Init(int baud) { __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); huart1.Instance = USART1; huart1.Init.BaudRate = baud; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE); HAL_NVIC_SetPriority(USART1_IRQn,0,0); HAL_NVIC_EnableIRQ(USART1_IRQn); hdma_usart1_rx.Instance = DMA1_Channel5; hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_usart1_rx.Init.Mode = DMA_NORMAL; hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW; HAL_DMA_Init(&hdma_usart1_rx); __HAL_LINKDMA(&huart1,hdmarx,hdma_usart1_rx); HAL_NVIC_SetPriority(DMA1_Channel5_IRQn,1,2); HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); } void USART1_IRQHandler() { HAL_UART_IRQHandler(&huart1); uint32_t temp; if(USART1 == huart1.Instance) { if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)) { __HAL_UART_CLEAR_IDLEFLAG(&huart1); HAL_UART_DMAStop(&huart1); temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); Rx_len = BUFFERSIZE - temp; recv_end_flag = 1; } } } int fputc(int ch,FILE *f) { while(!(USART1->SR&(1<<7))); USART1->DR=ch; return ch; } void UART1_DMA_Get() { if(recv_end_flag==1) { printf("rx_len=%d\n",Rx_len); printf("%s\n",ReceiveBuff); for(int i=0;i<Rx_len;i++) ReceiveBuff[i]=0; Rx_len=0; recv_end_flag=0; } HAL_UART_Receive_DMA(&huart1,(uint8_t*)ReceiveBuff,BUFFERSIZE); }
这个芯片是同系列的,相互兼容的。
RAM也是相同的,只是flash容量CB要大一些。
建议楼主还是看看程序本身吧!
您是通过cube生成的,我个人不太喜欢这个库与代码编写风格,所以接触较少。
我建议楼主写一个流程图,我觉得您了是在中断里面打开了DMA接收,好像是在中断里做了好多的事情