STM32_HAL库串口DMA(直接内存通道)模式操作指令(基于CubeMX软件)

发布于 2024-02-24  49 次阅读


//案例
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传输过半中断
}