首页 > 其他分享 >HAL_RS485发送接收_DMA:编码器

HAL_RS485发送接收_DMA:编码器

时间:2023-11-23 17:01:23浏览次数:97  
标签:DMA 编码器 Enc HAL UART huart3 RS485

RS485编码器

使用RS485读取多个编码器

接收数据:空闲中断+DMA

发送数据:DMA

配置串口:

基本与串口通信一致,增加接收和发送DMA,正常模式,另外增加485使能IO

 

 

 

 

  接收数据:

使能空闲中断

         __HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE) ;

         __HAL_UART_CLEAR_IDLEFLAG(&huart3);

增加空闲中断回调函数,自定义的回调函数在void USART3_IRQHandler(void)函数中调用

//串口空闲中断

void UART3_IDLECallBack(UART_HandleTypeDef *huart)

{

         if(huart == &huart3){

                   if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))  {

                            __HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除标志位

                            HAL_UART_DMAStop(&huart3);//停止DMA

//HAL_UART_Transmit(&huart1,uart3RxBuffer2,12,0x1000);               

Uart3.RxLen=(&huart3)->RxXferSize-(&huart3)->hdmarx->Instance->CNDTR;//len==21             

                            RS485_RX_END  = 1;

                   }

         }

}

在主函数中判断RS485_RX_END处理数据

发送数据:

由于需要与多个编码器通信,如果连续发送数据,读不到编码器的数据,猜想是连续的数据会被识别成1条数据,等待huart->gState = HAL_UART_STATE_READY标志位也失败了,所以使用定时器定时50ms发送数据

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

         static uint8_t CmdCNT = 0;

         uint8_t *SendBuf = NULL;

         uint8_t *ReceiveBuf = NULL;

        

         HAL_TIM_Base_Stop_IT(&htim1);

         HAL_UART_DMAStop(&huart3);//停止DMA

         //切换输出的命令

         if(!(ResetRoatFlag & (0x1<<Enc_ID))){

//               printf("Read_RS485:%d", Enc_ID);

                   SendBuf = Read_RS485[Enc_ID];

         }

         else{

                   if(!(CmdCNT&(0x1<<Enc_ID))){

//                         printf("Start_RS485:%d", Enc_ID);

                            SendBuf = Start_RS485[Enc_ID];

                            CmdCNT |= (0x1 << Enc_ID);

                   }else{

//                         printf("Set_RS485:%d", Enc_ID);

                            SendBuf = Set_RS485[Enc_ID];

                            CmdCNT &= ~(0x1 << Enc_ID);

                            ResetRoatFlag &= ~(0x1 << Enc_ID);

                   }

         }       

         // 启用DMA接收

         switch (Enc_ID){

                   case RS485_ENC1:ReceiveBuf = uart3RxBuffer1;break;

                   case RS485_ENC2:ReceiveBuf = uart3RxBuffer2;break;

                   case RS485_ENC3:ReceiveBuf = uart3RxBuffer3;break;

                   default:ReceiveBuf = NULL;

         }

         if(ReceiveBuf != NULL){

                   HAL_UART_Receive_DMA(&huart3,ReceiveBuf,sizeof(uart3RxBuffer) - 1) ;

                   SwRS485Mode(RS485_TX_EN);

                   HAL_UART_Transmit_DMA(&huart3,SendBuf,8);

                   (Enc_ID+1) > 2 ? Enc_ID=0 : Enc_ID++;

         }

         HAL_TIM_Base_Start_IT(&htim1);

}

主要功能就是切换发送的命令,开启DMA接收,发送数据(多缓存接收)

开启DMA接收HAL_UART_Receive_DMA(&huart3,ReceiveBuf,sizeof(uart3RxBuffer) - 1) ;

切换485使能为发送;

HAL_UART_Transmit_DMA(&huart3,SendBuf,8);发送数据

在发送中断回调函数中切换485使能为接收

 

流程:定时器中断→开启DMA接收→切换485为发送,DMA发送→发送中断回调函数切换485为接收→空闲中断接收数据,停止DMA→主函数处理数据→定时器中断

 

但是定时器定时时间不能小于50ms,否则也会接收不到数据,

标签:DMA,编码器,Enc,HAL,UART,huart3,RS485
From: https://www.cnblogs.com/yianyan/p/17834630.html

相关文章

  • 《安富莱嵌入式周报》第327期:Cortex-A7所有外设单片机玩法LL/HAL库全面上线,分享三款GU
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 1、2023Hackaday大赛胸牌开源Vectorscope-main.zip(66.83MB)https://github.com/Hack-a-Day/Vectorscope前段时间分享后,好几个网友咨询这个胸牌有没有开源,搜到了开源地址......
  • 霍尔编码器
    霍尔编码器-直流减速电机介绍直流减速电机,即齿轮减速电机,是在普通直流电机的基础上,加上配套齿轮减速箱。齿轮减速箱的作用是,提供较低的转速,较大的力矩。同时,齿轮箱不同的减速比可以提供不同的转速和力矩。这大大提高了,直流电机在自动化行业中的使用率。减速电机是指减速机和电机......
  • Datawhale_0&1
    安装与启航安装Minicondagit创建和激活CONDA环境创建Conda环境condacreate-np2spython=3.12激活Conda环境condaactivatep2s删除某个Conda环境condadeactivate#退出该环境condaremove-np2s--all#删除整个环境PIP安装与展示Pip安装第三方库......
  • datawhale task01,02
    python要点conda![1700559481851](C:\Users\25322\Documents\WeChatFiles\wxid_xc71h7t6nm2i22\FileStorage\Temp\1700559481851.png)注释单行注释以#开头多行注释可以用多个#号,还有'''和""".程序员最讨厌的10件事:0:别人的代码不写注释​......
  • STM32使用SDIO模式和DMA实现SD卡的读写及擦除操作
    对于STM32操作SD卡来说,最重要的就算初始化、写操作、读操作、擦除这几个操作了。对于初始化部分上一篇文章已经分析,本篇就主要分析写、读、擦除操作。本篇函数来自于STM32提供的例程。参考野火的程序进行了解释,与野火函数有些不同。这几种函数完成之后,就是开始实现对SD卡进行操作了......
  • Datewhale学习笔记0
    $\textcolor{blue}{Datewhale学习笔记}$$\textcolor{blue}{Chapter0}$......
  • Datewhale学习笔记1
    $\textcolor{blue}{Datewhale学习笔记}$$\textcolor{red}{chap1}$第一行代码LanguageC#include<stdio.h>intmain(){printf("Hello,World");return0;}In[3]print("聪明办法学Python")聪明办法学PythonHelloWorld的由来main(){pri......
  • shallow heap与remainder heap
     具有HeapProfiler功能的工具,如mat(memoryanalysetool)、GoogleHeapProfiler、JProfiler等,经常会出现shallowheap与remainderheap,这两个词在我们的实际开发中基本没有出现过,那么我们在用mat解析dump出来的Java内存文件时,出现的这两个词究竟是什么意思呢?shallowheaps......
  • podman容器无法从外部连接
    启动容器时添加--nethost参数即可podmanrun-d-p80:80--rm--network=host--namenginxnginx如果有防火墙可以尝试放行端口#放行ufwallow80#关闭ufwdeny80......
  • Docker开始收费了,开始转学podman【第一篇podman容器的安装和基本操作】
    podman什么是Podman?Podman是无守护程序容器引擎,用于在Linux系统上开发,管理和运行OCI容器。容器可以以root用户或无根模式运行。简而言之:`aliasdocker=podman`。Podman(PodManager)是一个功能齐全的容器引擎,它是一个简单的无守护工具。Podman提供了一个类似Docker-CLI的命令......