STM32CubeMX配置小记录——F7串口DMA收发

之前没有写调试记录的习惯,导致前段时间刚弄过的一个东西,现在拿起来要么翻之前的代码,要么就再慢慢调,虽然知道自己肯定是可以战胜困难,但总是浪费很多时间,所以以后准备多写一些记录,方便自己用的时候查。嘻嘻

STM32CubeMX这个工具用习惯了还是很爽的,就是有些傻逼的地方是,他并不能给你弄到位,有的东西还是得自己调一下。

打开串口并使能中断后,如果要开启DMA收发的功能,只需要使能对应的通道就可以了。

生成代码的过程就不废话了。

在串口初始化里面调用这个函数来定义串口中断接受长度。

HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, 1);

不要忘记在中断函数里面再次调用。

一个完整的发送周期如下,清除完成标志也可以放在下次发送的开始。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    static uint8_t sta = 0;
    if(huart->Instance==USART1)//Èç¹ûÊÇ´®¿Ú1
    {
//        USART_RX1_BUF[Usart1_len]=aRx1Buffer[0];
//        Usart1_len++;
//        if(Usart1_len == 0x04)                             
//    {
        HAL_UART_Transmit_DMA(&huart1,(uint8_t*)aRx1Buffer,USART_RX1_LEN);
        while(1)
            {
                if(__HAL_DMA_GET_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
                {
                    __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
                    HAL_UART_DMAStop(&huart1);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
                    break; 
                }
                            //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
                            }
        switch(sta)
        {
            case 0:if(aRx1Buffer[0] == 0x55) sta = 1;break;
            case 1:if(aRx1Buffer[0] == 0xaa) mode = 1,sta = 2;else sta = 0;break;
            case 2:mode = 0;sta = 0;break;
        }        
        HAL_UART_Receive_IT(&huart1, (uint8_t *)aRx1Buffer, RX1BUFFERSIZE);   
//        }            
    }
    if(huart->Instance==USART2)//Èç¹ûÊÇ´®¿Ú2
    {
        HAL_UART_Transmit_DMA(&huart2,(uint8_t*)aRx2Buffer,USART_RX2_LEN);
        while(1)
            {
                if(__HAL_DMA_GET_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
                {
                    __HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
                    HAL_UART_DMAStop(&huart2);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
                    break; 
                }
                            //    __HAL_DMA_GET_COUNTER(&hdma_usart2_tx);
                            }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
        while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
        HAL_UART_Receive_IT(&huart2, (uint8_t *)aRx2Buffer, RX2BUFFERSIZE);   
    }
    if(huart->Instance==USART3)//Èç¹ûÊÇ´®¿Ú3
    {
        HAL_UART_Transmit_DMA(&huart3,(uint8_t*)aRx3Buffer,USART_RX3_LEN);
        while(1)
            {
                if(__HAL_DMA_GET_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
                {
                    __HAL_DMA_CLEAR_FLAG(&hdma_usart3_tx,DMA_FLAG_TCIF3_7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
                    HAL_UART_DMAStop(&huart3);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
                    break; 
                }
                            //    __HAL_DMA_GET_COUNTER(&hdma_usart1_tx);
                            }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
        while(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
        HAL_UART_Receive_IT(&huart3, (uint8_t *)aRx3Buffer, RX3BUFFERSIZE);   
    }
    if(huart->Instance==UART4)//Èç¹ûÊÇ´®¿Ú4
    {
        HAL_UART_Transmit_DMA(&huart4,(uint8_t*)aRx4Buffer,USART_RX4_LEN);
        while(1)
            {
                if(__HAL_DMA_GET_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4))//µÈ´ýDMA2_Steam7´«ÊäÍê³É
                {
                    __HAL_DMA_CLEAR_FLAG(&hdma_uart4_tx,DMA_FLAG_TCIF0_4);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
                    HAL_UART_DMAStop(&huart4);      //´«ÊäÍê³ÉÒÔºó¹Ø±Õ´®¿ÚDMA
                    break; 
                }
                            //    __HAL_DMA_GET_COUNTER(&hdma_uart4_tx);
                            }    //·¢ËͽÓÊÕµ½µÄÊý¾Ý
        while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET);        //µÈ´ý·¢ËͽáÊø
        HAL_UART_Receive_IT(&huart4, (uint8_t *)aRx4Buffer, RX4BUFFERSIZE);   
    }
}

 

这个我是放在中断里实现串口自收自发的。

 

 1 void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
 2 {
 3         uint32_t isrflags   = READ_REG(huart->Instance->ISR);//?????,???????SR
 4         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
 5         {
 6                         READ_REG(huart->Instance->RDR);//PE???,????DR
 7                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);//???
 8         }
 9         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
10         {
11                         READ_REG(huart->Instance->RDR);//FE???,????DR
12                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
13         }
14         
15         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
16         {
17                         READ_REG(huart->Instance->RDR);//NE???,????DR
18                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);
19         }        
20         
21         if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)
22         {
23                         READ_REG(huart->Instance->RDR);//ORE???,????CR
24                         __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
25         }        
26 } 

 

转载于:https://www.cnblogs.com/schoolmate-li/p/10876507.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值