首先基本了解一下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; //更新调光数据}}
}

————————————————
原文链接:https://blog.csdn.net/qq_36958104/article/details/97010699

基于STM32的DMX512开发相关推荐

  1. 基于STM32的DMX512开发笔记

    首先基本了解一下DMX512的基本协议 一.       DMX512协议 DMX 是Digital MultipleX 的缩写,意为多路数字传输.DMX512控制协议是美国舞台灯光协会(usITT) ...

  2. 基于STM32小熊派开发智慧路灯项目实践

    目录 一.引言 二.智慧路灯物联网架构介绍 1.感知层: 2.网络层: 3.平台层 4.应用层 三.开发环境 四.开发注意事项 五.学习网站(实践指南) 1.华为云实战训练营教学视频 2.智慧路灯项目 ...

  3. 基于stm32的linux开发的书籍,跟工程师学嵌入式开发:基于STM32和μC OS-Ⅲ 带目录高清版pdf...

    本书选用的STM32芯片基于ARM Cortex-M3体系结构,根据基于MCU的嵌入式技术实际应用需求,合理地选择了多种常用的重要外设接口,如USART.SPI.I2C.FSCM.SDIO总线.以太网 ...

  4. 基于C51的DMX512开发笔记

    一.       DMX512协议 DMX 是Digital MultipleX 的缩写,意为多路数字传输.DMX512控制协议是美国舞台灯光协会(usITT)于1990年发布的灯光控制器与灯具设备进 ...

  5. 基于STM32的FreeRTOS开发(1)----FreeRTOS简介

    为什么使用freertos FreeRTOS 是一个免费和开源的实时操作系统,它主要用于嵌入式系统.它非常轻量级,可以在很小的硬件资源上运行,因此非常适合在限制硬件资源的嵌入式系统中使用. FreeR ...

  6. 基于STM32电源模块开发

    家里没有可控数字电源,做一些开发的时候比较难受,无法获取可调的电压以及电流信息,于是想着自己制作这么一个可控电源模块. 1. 需求分析 使用220-9V的电源适配器进行供电 输出2-5V可调,并且可以 ...

  7. 基于STM32+SIM800C+IoT开发平台设计的森林火灾预警系统(联动控制)

    1. 功能介绍 自从地球上出现森林以来,每年平均发生森林火灾超过20万次.森林火灾不仅烧毁树木,直接减少森林面积,而且严重破坏森林结构和森林环境,导致森林生态系统失衡,森林生物量下降,生产力下降,牲畜 ...

  8. 物联网-移柯L206模块TCP开发(基于STM32+AT命令)

    最近一直在做2g模块联网的项目,用到了移柯L206 2G模块,今天就简单讲一下移柯L206 2G模块基于STM32+AT命令开发TCP联网的过程,参考文档:移柯L206 TCPIP开发流程说明V1.1 ...

  9. 基于STM32的USB CAN收发器开发与设计

    基于STM32的USB CAN收发器开发与设计 一.文章适合人群: 小型化企业,节约设备的购买投入: 有特殊功能需求的个人或企业(例如离线升级,数据抓包盒等): 技术开发爱好者. 二.USB CAN开 ...

  10. 在 keil 建立基于STM32开发的工程模板--详细步骤

    手把手教你在keil建立STM32的工程模板 1 先说几句 1.1 什么是STM32? 1.2 什么是cortex? 1.3 什么是ARM? 1.4 什么是意法半导体? 2 硬件平台 2.1 STM3 ...

最新文章

  1. C#精髓【月儿原创】第一讲 使用垃圾回收器
  2. python字符串、元组常用操作
  3. framework dyld: Symbol not found: _OBJC_CLASS_xxx
  4. mysql linux centos7_MySQL在Linux centos7环境下安装教程详解(图)
  5. editor.md 实现拖拽剪切复制粘贴上传图片,文件插件
  6. 二分法求数组最大最小_JavaScript之如何求数组的最大值和最小值
  7. python基础教程免费下载-《Python机器学习基础教程》高清版免费PDF下载
  8. Linux上安装rz和sz命令
  9. 如何打开大型文本文件
  10. excel 比对多列数据
  11. 在Unity中使用键盘操作UI
  12. vue 解决跨域问题404问题
  13. 最全的ios系统导出微信聊天记录生成词云教程
  14. android root测试,android检测是否已经具有root权限
  15. httpclient.execute长时间停滞问题
  16. gimp 抠图_【GIMP学习】抠图方法二则
  17. 基于Qt开发的AES文件加解密工具
  18. java计算机毕业设计招聘管理系统源码+系统+mysql数据库+lw文档
  19. 遗传算法:交叉操作 Position-based Crossover (PBX)
  20. \xe4\xb8\xad\xe6\x96\x87 phython 字符编码乱码问题

热门文章

  1. linux 系统添加字体,linux服务器下添加字体
  2. 计算机的电子报表模板,Excel记账本
  3. linux efi分区安装grub2,编译UEFI版本Grub2引导多系统文件efi
  4. 软件观念革命-交互设计精髓
  5. Axure rp8.1.0.3381激活码(亲测可用)
  6. 利用爬虫大量抓取网页图片
  7. 《LeetCode刷题C/C++版答案》pdf出炉,白瞟党乐坏了
  8. 基于ssm的航空订票系统
  9. js混淆还原工具_JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
  10. 精简版oracle客户端程序