STM32:使用RS485和多摩川编码器通信

news2024/12/23 17:44:39

本文主要讲使用STM32F767和绝对式多摩川TS5700N8501编码器通信的流程和注意事项。

首先使用STM32CubeMX生成RS485驱动部分功能代码,注意该款编码器的波特率是2.5Mbps。

 

 

注意使能的GPIO可以使用其他管脚,我们的主控板使用的是PA8。前期可以这么配置。

 配置时钟,这里配置的是48MHz。

 接下来,生成对应的项目工程,MDK-ARM就是生成对应的Keil工程。 

 接下来是接线:注意编码器正确接4根线即可。黑色接地,红色接5V电源。编码器的SD是蓝色,对应接的是控制板上面的\overline{SD}管脚。编码器的\overline{SD}是蓝黑色,对应接的是控制板上面的SD管脚。

注意编码器要保证5V供电,并且编码器的线比较细要注意保证连接可靠。 测试中遇到供电电压达不到5V,以及黑色接地线接触不好的情况,都会导致无法正常通信。

 

void MX_UART4_Init(void)
{

  /* USER CODE BEGIN UART4_Init 0 */

  /* USER CODE END UART4_Init 0 */

  /* USER CODE BEGIN UART4_Init 1 */

  /* USER CODE END UART4_Init 1 */
  huart4.Instance = UART4;
  huart4.Init.BaudRate = 2500000;
  huart4.Init.WordLength = UART_WORDLENGTH_8B;
  huart4.Init.StopBits = UART_STOPBITS_1;
  huart4.Init.Parity = UART_PARITY_NONE;
  huart4.Init.Mode = UART_MODE_TX_RX;
  huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart4.Init.OverSampling = UART_OVERSAMPLING_16;
  huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_RS485Ex_Init(&huart4, UART_DE_POLARITY_HIGH, 0, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN UART4_Init 2 */

//  HAL_UART_Receive_IT(&huart4, rs485RxData, 1);
  /* USER CODE END UART4_Init 2 */

}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  if(uartHandle->Instance==UART4)
  {
  /* USER CODE BEGIN UART4_MspInit 0 */

  /* USER CODE END UART4_MspInit 0 */
  /** Initializes the peripherals clock
  */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_UART4;
    PeriphClkInitStruct.Uart4ClockSelection = RCC_UART4CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

    /* UART4 clock enable */
    __HAL_RCC_UART4_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**UART4 GPIO Configuration
    PA0/WKUP     ------> UART4_TX
    PA1     ------> UART4_RX
    PA8     ------> UART4_DE
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* UART4 DMA Init */
    /* UART4_RX Init */
    hdma_uart4_rx.Instance = DMA1_Stream2;
    hdma_uart4_rx.Init.Channel = DMA_CHANNEL_4;
    hdma_uart4_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_uart4_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_uart4_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_uart4_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_uart4_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_uart4_rx.Init.Mode = DMA_NORMAL;
    hdma_uart4_rx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_uart4_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_uart4_rx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmarx,hdma_uart4_rx);

    /* UART4 interrupt Init */
    HAL_NVIC_SetPriority(UART4_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(UART4_IRQn);
  /* USER CODE BEGIN UART4_MspInit 1 */

  /* USER CODE END UART4_MspInit 1 */
  }
}

测试程序: 

void RS485_SendData(uint8_t *data, uint16_t size)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
	HAL_UART_Transmit(&huart4, data, size, 1000);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
}

void RS485_RecvData(uint8_t *data, uint16_t size)
{
	HAL_UART_Receive(&huart4, data, size, 1000);
}

void RS485_Test(void)
{
    uint8_t Sendbuf[1] = {0x02};
    uint8_t Recvbuf[10] = {0x00};

    RS485_SendData(Sendbuf, sizeof(Sendbuf));

    RS485_RecvData(Recvbuf, 6);

    for(int i = 0; i < 6; i++)
    {
        Usart_Printf("%02x", Recvbuf[i]);
    }

    Usart_Printf("\n\r");
}

测试程序运行结果: 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/723658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zabbix的安装

前提 作为一个运维&#xff0c;需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等&#xff0c;利用监控系统的数据去了解网站上线发布的结果和健康状态。 利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器…

Linux—实操篇:用户管理

1、基本介绍 Linux系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个 账号&#xff0c;然后以这个账号的身份进入系统。 2、添加用户 基本语法&#xff1a; useradd 用户名 细节说明&#xff1a; 1、…

【Kafka】Kafka基础操作笔记

【Kafka】Kafka基础操作笔记 文章目录 【Kafka】Kafka基础操作笔记1. 两种模式1.1 点对点模式1.2 发布/订阅模式 2. 基础架构3. Topic命令行操作3.1 查看 Topic 操作3.2 创建 Topic3.3 查看所有 Topic3.4 查看 Topic 的详情3.5 修改分区数3.6 删除 Topic 1. 两种模式 Kafka作为…

Linux设备驱动基础04:Linux设备驱动中的互斥与同步(部分)

1 并发与竞态 1.1 竞态概念 1. 并发&#xff08;Concurrency&#xff09;是指多个执行单元在同一时间段内执行&#xff08;但并不一定在同一时刻&#xff09;&#xff0c;而并发的执行单元对共享资源&#xff08;包括硬件资源和软件资源&#xff09;的访问就会导致竞态&#…

期货程序化交易软件文华财经和无限易那个成交速度快?自编软件能不能接CTP通道?

期货程序化交易软件是指可以根据预设的策略和条件&#xff0c;自动执行买卖指令的软件。期货程序化交易软件有很多种&#xff0c;不同的软件有不同的特点和优劣&#xff0c;选择哪一种要根据自己的需求和偏好。 期货程序化交易是指将交易思路用编程语言编写成计算机可以执行的指…

Zabbix 6.0 介绍及部署

目录 一、Zabbix 6.0 介绍1. 简介2. **利用一个优秀的监控软件带来的好处**3. **zabbix 6.0 的功能组件**4.zabbix 监控原理 二、Zabbix 6.0 部署 一、Zabbix 6.0 介绍 1. 简介 Zabbix 是由 Alexei Vladishev 创建&#xff0c;目前是由 Zabbix SIA 在持续开发和提供支持。zab…

2023秋招,软件测试面试八股文(有答案版),金九银十季,涨薪涨薪

最近呢有很多的小伙伴问我有没有什么软件测试的面试题&#xff0c;由于笔者之前一直在忙工作上的事情&#xff0c;没有时间整理面试题&#xff0c;刚好最近休息了一下&#xff0c;顺便整理了一些面试题&#xff0c;现在就把整理的面试题分享给大家&#xff0c;希望可以帮助到各…

途乐证券|指数反弹上行周期仍未结束 建议继续做多

股票的开盘价通常可以表示商场的情绪&#xff0c;一起还能影响投资者进行决策。那么股票低开好仍是高开好&#xff1f;股票低开高走再回落是什么意思&#xff1f;下面为我们预备了相关内容&#xff0c;以供参考。 股票低开好仍是高开好&#xff1f; 股票高开比较好。股票高开阐…

kali安装安全漏洞扫描工具Snyk

进kali&#xff0c;sudo su进入root用户 apt install npm 下载npm sudo npm install -g snyk 安装snyk snyk auth进行授权&#xff0c;会自动跳转到一个网页&#xff0c;我选的是github授权。 如果github上不去的话&#xff0c;物理机上面科学上网开个全局就行了&#xff0c;…

WWW(URL,HTTP,HTML)

1.WWW 万维网(World Wide Web&#xff0c;WWW)&#xff0c;是一个规模巨大、可以互联的资料空间。该资料空间的资源依靠URL进行定位&#xff0c;通过HTTP协议传送给使用者&#xff0c;又由HTML来进行文档的展现。由定义可以知道WWW的核心由三个主要标准构成:URL、HTTP、HTML。(…

软件设计模式与体系结构-设计模式-行为型软件设计模式-访问者模式

目录 二、访问者模式概念代码类图实例一&#xff1a;名牌运动鞋专卖店销售软件实例二&#xff1a;计算机部件销售软优缺点适用场合课程作业 二、访问者模式 概念 对于系统中的某些对象&#xff0c;它们存储在同一个集合中&#xff0c;具有不同的类型对于该集合中的对象&#…

力扣算法练习(三)

目录 1. N 字形变换&#xff08;6&#xff09; 题解一&#xff08;力扣官方解析力扣&#xff09; 题解二&#xff08;官方解法&#xff09; 题解三&#xff08;力扣&#xff09; 2. 整数反转&#xff08;7&#xff09; 题解一 题解二 题解三&#xff08;官方解析&#…

车辆在刹车不及时导致与行人发生碰撞事故,产生出险记录

车辆在刹车不及时导致与行人发生碰撞事故&#xff0c;是一种常见的交通事故。当发生此类事故时&#xff0c;车主需要及时处理保险理赔事宜&#xff0c;同时也需要了解车辆出险、理赔、事故记录情况&#xff0c;以便更好地维护车辆和自身权益。为方便车主查询车辆出险、理赔、事…

UI自动化测试工具能够做的几件事情

UI自动化测试工具在软件开发过程中发挥着重要的作用。它们可以帮助测试人员自动执行各种用户界面操作&#xff0c;验证界面功能和性能&#xff0c;提高测试效率和质量。本文将介绍UI自动化测试工具能够做的几件事情&#xff0c;并解释为什么它们对测试人员来说非常有价值。 首先…

UE5 plugin failed to load because module could not be found

解决方法&#xff1a;将提示缺少的插件加入到.uproject中即可解决

Liunx系统编程:系统层面上的文件IO接口

目录 一. 如何在系统层面上理解文件 二. 语言层面上的文件IO函数 三. Linux操作系统提供的IO接口 3.1 open接口 -- 打开文件 3.2 close接口 -- 关闭文件 3.3 write接口 -- 向文件中写内容 3.4 read接口 -- 从文件中读取内容 四. 总结 一. 如何在系统层面上理解文件 在L…

axios文件上传和 Content-Type类型介绍

Content-Type的作用是什么&#xff1f; Content-Type: 用于在请求头部指定资源的类型和字符编码。 请求头中的content-type&#xff0c;就是 B端发给S端的数据类型描述 。 即告诉服务器端&#xff0c;我给你传的数据是某种类型的。 服务器端针对不同类型的数据&#xff0c;做法…

分布式监控Zabbix的部署

zabbix 6.0 一、zabbinxzabbix的简介Zabbix 6.0 功能组件zabbix的监控原理zabbix 6.0的特性 二、zabbix 6.0 部署部署 Nginx PHP 环境并测试部署数据库&#xff0c;要求 MySQL 5.7 或 Mariadb 10.5 及以上版本编译安装 zabbix Server 服务端部署 Web 前端&#xff0c;进行访问…

HTTP的一些概念

文章目录 HTTP定义URI&URL HTTP 常见的状态码http 首部请求首部字段响应首部字段为cookie服务的首部字段get请求和post请求及区别GET 和 POST 方法是否安全和幂等 HTTP特性HTTP&#xff08;1.1&#xff09; 的优点有哪些HTTP/1.1 的缺点HTTP/1.1 的性能HTTP/1.1 相比 HTTP/…

[MySQL]表的操作

[MySQL]表的操作 文章目录 [MySQL]表的操作1. 创建表2. 创建表的示例3. 查看表4. 修改表5. 删除表6. 关于表操作 1. 创建表 语法&#xff1a; CREATE TABLE [IF NOT EXISTS] table_name(field1 datatype1 [COMMENT 注释信息],field2 datatype2 [COMMENT 注释信息],field3 dat…