STM32F103VG使用RTT实现发送DMX512调光数据

2023-11-19

DMX512调光协议和DALI一样属于数字调光协议,一个完整的DMX512数据包格式:1break+1mab+1startcode+512个调光数据。

DMX512发送是基于485串口的基础上实现的特殊的数据协议。

使用RTT需要把串口打开并且定义好相应的定义,这里不再赘述;因RTT的部分外设初始化不完善,本次使用的HAL库进行初始化部分。

实现步骤:

1.初始化GPIO口,使能485串口的3.3v以及使能为发送模式,这个根据实际需求进行初始化

/*
 * 初始化dmx512所要用到的pin,打开485的3.3v以及使能发送模式   PC8 3.3v, PC9 模式控制
 * */
int dmx512_pin_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOC_CLK_ENABLE();

     /*Configure GPIO pin Output Level */
     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);

     /*Configure GPIO pin Output Level */
     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);

     /*Configure GPIO pins : PC7 PC8 PC9 */
     GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

     return RT_EOK;
}

2.初始化要用到的485串口,数据位9,波特率250000

/*
 * 初始化dmx512所要用到的uart4
 * */
int dmx512_uart_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_UART4_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();

    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    huart4.Instance = UART4;
    huart4.Init.BaudRate = 250000;
    huart4.Init.WordLength = UART_WORDLENGTH_9B;
    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;
    HAL_UART_Init(&huart4);

    return RT_EOK;
}

3.写一个切换串口引脚功能的函数,用于形成break和mab信号

/*
 * 切换dmx512发送pin脚的模式
 * */
int dmx512_pin_mode(int mode)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    if(mode)    //mode=1,当串口发送用,在dmx512发送中主要用于发送数据帧
    {
        GPIO_InitStructure.Pin = GPIO_PIN_10;
        GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; //复用推挽输出
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
    }
    else if(mode == 0)//mode=0,当普通io用,在dmx512发送中主要用来形成break和mab信号
    {
        GPIO_InitStructure.Pin = GPIO_PIN_10;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;  //推挽输出
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
    }
    return RT_EOK;
}

4.写DMX512的数据发送函数,定义全局变量 int pDMX_buf、char dmx_buf[513]

/*
 * dmx512发送数据函数
 * */
int dmx512_send_frame(void)
{
    dmx512_pin_mode(0);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, 0);
    rt_hw_us_delay(100);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, 1);
    rt_hw_us_delay(10);
    dmx512_pin_mode(1);

    for(pDMX_buf = 0; pDMX_buf <= 512; pDMX_buf++)  //0:startcode   1-512:调光数据
    {

        if(pDMX_buf == 0)
        {
            UART4->DR = 0x00 | 0x100;//第一帧startcode
            while((UART4->SR & 0X40) == 0); //确保数据发送完成
        }

        else
        {
            UART4->DR = 0x100 | dmx_buf[pDMX_buf];
            while((UART4->SR & 0X40) == 0);     //确保数据发送完成
        }

    }
    return RT_EOK;
}

5.写一个DMX512的初始化函数,可以把前面的初始化的所有函数放进去并开启线程用于发送DMX512数据

*
 * 包含了dmx512所用到的所有初始化,并开启线程发送dmx512数据
 * */
int dmx512_init(void)
{
    int ret = RT_EOK;
    dmx512_pin_init();
    dmx512_uart_init();
    /* 创建 serial 线程 */
    rt_thread_t thread = rt_thread_create("dmx512", dmx512_send_thread, RT_NULL, 1024, 25, 10);
    /* 创建成功则启动线程 */
    if (thread != RT_NULL)
    {
        rt_thread_startup(thread);
    }
    else
    {
        ret = RT_ERROR;
    }

    return ret;
}

6.实现线程函数,每隔400ms发送一个DMX512数据包

/*
 * dmx512数据发送线程,dmx512数据需要持续发送而且必须在1S内发送下一条
 * */
static void dmx512_send_thread(void *parameter)
{
    while(1)
    {
        dmx512_send_frame();
        rt_thread_mdelay(400);
    }

}

7.将dmx512_init放到MAIN中执行即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103VG使用RTT实现发送DMX512调光数据 的相关文章

  • 你知道几个电子相册制作方法?让我来给你分享

    你知道什么是电子相册吗 其实电子相册就是我们把照片编辑成视频的另一个说法 这样的视频一般都带有神奇的转场特效 可以自定义的贴纸和背景 很多小伙伴的爸爸妈妈都很喜欢用这样的方式来制作他们的相册 展示他们拍摄的图片 那这样的电子相册在线制作的方
  • 机器配音解说可以用什么软件弄?我来告诉你

    大家每一天工作时都要长时间接触电子屏幕 下班回家之后 小说吸引力是不是不如从前了 别急着让喜欢的作者 背锅 我想 你们之所以 收藏从未停止 阅读从未开始 也有一部分原因是眼睛累了 所以自然就会觉得小说不好看 不过 难道打工人就无法全身心地沉
  • 职场人最忌讳的10件事:从人性的角度揭示职场中的禁忌行为

    职场人最忌讳的10件事 从人性的角度揭示职场中的禁忌行为 在职场中 每个人都有自己的行为准则和价值观 然而 有些事情却是普遍被认为不可取的 从人性的角度来看 这些事情可能会触碰到人们的某些心理或道德底线 导致他人产生反感或不信任 本文将探讨
  • 关闭2个开关,让你的手机电池续航翻倍

    随着智能手机的普及 手机已经成为我们生活中不可或缺的一部分 然而 随着使用时间的增长 很多用户发现手机电池续航能力逐渐下降 其实 这可能是因为你没有关闭手机上的两个重要开关 接下来 我们就来看看这两个开关是什么 以及为什么关闭它们能够延长手
  • 在线识别图片文字工具有哪些?教你快速提取文字

    文字识别工具 也称为光学字符识别 OCR 工具 是一种能将图像中的文本信息转化为可编辑和可搜索的数字格式的过程 它是现代信息处理和人工智能领域的重要应用之一 文字识别工具的作用在于 无论是纸质文档 电子文档还是照片上的文字 都能通过该工具进
  • “性能压测揭密:关键指标分析!“

    在进行全链路压测和性能测试时 需要关注多个关键性能指标 KPIs 来评估系统的性能表现 以下是一些常见的性能测试指标 1 吞吐量 Throughput 系统在单位时间内能够处理的请求数量或事务数量 通常以每秒请求数 RPS TPS 来衡量
  • 太阳诱电 | 电容器为什么会发热?什么是纹波电流

    电容器中存在寄生于电极和电介质的电阻成分 当纹波电流等交流电流通过电容器时 电阻的成分会产生热量 为了抑制发热 选择ESR较低的电容器非常重要 陶瓷电容器在电容器中ESR较低 非常适合抑制发热 电容器中的纹波电流主要是指电源电路中由于IC的
  • 基于电源完整性的PCB设计原则

    基于电源完整性的一些PCB设计建议 1 尽量减少电源和地通路之间的环路电感 在相邻的层上分配电源和接地面时 使用尽可能薄的电介质 2 通过在平面之间使用尽可能高的介电常数来获得平面之间的最低阻抗 与尽可能薄的介电常数设计保持一致 3 使用尽
  • 怎么把视频压缩变小?节约空间的工具推荐

    nbsp 我平时逛街的时候 看见有趣的事情就忍不住会用视频的方式记录下来 有时候还会拍给朋友看 但是 这些视频占据大量的存储空间 给我的手机带来不小的压力 所以有时候 为了方便分享或传输 我就会将视频文件压缩 以便更轻松地将其发送给朋友或发
  • 海报模板怎么进行编辑文字?公司宣传海报就这样做

    作为负责公司宣传事宜的部门 我每天不是在做海报 就是在找做海报的素材 力求要把这些宣传的物料都做得精致又有内容 经过我长时间的试用下来 给大家从基本功能 使用体验和不同场景下的应用这几个方面 总结出了海报制作软件哪个好用 接下来就让我为你详
  • 储存设备的进化与发展:从传统到现代的飞跃

    随着科技的飞速发展 储存设备作为信息时代的基石 经历了翻天覆地的变化 从最早的机械硬盘到现代的固态硬盘和云存储 储存设备的进化与发展不仅提升了数据存储的速度和容量 还极大地改变了我们的工作和生活方式 本文将带您回顾储存设备的进化历程 并探讨
  • 短视频时代:影响播放量的秘密与破解之道

    在当下这个信息爆炸的时代 短视频已经成为我们日常生活的一部分 无论是刷朋友圈 看新闻还是消磨时光 短视频都是我们的首选 正因为如此 许多自媒体人和内容创作者纷纷投身到这片热土 希望通过短视频实现自己的价值 然而 许多人在创作过程中都会遇到一
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • IO输入溢出(转载+整理)

    gets 防止缓冲区溢出 描述了高水平的缓冲区溢出攻击 以及讨论了为什么缓冲区溢出是如此严重的安全性问题 本专栏文章的主题是 通过防御性编程保护代码不受缓冲区溢出攻击 我们将论及 C编程语言中的主要安全性陷阱 显示应该避免特殊构造的原因 以
  • Bad owner or permissions on /root/.ssh/config

    vmware centos 部署 hadoop集群 启动hadoop节点 报错Bad owner or permissions on root ssh config 原因 SSH关于公钥认证Permission denied的问题 不能直接
  • 安装好后如何查看mysql/apache/nginx/php安装参数

    查看mysql编译参数 cat usr local mysql bin mysqlbug grep CONFIGURE LINE 查看apache编译参数 cat apachehome build config nice 查看php编译参数
  • 《机器学习》二刷超详细笔记

    博主在4月学完西瓜书时 一头雾水 觉得还是一知半解 9月开学后上完了必修的 machine learning 课程 并且自己编程实现了多种机器学习算法和论文复现后 才对机器学习有一点了解 现在再次翻阅西瓜书 很多知识点看到都豁然开朗 所以出
  • Debian 某些程序无法使用中文输入法设置方法

    debian系统下发现某些程序不能写入中文 下面是我解决的方法 sudo apt get install fcitx frontend qt5 1 我们可以通过在命令行下输入 dpkg L fcitx frontend qt5 1 修改配置
  • 如何解决apt-get中Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify的问题

    在Ubuntu中用apt get安装软件 系统报出Unmet dependencies错误 Unmet dependencies Try apt fix broken install with no packages or specify
  • 【Python-Anaconda】在anaconda中创建、激活虚拟环境;在anaconda中所创建的虚拟环境中安装OpenCv;如何在jupter notebook中使用所创建的虚拟环境

    一 在anaconda中创建虚拟环境 1 为什么要创建虚拟环境 答 为了避免库依赖冲突 所以在安装pytorch tensflow等时最好创建虚拟环境进行安装 2 创建虚拟环境步骤 1 打开anaconda prompt 输入如下代码 co
  • 基于AJAX技术提高搜索引擎排名

    描述 嵌入在你的web页面中的导航元素能够降低你的搜索引擎评价排名并且降低你的网站的响应性能 本文作者想同你一起探讨如何使用AJAX技术来解决这两个问题 许多设计良好的web站点都包含大量的与实际内容相联系的可导航信息 用于导航的HTML标
  • 【C++】抽象类

    2023年8月25日 周五上午 目录 声明抽象类 抽象类的特点 举例说明 声明抽象类 要在C 中声明一个抽象类 要求类中至少有一个纯虚函数 在C 中 一个类如果包含至少一个纯虚函数 那么这个类就被称为抽象类 总结起来 抽象类是一个包含至少一
  • 了解如何在20分钟内创建您的第一个Angular应用

    Angular is a JavaScript framework created my Misko Hevery and maintained by Google It s an MVC Model View Vontroller You
  • Verilog实现两路组相联cache

    cache代码 timescale 1ns 1ps cache共32块 分为16组 每组2块 即两路组相联 1块 4字 1字 4字节 主存共1024块 4096个字 主存地址共12位 1 0 为块内偏移 5 2 为组地址 11 6 为Tag
  • 【MATLAB第43期】基于MATLAB的BO-NAR贝叶斯优化动态神经网络NAR时间序列股票预测模型

    MATLAB第43期 基于MATLAB的BO NAR贝叶斯优化动态神经网络NAR时间序列股票预测模型 一 效果展示 二 模型介绍 1 数据情况 一列数据 499个值 ratio 0 9 训练集比例 MaxEpochs 600 最大训练次数
  • Fatal error in gc GetThreadContext failed bug 异常。

    Fatal error in gc GetThreadContext failed PC unity5 3 4 c exe windows 废话不说 网上各种回答是杀毒软件关闭 但是需求不允许关闭其他 只能从代码出发 发现 开个一个线程 这
  • 13 openEuler用户组管理

    文章目录 13 1 创建用户组 13 1 1 groupadd命令 13 1 2 用户组信息文件 13 1 3 创建用户组实例 13 2 修改用户组 13 2 1 修改GID 13 2 2 修改用户组名 13 3 删除用户组 13 4 将用
  • DSS部署-11、Spark on Yarn部署

    文章目录 第七部分 Spark on Yarn部署 相关配置 操作记录如下 spark sql e show databases 第七部分 Spark on Yarn部署 相关配置 tar xf spark 2 3 2 bin hadoop
  • 数学表达式: 从恐惧到单挑 (7. min 与 argmin)

    7 min 与 argmin min 和 argmin 在机器学习中常用 max 和 argmax 同理 7 1 min min 是 minimal 的缩写 用于获得集合中的最小值 如 min 3 1
  • 螺旋矩阵,python实现

    螺旋矩阵问题 给定一个n阶正方形矩阵 生成一个包含 1 到 n2 所有元素 且元素按顺时针顺序螺旋排列的正方形矩阵 力扣原题 这个问题不涉及什么算法问题 考察的就是个人对于代码的掌控和抽象 螺旋矩阵长的是这个样子 处理这个问题就得提到二分法
  • 各操作系统下安装docker

    1 查看服务器软硬件信息 1 1 判断操作系统类型 操作系统 基于发行版 统信UOS Debian 银河麒麟 StartOS Debian openEuler CentOS 优麒麟 Ubuntu Kylin Ubuntu 中标麒麟 Kyli
  • Java算法题:两数之和

    LeetCode原题 给你一个下标从 1 开始的整数数组 numbers 该数组已按 非递减顺序排列 请你从数组中找出满足相加之和等于目标数 target 的两个数 示例 1 输入 numbers 2 7 11 15 target 9 输出
  • STM32F103VG使用RTT实现发送DMX512调光数据

    DMX512调光协议和DALI一样属于数字调光协议 一个完整的DMX512数据包格式 1break 1mab 1startcode 512个调光数据 DMX512发送是基于485串口的基础上实现的特殊的数据协议 使用RTT需要把串口打开并且