写在最前面:

DMX512(digital multiplex)

其实就是主机向从机整包单向广播发送的协议(protocol),从机自取所需。


一、链接拓扑(network topology)

根据后面的协议可以知道,其实就是将所有的slave挂到线上去。(线最长可以多长?)

 
image.png

二、协议(protocol)的时序如下图

1) 先说明地址,包的格式是固定的,第一个数据帧就是地址1(说是0也可以),接下来的数据帧,地址逐渐+1。

2) 1 slot 或者叫 1 data frame(数据帧)=1 start bit(低电平) + 8 data bits + 2 stop bits(高电平) = 11bits, 1bit=4us,1slot=44us。(下图右下角的蓝色字体部分)

3) 1 packet (数据包)= 1 break + 1 MAB(mark after break) + 1 SC(start code) + 512 slots + 1 MTBP(mark time between packets) (下图红色字体部分)

  • 1 break 典型值88us
  • MAB 典型值 8us
  • SC就是一帧 44us,第0帧
  • MTBP,高电平有效,0-1s之间

time = 88us+8us+44us+512*44us+0=22668us=22.668ms 发包频率44.11Hz,也就是控制频率了,如果地址用不完,把slot减少,时间也可以节省,然后频率可以更高了。

 
image.png

放大右下角的每帧时序

 
image.png

三、硬件实现方式

 
image.png

四、电路:

 
image.png

五、软件实现

下面的两个图,第一个是DMX512的时序,第二个是UART的时序,可以看出,可以利用UART进行模仿。

1、数据格式,大家都是1个bit的低电平作为开始,八个数据位,两个停止位,大家都是11位

2、一个bit的时间,标准的DMX512是4us,那么对应波特率就是1s/(4us)=250000bit/s

然后问题来了,那个大break怎么检测呢?

把通讯格式换成1个开始bit+9个数据bit+1个停止bit,也是11个bit,

1、正常的slot,第9个数据bit对应了停止位,所以是1,

2、break的时间间隔足够长,第9个数据bit对应的还是0,差别出来了,就靠这个第9数据bit来区别。

 
image.png
 
image.png

STM32F103 code:

/**************************************************

函数说明:初始化DMX512的USART4,用USART来模仿DMX512,设定接收中断

**************************************************/

void DMX512_UART4_Config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = 250000; //跟DMX512的速度匹配上,一个bit用4us

//模仿slot:

//UART :1低电平启动位+9个数据位+1个高电平停止位

//DMX512:1低电平开始位+8个数据位+2个高电平停止位

//为什么要设置UART的第9个数据位,而不是8个数据位+2个停止位,

//主要是用来判断break的

//UART协议中,有一个固定的低电平启动位

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;

USART_Init(UART4, &USART_InitStructure);

USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//使能接收中断

USART_Cmd(UART4, ENABLE);

// 中断组0

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

// 中断来源

NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;

// 抢占式优先级 0

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

// 响应优先级 1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

六、多地址数据获取

在实际应用中,一个slot的信息量太小了,一个slave设备可能用到多个slot,比如8个,那么所有设备都要约定好,slave1从使用slot0-7的数据,那么为了避免重叠,slave可以使用slot8-15的数据。

参考资料

what is DMX512

https://en.wikipedia.org/wiki/DMX512

https://www.learnstagelighting.com/what-is-dmx-512/

https://wenku.baidu.com/view/d8945f9b80eb6294dd886ccb.html (这份解释不错。)

作者:StarsOcean
链接:https://www.jianshu.com/p/5c1083283507
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

用STM32的UART实现DMX512的更多相关文章

  1. STM32 硬件UART接收超时检测设置

    STM32 硬件UART接收超时检测设置 -----------------本文作者"智御电子",期待与电子爱好者交流学习.---------------- 应用场景 在uart应 ...

  2. 基于STM32之UART串口通信协议(一)详解

    一.前言 1.简介 写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F429开发 ...

  3. 基于STM32之UART串口通信协议(四)Printf发送

    一.前言 1.简介 前面在UART发送中已经讲解过如何调用HAL库的HAL_UART_Transmit函数来实现串口发送,而在调用这个函数来实现串口发送的话,但是在发送数据或者字符的时候,需要将数据或 ...

  4. 基于STM32之UART串口通信协议(二)发送

    一.前言 1.简介 在上一篇UART详解中,已经有了关于UART的详细介绍了,也有关于如何使用STM32CubeMX来配置UART的操作了,而在该篇博客,主要会讲解一下如何实现UART串口的发送功能. ...

  5. 基于STM32之UART串口通信协议(三)接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  6. STM32 DMA(UART)

    转载自https://blog.csdn.net/as480133937/article/details/104827639/

  7. STM32 UART DMA实现未知数据长度接收

    串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接 ...

  8. LPC同STM32的比较

    Cortex-M3是新兴起来的一种ARM7的核,而ARM7TDMI是一种传统的经典的ARM内核.我们就抛开这一切,来比较一下两则的异同. 我们就在以下平台上比较吧: STMicoelectronics ...

  9. STM32 USART 波特率计算

    The baud rate for the receiver and transmitter (Rx and Tx) are both set to the same value as program ...

随机推荐

  1. 虚拟化KVM之优化(三)

    KVM的优化 1.1 cpu的优化 inter的cpu的运行级别,(Ring2和Ring1暂时没什么用)Ring3为用户态,Ring0为内核态 Ring3的用户态是没有权限管理硬件的,需要切换到内核态 ...

  2. Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)

    JAVA并发包中有三个类用于同步一批线程的行为,分别是闭锁(Latch),信号灯(Semaphore)和栅栏(CyclicBarrier).本贴主要说明闭锁(Latch)和栅栏(CyclicBarri ...

  3. 【DNS域名解析命令】 ping

    ping, ping6 - send ICMP ECHO_REQUEST to network hosts ping命令向网络主机发送ICMP回传请求 详细描述: ping使用ICMP协议强制ECHO ...

  4. python(re 模块)

    1.re.match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. group() 以str形式返回对象中match的元素 start() 返回 ...

  5. python ——文件的操作大全,如with..as

    工作中遇到了需要对json文件进行增删内容操作的需要,于是系统性的整理了一下关于文件的基本操作这里的知识点: 结构:新建文件→打开文件→读取文件→关闭文件 一.基本文件操作 1.新建文件(打开文件), ...

  6. Ajax各参数介绍及使用

    Ajax各参数介绍及使用 1. url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2. type: 要求为String类型的参数,请求方式(post或get)默认为get. ...

  7. Shell脚本(一)入门

    开始学习Shell脚本. #!/bin/bash ]; then echo "you are not root" else echo "you are root" ...

  8. 区间dp 例题

    D - 石子合并问题--直线版 HRBUST - 1818 这个题目是一个区间dp的入门,写完这个题目对于区间dp有那么一点点的感觉,不过还是不太会. 注意这个区间dp的定义 dp[i][j] 表示的 ...

  9. Java模拟UDP通信

    目录 Java基础:模拟UDP通信 1.一次发送,一次接收 1.1.发送方 1.2.接收方 2.多次发送,多次接收 2.1.发送方 2.2.接收方 3.模拟双方通信 3.1.发送方的线程 3.2.接收 ...

  10. Bootstrap初识

    目录 概述 快速入门 响应式布局 CSS样式和JS插件 全局CSS样式 组件 插件 案例:黑马旅游网 概述 概念:一个前端开发的框架,Bootstrap是美国Twitter公司的设计师Mark Ott ...