DMA设置
串口DMA数据处理函数
//案例
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_DMA(&huart2,receiveData,size);
GPIO_PinState state=GPIO_PIN_SET;
if ( receiveData[1]=='0'){
state=GPIO_PIN_RESET;}
if (receiveData[0]=='R'){
HAL_GPIO_WritePin(LED_RED_GPIO_Port,LED_RED_Pin,state);}
else if(receiveData[0]=='G'){
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,state);}
else if(receiveData[0]=='B'){
HAL_GPIO_WritePin(LED_BLUE_GPIO_Port,LED_BLUE_Pin,state);}
HAL_UART_Rrceive_DMA(&huart2,receiveData,2);
}
串口接收不定长程序
//关闭DMA传输过半回调函数
__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);
//DMA_IT_HT为dma传输过半中断
//如果&hdma_usart2_rx报错在main.h中添加extern DMA_HandleTypeDef hdma_usart2_rx;
HAL_UARTEx_ReceiveToIdle_DMA(*huart,pData,Size);
HAL_UARTEx_ReceiveToIdle_IT(*huart,pData,Size);
//Ex代表扩展 idle代表中断空闲
//示例程序
uint_8 receiveData[50];
HAL_UARTEx_ReceiveToIdle_DMA(&huart2,receiveData,50);
//50为最大数组长度 或者sizeof(receiveData)取长度
//用于接收不定长数据的回调函数框架
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
}
//案例
__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);}
//主函数内关闭dma传输过半中断
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{ if(huart==&huart2){
HAL_UART_Transmit_DMA(&huart2,receiveData,Size);
//DMA串口发送程序
//RxEventCallback函数的Size
HAL_UARTEx_ReceiveToIdle_DMA(&huart2,receiveData,50);
//接受不定长数据
__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);}
//关闭dma传输过半中断
}
Comments NOTHING