基于STM32的DMX512开发笔记

2023-11-04

首先基本了解一下DMX512的基本协议

一、       DMX512协议

       DMX 是Digital MultipleX 的缩写,意为多路数字传输。DMX512控制协议是美国舞台灯光协会(usITT)于1990年发布的灯光控制器与灯具设备进行数据传输的工业标准,全称是USITTDMX512(1990),包括电气特性、数据协议、数据格式等方面的内容。

      每一个DMX 控制字节叫做一个指令帧,称作一个控制通道,可以控制灯光设备的一个或几个功能。一个DMX 指令帧由1个开始位、8个数据位和2个结束位共11位构成,采用单向异步串行传输,如图1所示。

图1 DMX512 定时程序的帧结构(上图)和信息包结构(下图)

 

       图1 中虚线内控制指令中的S 为开始位,宽度为一个比特,是受控灯具准备接收并解码控制数据的开始标志;E为结束位,宽度为两个比特,表示一个指令帧的结束;D0~ D7为8 位控制数据,其电平组合从0000~一l1111111 共有256个状态(对应十进制数的0~255),控制灯光的亮度时,可产生256个亮度等级,0000~ (0)对应灯光最暗,l1111111(255)对应灯光最亮。DMX512指令的位宽(每比特宽度)是4 us,每帧宽度为44 us,传输速率为250 kbps。

       一个完整的DMX512信息包(Packet)由一个MTBP位、一个Break 位、一个MAB位、一个SC 和512个数据帧构成。MTBP(Mark TimeBetween Packets)标志着一个完整的信息包发送完毕,是下一个信息包即将开始的“空闲位”,高电平有效。Break为中断位,对应一个信息包结束后的程序复位阶段,宽度不少于两个帧(22 比特)。程序复位结束后应发送控制数据,但由于每一个数据帧的第一位(即开始位)为低电平,所以必须用一个高电平脉冲间隔前后两个低电平脉冲,这个起间隔、分离作用的高电平脉冲即MAB(Mark After Break),此脉冲一到,意味着“新一轮”的控制又开始了。SC(Start Code)意为开始代码帧(图1中的第0帧),和此后到来的数据帧一样,也是由11 位构成,除两个高电平的结束位之外,其他9位全部是低电平,通常将其叫做第0 帧或第0通道(Ch~nel No 0),可理解为一个不存在的通道(Non一~istent Channe1)。

 

表1 DMX512 信息包定时表

 

       表1 是DMX512 信息包的定时表,表中NS意为Nm Spec~ed,宽度没有严格限制,由程序设计者自行决定,比如MTBP的宽度可以介于0~1秒之间。

       调光控制台每发送一个信息包,可以对全部512个受控通道形成一次全面的控制。发送一个信息包的时间大约是23 ms,每秒钟将对所有512个受控通道完成44 次控制,即受控光路的刷新频率44 Hz,如果实际受控通道少于512个,那么刷新频率将相应提高。

 

  •  

根据标准的512协议,其物理连接与传统上的RS485是完全一致的,并没有什么差别,差别只是在协议上的不同,工业上应用的主要是modbus协议,而这里是用512通信协议。

 

 DMX512数据协议是美国舞台灯光协会(USITT)于1990年发布的一种灯光控制器与灯具设备进行数据传输的标准。它包括电气特性,数据协议,数据格式等方面的内容。

512协议规定使用的波特率是250Kbps,而stm32可以支持上Mbps的波特率,所以说这不是什么大问题。

 该协议发送的数据帧一共11位,

1位开始位,

8位数据,

2个停止位,无校验位。

根据波特率可以知道,位时间是4us,11位数据供需要44us的时间。当然对于标准的512协议是需要break和mark after break 

帧的,break是一个92us的低电平,而mark after break是一个12us的高电平,

512协议必须有break和mark,但是在我们通常的非标准收发中,检测break和mark相对比较困难,如果非要做,耗费的资源也比较多,比如定时器计时,中断等等。如果不是做标准控制器的,完全可以另辟蹊径。

每一串数据的开始都要有一个起始码,也称复位码,其数据为0,但是从开始位数至第十位是0,用来声明数据传输开始,随后包含1-512个数据,也称调光数据,其是标准的数据帧,所以第十位是1,所以我们可以根据这个第十位来进行做文章。大家都知道,一般的单片机,像51,avr等都是支持8-9位数据发送的,所以我们就是用9位数据,

1位停止位,无校验位,通过检测检测第十位,也就是所谓的RB8来进行数据的接收与传输,不需要发送break和mark。

1、发送端


串口设为
9位数据,
1停止位,无校验位,波特率250000 

void USART1_Configuration(void) 

{  

  USART_InitTypeDef USART_InitStructure; 

  USART_InitStructure.USART_BaudRate = 250000; 

  USART_InitStructure.USART_WordLength = USART_WordLength_9b; 

  USART_InitStructure.USART_StopBits = USART_StopBits_1; 

  USART_InitStructure.USART_Parity = USART_Parity_No; 

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 

  /* Configure USART1 */ 

  USART_Init(USART1, &USART_InitStructure);   

  /* Enable USART1 Receive and Transmit interrupts */ 

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 

  //USART_ITConfig(USART1, USART_IT_TC, ENABLE); 

  /* Enable the USART1 */ 

  USART_Cmd(USART1, ENABLE); 

} 

注意在初始化串口的时候别忘了485芯片设为发送状态接下来主要就是数据包的发送,发送的时候注意起始码的数据第九位设为0,调光数据第九位设为1. 

void DMX_SendPacket(void) 

{ 

  pDMX_buf = 0; 

  while (pDMX_buf <= 512) //1-512 

  { 
/* send data packet to slaves*/ 
if(USART1->SR & (1<<6)) 
{  
/*发送起始码 00*/ 
if (0 == pDMX_buf)  
{ 
USART1->DR = ((USART1->DR) & 0xfe00);  
 //第九位置0 
} 
else 
{ 
USART1->DR = 0x0100 | DMX_buf[pDMX_buf];  
 //第九位置1 
} 

pDMX_buf++; 
}
  } 
} 

在main函数中进行循环数据的发送了,每200ms发送一次,由于发送快,偶尔的错误也不是很明显。

 

2,、接收端


接收端得工作就是接收的信息进行解码,关键是对RB8的处理,接收用到了中断接收,所以需要使能接收中断。

 

void USART1_Configuration(void) 

{  

  USART_InitTypeDef USART_InitStructure; 

  USART_InitStructure.USART_BaudRate = 250000; 

  USART_InitStructure.USART_WordLength = USART_WordLength_9b; 

  USART_InitStructure.USART_StopBits = USART_StopBits_1; 

  USART_InitStructure.USART_Parity = USART_Parity_No; 

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 

  /* Configure USART1 */ 

  USART_Init(USART1, &USART_InitStructure);   

  /* Enable USART1 Receive and Transmit interrupts */ 

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//

使能接收中断

 

  //USART_ITConfig(USART1, USART_IT_TC, ENABLE); 

  /* Enable the USART1 */ 

  USART_Cmd(USART1, ENABLE); 

} 

void NVIC_Configuration(void) 

{ 

  NVIC_InitTypeDef NVIC_InitStructure; 

#ifdef  VECT_TAB_RAM 

  /* Set the Vector Table base location at 0x20000000 */ 

  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 

#else  /* VECT_TAB_FLASH  */ 

  /* Set the Vector Table base location at 0x08000000 */ 

  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); 

#endif 

  

  

//
设置优先级分组:先占优先级和从优先级 ,先占优先级0位,从优先级4位
 

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 

  /* Enable the USART1 Interrupt */ 

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

  NVIC_Init(&NVIC_InitStructure); 

} 

void USART1_IRQHandler(void) 

{ 

  uint16_t UDR; 
  static uint16_t RXB8; 
  static uint16_t pDMX_buf = 0; //数据指针

 

  static uint8_t fDMX_buf_right = 0;  //接收数据

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//USART_FLAG_RXNE 

  { 


//USART_ClearITPendingBit(USART1,USART_FLAG_RXNE); 

UDR = USART_ReceiveData(USART1); 

RXB8 = (UDR & 0x0100); 

if (RXB8 == 0) //复位信号

{  

 if (!UDR) 
 { 
 fDMX_buf_right = 1;//接收数据正确
 

 pDMX_buf = 1; //直接接收第一个数据不保存第0个数据。

 } 

} 

else //rb8 =1  pDMX_buf=1 调光数据

{ 
 if (1 == fDMX_buf_right) 
 { 

   DMX_buf[pDMX_buf++] = (u8)UDR;  //接收到512个数据
   if (pDMX_buf > 512) 

   { 

fDMX_buf_right = 0; 

tim_update = SET; //

更新调光数据
}}
}

  

   

   } 

  

   

 } 

 

 

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

基于STM32的DMX512开发笔记 的相关文章

  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt

随机推荐

  • RTSP流媒体服务搭建

    主要用于测试目的 系统是windows 使用的是docker desktop 3 5 1 1 rtsp simple server 参考 https github com aler9 rtsp simple server docker 运行
  • React中 Real DOM 和 Virtual DOM 的区别?优缺点?

    一 是什么 Real DOM 真实 DOM 意思为文档对象模型 是一个结构化文本的抽象 在页面渲染出的每一个结点都是一个真实 DOM 结构 如下 Virtual Dom 本质上是以 JavaScript 对象形式存在的对 DOM 的描述 创
  • Qt 音乐播放器:实现点击窗体外的地方该窗口自动关闭

    最近在模仿网易云播放器的时候遇到这个问题 点击 播放列表 弹出音乐列表窗体 点击该窗体的其他的地方 该窗口自动关闭 如下所示 ps 录屏的时候 鼠标显示不出来 尴尬 为此 记录实现该种效果的方法 创建该对象的时候 设置坐标和大小都为0 m
  • tcp为什么要三次握手,tcp为什么可靠。

    为什么不能两次握手 防止已失效的连接请求又传送到服务器端 因而产生错误 假设改为两次握手 client端发送的一个连接请求在服务器滞留了 这个连接请求是无效的 client已经是closed的状态了 而服务器认为client想要建立 一个新
  • indexDB & localForage

    一 前言 前端本地化存储算是一个老生常谈的话题了 我们对于 cookies Web Storage sessionStorage localStorage 的使用已经非常熟悉 在面试与实际操作之中也会经常遇到相关的问题 但这些本地化存储的方
  • 没有参数的ajax怎么怎么写,我的ajax没传任何参数请求接口为systemlog/read "?“跟的是什么参数怎么去掉或者说为什么会这样 ?...

    Request URL http localhost 3600 systemlog read callback jQuery1111025511396121069163 1491487798084 Request Method POST S
  • Pycharm(python) 报错: from lxml import etree ModuleNotFoundError: No module named ‘lxml‘

    Pycharm 报错 from lxml import etree ModuleNotFoundError No module named lxml 注 此类错误绝大多数情况下都是环境中少了报错时提示的python包 按照以下方法均可解决
  • Shell--基础--02--变量

    Shell 基础 02 变量 1 定义变量 变量名 值 k v1 定义变量k 值为v1 1 1 注意 变量名和等号之间不能有空格 1 2 命名规则 只能使用英文字母 数字和下划线 首个字符不能以数字开头 中间不能有空格 可以使用下划线 不能
  • linux内网yum源服务器搭建

    1 nginx location root usr local Kylin Server V10 SP3 General Release 2303 X86 64 autoindex on autoindex localtime on aut
  • 下载网页视频并自动合成视频

    本人博客已迁移至 https nasdaqgodzilla github io 1 首先使用Chrome打开网页 单击F12打开开发者工具 开始视频播放 在F12出来的界面中单击Network 在Network中有文件列表 检查当中是否存在
  • 星星之火-48:在LTE中,66.67us的符号发送时间是怎么来的呢?

    66 67us符号的发送时间是怎么来的呢 这就涉及到 发送一个符号所需的时间 即符号周期是怎么来的 1 先从频率的角度看子载波的频率 频分复用 1 LTE基带信号的带宽 1 4MHz 3MHz 5MHz 10MHz 15MHz 20MHz等
  • 企业微信回调接口验签

    文章目录 一 企业微信配置参数 二 验签 三 企业微信客户联系回调 四 相关工具类 企业微信提供了回调接口 允许企业服务商和企业应用接收到企业微信的事件通知和用户操作通知 在接收到回调通知时 需要进行验签操作 以确保通知的安全性和有效性 官
  • html+css+js

    2021年3月16日 一 标签内容 1 声明为HTML5文档 1 用于游览器正确显示网页 2
  • react项目搭建 (eslint+prettier)

    1 安装nodejs 安装git 安装vscode 安装yarn 2 npm install create react app yarn g 在yarn中安装react脚手架 3 在系统资源中配置path 在指定目录下create reac
  • JAVA面试(三)

    1 什么是本地调用 java编译器将包含本地方法的class对应的方法添加ACC NATIVE标识 而JVM负责将动态库加载到内存 Java执行引擎执行到本地方法时找到对应的函数 完成本地方法的调用 2 多线程 3 线程同步怎么实现 1 s
  • MFCC特征值详解

    看了网上的很多MFCC 依然没能够学号MFCC 因此糊了一段时间详细的看了下MFCC的内容 现在也算是对于MFCC有了更深入的理解了 不管是语音识别还是其他的一系列的识别大体都分为三个步骤 1 输入信号的预处理2 特征值提取3 相关算法的识
  • 薪资16K,在阿里外包工作是一种什么体验...

    我17年毕业于一个普通二本学校 电子信息工程学院 是一个很不出名的小本科 大学期间专业知识也没有去认真的学习 所以毕业的时候就随便找了一份工作 在一个小公司做功能测试 记得那时候税前薪资大概是7k左右 因为是在工厂 工作环境很差 也很危险
  • Fabric CA 1.4 官方文档中文版

    链接 Fabric CA中文文档 目录 概述 Fabric CA概述 快速上手 安装前提条件 安装软件 使用Fabric CA命令行 配置软件 Fabric CA 服务器 初始化服务器 启动服务器 配置数据库 配置LDAP 搭建集群 搭建多
  • moviepy快速切分视频并保存片段

    文章目录 1 直接使用ffmepg 2 使用moviepy本身 moviepy安装最新版本 pip install moviepy pre upgrade 版本是v2 0 0 dev2 有两种方法一种快速的 1 直接使用ffmepg fro
  • 基于STM32的DMX512开发笔记

    首先基本了解一下DMX512的基本协议 一 DMX512协议 DMX 是Digital MultipleX 的缩写 意为多路数字传输 DMX512控制协议是美国舞台灯光协会 usITT 于1990年发布的灯光控制器与灯具设备进行数据传输的工