新手入门
- 积分
- 3
- 金钱
- 3
- 注册时间
- 2020-8-3
- 在线时间
- 0 小时
|
1金钱
串口初始化void uart_init2(u32 bound)
{
UART2_Handler.Instance = USART2;
UART2_Handler.Init.BaudRate = bound;
UART2_Handler.Init.WordLength = UART_WORDLENGTH_8B;
UART2_Handler.Init.StopBits = UART_STOPBITS_1;
UART2_Handler.Init.Parity = UART_PARITY_NONE;
UART2_Handler.Init.Mode = UART_MODE_TX_RX;
UART2_Handler.Init.HwFlowCtl = UART_HWCONTROL_NONE;
UART2_Handler.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&UART2_Handler);
__HAL_UART_ENABLE_IT(&UART2_Handler, UART_IT_IDLE); //??IDLE??
HAL_UART_Receive_DMA(&UART2_Handler,USART_RX_BUF2,USART_REC_LEN2);//ÖØDÂ′ò¿aDMA½óêÕ
}
if(huart->Instance==USART2)//èç1ûêÇ′®¿ú2£¬½øDD′®¿ú2 MSP3õê¼»ˉ
{
__HAL_RCC_GPIOA_CLK_ENABLE(); //ê1ÄüGPIOAê±Öó
__HAL_RCC_USART2_CLK_ENABLE(); //ê1ÄüUSART2ê±Öó
GPIO_Initure.Pin=GPIO_PIN_2; //PA2
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //¸′óÃíÆíìêä3ö
GPIO_Initure.Pull=GPIO_PULLUP; //éÏà-
GPIO_Initure.Speed=GPIO_SPEED_FAST; //¸ßËù
GPIO_Initure.Alternate=GPIO_AF7_USART2; //¸′óÃÎaUSART2
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //3õê¼»ˉPA2
GPIO_Initure.Pin=GPIO_PIN_3; //PA3
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //3õê¼»ˉPA3
HAL_NVIC_EnableIRQ(USART2_IRQn); //ê1ÄüUSART1ÖD¶Ïí¨μà
HAL_NVIC_SetPriority(USART2_IRQn,0,0); //ÇàÕ¼óÅÏè¼¶3£¬×óóÅÏè¼¶3
}
DMA设置
void MYDMA_Config(void)
{
__HAL_RCC_DMA1_CLK_ENABLE(); // ??DMA2??
HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
UART2TxDMA_Handler.Instance = DMA1_Stream6;
UART2TxDMA_Handler.Init.Channel = DMA_CHANNEL_4;
UART2TxDMA_Handler.Init.Direction = DMA_MEMORY_TO_PERIPH;
UART2TxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE;
UART2TxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE;
UART2TxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
UART2TxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
UART2TxDMA_Handler.Init.Mode = DMA_NORMAL;
UART2TxDMA_Handler.Init.Priority = DMA_PRIORITY_HIGH;
UART2TxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
HAL_DMA_Init(&UART2TxDMA_Handler);
__HAL_LINKDMA(&UART2_Handler,hdmatx,UART2TxDMA_Handler);
//
UART2RxDMA_Handler.Instance = DMA1_Stream5;
// UART2RxDMA_Handler.StreamBaseAddress=(u32)&USART2->RDR;
UART2RxDMA_Handler.Init.Channel = DMA_CHANNEL_4;
UART2RxDMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY;
UART2RxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE;
UART2RxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE;
UART2RxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
UART2RxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
UART2RxDMA_Handler.Init.Mode = DMA_NORMAL;
UART2RxDMA_Handler.Init.Priority = DMA_PRIORITY_LOW;
UART2RxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;memcpy(G4G_RxData,USART_RX_BUF2, RX_COUNT);
UART2RxDMA_Handler.Instance->M0AR =(u32)&USART_RX_BUF2;
UART2RxDMA_Handler.Instance->PAR =(u32)&USART2->RDR;
HAL_DMA_DeInit(&UART2RxDMA_Handler);
HAL_DMA_Init(&UART2RxDMA_Handler);
// __HAL_LINKDMA(USART2,hdmarx,UART2RxDMA_Handler);
__HAL_LINKDMA(&UART2_Handler,hdmarx,UART2RxDMA_Handler);
}
接收函数
void USART2_IRQHandler(void)
{
uint32_t tmp_flag = 0;
uint32_t temp;
HAL_UART_IRQHandler(&UART2_Handler);
if(USART2 == UART2_Handler.Instance)
{
tmp_flag =__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_IDLE); //??IDLE???
if((tmp_flag != RESET))
{
recv_end_flag = 1;//½óêÕíê3é±êÖ¾ÖÃ1
__HAL_UART_CLEAR_IDLEFLAG(&UART2_Handler);//Çå3y±ê־λ
temp = UART2_Handler.Instance->ISR;
temp = UART2_Handler.Instance->RDR;
HAL_UART_DMAStop(&UART2_Handler);
temp = __HAL_DMA_GET_COUNTER(&UART2RxDMA_Handler);//»ñè¡DMAÎa′«êäêy¾Y
RX_COUNT = USART_REC_LEN2 - temp;//½óêÕêy¾Y¸öêy
memcpy(G4G_RxData,USART_RX_BUF2, RX_COUNT);
HAL_UART_Receive_DMA(&UART2_Handler,USART_RX_BUF2,USART_REC_LEN2);//ÖØDÂ′ò¿aDMA½óêÕ
// memcpy(G4G_RxData,USART_RX_BUF2, RX_COUNT);
}
}
}
调试USART_RX_BUF2数据正常,但是执行memcpy(G4G_RxData,USART_RX_BUF2, RX_COUNT);后,G4G_RxData没有数据,请教原子哥和各位大神,帮帮忙啊,都好几天,不知道哪里的原因
|
|