上一篇文章中先初步介绍了多摩川编码器的通讯基础,基于STM32F405平台的多摩川协议编码器通讯过程(1)
这篇文章接着写上述过程在stm32f405上面的实现过程,以及可能踩过的一些坑。

STM32F405的USART简介

通用同步异步收发器 (USART) 能够灵活地与外部设备进行全双工数据交换,满足外部设备对
工业标准 NRZ 异步串行数据格式的要求。USART 通过小数波特率发生器提供了多种波特率。
它支持同步单向通信和半双工单线通信;还支持 LIN(局域互连网络)、智能卡协议与 IrDA
(红外线数据协会)SIR ENDEC 规范,以及调制解调器操作 (CTS/RTS)。而且,它还支持
多处理器通信。
通过配置多个缓冲区使用 DMA 可实现高速数据通信

配置

#define pin485TX (GPIOB->BSRR = GPIO_PIN_5)
#define pin485RX (GPIOB->BSRR = (uint32_t)(GPIO_PIN_5<<16))
//串口======================================================================================
void uart_init(uint32_t pclk2,uint32_t bound)
{float temp;uint16_t mantissa;uint16_t fraction;       temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0mantissa=temp;                 //得到整数部分fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0 mantissa<<=4;mantissa+=fraction;//使能时钟RCC->AHB1ENR|=1<<1;      //使能PORTB口时钟  RCC->APB2ENR|=1<<4;     //使能串口1时钟 //配置GPIOGPIO_Set(GPIOB,GPIO_PIN_6|GPIO_PIN_7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU);//PB6,PB7,复用功能,上拉输出GPIO_Set(GPIOB,GPIO_PIN_5,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU);GPIO_AF_Set(GPIOB,6,7);GPIO_AF_Set(GPIOB,7,7);pin485TX;//低16位,置位,写//波特率设置USART1->BRR=mantissa;  //波特率设置  USART1->CR1&=~(1<<15);   //设置OVER8=0 USART1->CR1|=1<<3;   //串口发送使能USART1->CR1 |= (1<<2);  //串口接收使能USART1->SR &= ~(1<<6);  //清发送完成标志位USART1->CR1|=1<<6;      //TCIE=1发送完成中断使能USART1->CR3 |= 1<<6; //允许DMA接收//中断配置HAL_NVIC_SetPriority(USART1_IRQn,3,3);NVIC_EnableIRQ(USART1_IRQn);           //使能定时器中断USART1->CR1|=1<<13;      //串口使能}void USART1_IRQHandler(void)
{if (USART1->SR & (1<<6))  //USART1发送完成中断{USART1->SR &= ~(1<<6); //清发送完成标志位USART1->CR1 &= ~(1<<3); //禁止发送if (Tcheck.Tcheck_TC_Int_Cnt < 127)Tcheck.Tcheck_TC_Int_Cnt++;elseTcheck.Tcheck_TC_Int_Cnt = 0;pin485RX;                                //高16位,复位,读USART1->CR1|=1<<2;          //串口接收使能USART1->CR3 |= (1<<6);//允许DMA接收DMA2_Stream2->CR&=~(1<<0);   //关闭DMA传输 while(DMA2_Stream2->CR&0X1);   //确保DMA可以被设置 DMA2_Stream2->NDTR =6;//传输长度DMA2_Stream2->CR|=  (1 << 0);//使能DMA}
}

概括:首先将PB6和PB7配置成串口的收发接口。将PB5配置成485芯片的收发功能切换引脚,对于485芯片SN65HVD75DR的使用,我的上一篇文章提到了。基于STM32F405平台的多摩川协议编码器通讯过程(1)
由于串口每次只发送一个字节,因此其发送部分只依赖串口的配置就可以,并且打开发送完成中断,TCIE=1,为的是在每次在数据发送完成之后,切换配置,准备编码器数据的接收。接收部分为了提高效率我们用DMA实现数据的自动转移。DMA完成数据的转移之后也要进入中断,关于DMA的配置放在下面。

//DMA============================================================================
void DMA2_Stream2_IRQHandler(void)
{uint32_t sr;if (Tcheck.Tcheck_RDMA_Cnt < 127)Tcheck.Tcheck_RDMA_Cnt++;elseTcheck.Tcheck_RDMA_Cnt = 0;sr = DMA2->LISR;//发送完成标志位DMA2->LIFCR = sr;//清发送完成标志位
}void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,uint8_t chx,uint32_t par,uint32_t mar,uint16_t ndtr,uint8_t swit)
{DMA_TypeDef *DMAx;uint8_t streamx;if((uint32_t)DMA_Streamx>(uint32_t)DMA2){DMAx=DMA2;//RCC->AHB1ENR|=1<<22;//DMA2时钟使能 }else {DMAx=DMA1; //RCC->AHB1ENR|=1<<21;//DMA1时钟使能 }while(DMA_Streamx->CR&0X01);//等待DMA可配置 streamx=(((uint32_t)DMA_Streamx-(uint32_t)DMAx)-0X10)/0X18;      //得到stream通道号if(streamx>=6)DMAx->HIFCR|=0X3D<<(6*(streamx-6)+16);    //清空之前该stream上的所有中断标志else if(streamx>=4)DMAx->HIFCR|=0X3D<<6*(streamx-4);    //清空之前该stream上的所有中断标志else if(streamx>=2)DMAx->LIFCR|=0X3D<<(6*(streamx-2)+16);//清空之前该stream上的所有中断标志else DMAx->LIFCR|=0X3D<<6*streamx;                       //清空之前该stream上的所有中断标志DMA_Streamx->PAR=par;      //DMA外设地址DMA_Streamx->M0AR=mar;     //DMA 存储器0地址DMA_Streamx->M1AR=mar;DMA_Streamx->NDTR=ndtr;       //DMA 存储器0地址DMA_Streamx->CR=0;          //先全部复位CR寄存器值 if (swit == 0){DMA_Streamx->CR|=1<<6;     //存储器到外设模式}else if (swit == 1){DMA_Streamx->CR|=0<<6;       //外设到存储器DMA_Streamx->FCR=0;         //FIFO控制寄存器DMA_Streamx->CR |= (1<<4); //传输完成中断使能}DMA_Streamx->CR|=0<<8;     //非循环模式(即使用普通模式)DMA_Streamx->CR|=0<<9;        //外设非增量模式DMA_Streamx->CR|=1<<10;      //存储器增量模式DMA_Streamx->CR|=0<<11;      //外设数据长度:8位DMA_Streamx->CR|=0<<13;        //存储器数据长度:8位DMA_Streamx->CR|=1<<16;       //中等优先级DMA_Streamx->CR|=0<<21;        //外设突发单次传输DMA_Streamx->CR|=0<<23;     //存储器突发单次传输DMA_Streamx->CR|=(uint32_t)chx<<25;//通道选择MY_NVIC_Init(3,4,DMA2_Stream2_IRQn,2);
}

遇到的问题

  1. 若在初始化时就允许进入DMA2_Stream2_IRQHandler接收DMA完成传输中断,会在编码器拔插之后出现接收数据顺序错乱的情况,此时应注意在开始发送时和发送完成后及时开关串口的收发功能和DMA的接收功能
  2. 串口发送完成中断中需允许DMA接收功能,若先禁止DMA2_Streamx,待完全禁止后,再使能DMA2_Streamx,会导致启动后对应DMA2_Streamx的TCIF被置位,错误的进入DMA中断,而且是每两次操作进一次DMA中断。需要注意的是,不管HTIF是否被使能,对应的这一中断标志位都不会出现类似的误置位情况。
  3. 20kHz更新数据时,若ID3读取全部数据,时间不够,会导致485切换不及时引起数据错误因此发送ID3需另寻低频调用处。

基于STM32F405平台的多摩川协议编码器通讯过程(2)相关推荐

  1. android sip协议栈,基于Android平台及SIP协议的软电话系统的研究

    摘要: 随着互联网通信技术不断发展以及智能手机的日益流行,VoIP(Voice Over InternetProtocol)技术得到了越来越广泛的应用.VoIP技术能结合这两者改变传统长途电话费用高昂 ...

  2. 基于Qt平台利用UDP协议传输大文件(百度网盘免费代码)

    UDP协议单次传输文件不能超过512字节,否则UDP数据包在IP曾需要拆分再重组,很容易出错. 我们采取的办法是将需要传输的文件进行组包:服务器端组包,一个包由228字节的数据和28字节的包头组成,包 ...

  3. 利用SSL协议配置web服务器,基于windows2008平台配置实现利用SSL协议的安全IISWeb服务器汇总.doc...

    PAGE \* MERGEFORMAT - 24 - PAGE \* MERGEFORMAT - 1 - 石河子大学信息科学与技术学院 课程设计报告2014-2015学年第一学期 题目名称:基于win ...

  4. 多摩川绝对值编码器CPLD FPGA通信源码(VHDL格式+协议+说明书)

    多摩川绝对值编码器CPLD FPGA通信源码(VHDL格式+协议+说明书) 用于伺服行业开发者开发编码器接口,对于使用FPGA开发电流环的人员具有参考价值. 适用于TS5700N8501,TS5700 ...

  5. 嵌入式linux编码器,基于嵌入式平台的视频编码器的实现-嵌入式系统-与非网

    引言 H.264是由ISO(国际标准化组织)/IEC(国际电工协会)和ITU(国际电信标准化部门)合作制定的新一代视频编码标准,目前正处于应用开发阶段.与以往的视频编码标准相比,h.264具有更高的压 ...

  6. linux局域网语音通讯软件下载,基于Linux平台的局域网可语音的IM软件的设计与实现.doc...

    基于Linux平台的局域网可语音的IM软件的设计与实 作者: 专业:软件工程 指导老师: 摘要 随着计算机网络的日益普及人们通过网络进行交流显得越来越重要.于是出现了一系列的通信软件. 自1990s ...

  7. 基于ROS平台的STM32小车--汇总

    一切为了实现利用ros通过串口控制小车简单运动 基于ROS平台的STM32小车-4-上位机控制器 https://blog.csdn.net/weixin_39752599/article/detai ...

  8. 基于开源jabber(XMPP)架设内部即时通讯服务的解决方案

    原文地址:基于开源jabber(XMPP)架设内部即时通讯服务的解决方案 作者:高傲的活着 Jabber 是著名的即时通讯服务服务器,它是一个自由开源软件,能让用户自己架即时通讯服务器,可以在Inte ...

  9. 物联网云平台DTU Modbus协议 上位机 下位机 源码 源代码 程序

    物联网云平台DTU Modbus协议 上位机 下位机 源码 源代码 程序 一.源码的使用基本说明: 1.1 编译语言: 下位机使用C语言:上位机使用C#语言 标准Modbus Slave通信下位机源码 ...

  10. python 机器人运动仿真_基于ros平台的移动机器人的设计与运动仿真-创新创业训练计划.pdf...

    基于ros平台的移动机器人的设计与运动仿真-创新创业训练计划 基于ROS 平台的移动机器人的设计与运动仿真 陈勇林 朱应钦 杜政恒 张玉林  (重庆大学城市科技学院电气信息学院,重庆 永川 402 ...

最新文章

  1. 虚拟机下CentOS 6.5配置IP地址的三种方法
  2. Ubuntu 14.04下 Redis MongoDB安装及使用
  3. kibana7.x操作
  4. 洛谷 - P4014 分配问题(费用流/KM)
  5. 问题 1066: 2004年秋浙江省计算机等级考试二级C 编程题(2)
  6. java学习(123):treeset排序集合
  7. 踩准时钟节拍、玩转时间转换,鸿蒙轻内核时间管理有妙招
  8. vscode vue解决跨域_在vs code 中如何创建一个自己的 Vue 模板代码
  9. messagebox弹窗_从案例入手学Python——检测文件生成并弹窗提醒
  10. Calendar 日历类的时间操作
  11. 异常处理2:异常处理方式、问区别的面试题汇总
  12. cad字体修改方案分享-缺少SHX字体、替换字体
  13. 黑客之门:深入浅出windows的dll文件[图]
  14. Dev-Cpp 切换界面语言中文
  15. TCP|IP+WIFI无线远程网络RFID|NFC读卡器HX530-Q-A系列Server网络模式与 Client网络模式设置说明
  16. 微信小程序实验一 ——— 简单计算器与秒表
  17. python(模块)xlsxwriter
  18. 朋友python多个逻辑条件判断_Python小课笔记--Python控制流:if逻辑判断
  19. 服务器vmware私有云,方案建议-使用VMware架构搭建自己的私有云.pptx
  20. walking与Matlab入门教程-控制walking机器人移动

热门文章

  1. 快速导入十亿数据到hugegraph图数据库
  2. 百变人脸,趣味容颜,ALAE 人脸玩出新高度!
  3. LaTex缺少宏包问题
  4. 给大学生的劝告——你们为何应该开始接触UNIX/Linux
  5. Linux系统下载谷歌浏览器
  6. android 的android httpClient详解
  7. c语言程序设计贪吃蛇报告,C语言“贪吃蛇”程序设计报告.doc
  8. java 死链检测_网站死链检测工具/网站地图生成工具
  9. 初步实现免费下载百度文库word文档(只限纯文本文档)----------------(浏览器控制台执行js代码)
  10. c语言实验——G-鞍点计算