描述

STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核,其中STM32F系列有:STM32F103“增强型”系列STM32F101“基本型”系列STM32F105、STM32F107“互联型”系列,增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,相当于0.5mA/MHz。

基于stm32实现DMX512协议发送与接收

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

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

该协议发送的数据帧一共11位,1位开始位,8位数据,2个停止位,无校验位。

根据波特率可以知道,位时间是4us,11位数据供需要44us的时间。当然对于标准的512协议是需要break和mark after break 帧的,break是一个92us的低电平,而mark after break是一个12us的高电平,如下图所示

根据上面的图片(缺失了起始码,下图补上),512协议必须有break和mark,但是在我们通常的非标准收发中,检测break和mark相对比较困难,如果非要做,耗费的资源也比较多,比如定时器计时,中断等等。如果不是做标准控制器的,完全可以另辟蹊径。

根据512 协议,每一串数据的开始都要有一个起始码,也称复位码,其数据为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; //更新调光数据

}

}

}

}

}

打开APP精彩内容

点击阅读全文

linux系统串口dmx512,基于stm32实现DMX512协议发送与接收详解相关推荐

  1. Linux系统与网络、磁盘参数和日志监控等命令详解二

    创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...

  2. Linux系统强制位u+s、g+s、o+t 详解

    Linux系统强制位u+s.g+s.o+t 详解 u+s:一个命令,给与用户s权限,则此用户暂时获得这个命令的属主权限 (例chmod u+s /usr/bin/touch或者chmod 4755 / ...

  3. stm32 IOT_基于STM32平台的cubeMX和HAL库详解

    课程简介: <朱有鹏老师单片机完全学习系列课程>总共5季,其中第1.2季是51单片机学习,第3.4.5季是STM32单片机与RTOS学习.整个课程时长约250小时,是一套零基础.全面系统. ...

  4. linux系统rootkit恶意软件安全检测工具rkhunter安装部署、使用详解

    rkhunter简介: 中文名叫"Rootkit猎手", rkhunter是Linux系统平台下的一款开源***检测工具,具有非常全面的扫描范围,除了能够检测各种已知的rootki ...

  5. linux crontab 定时关机,Linux系统使用--定时关机的实现以及crontab命令和文件详解...

    一.前言 为了以后不用再半夜跑回实验室关电脑,昨天中午花了两个小时左右的时间搞了一下如何实现Linux系统的定时关机,结果没搞出来.在老师的指点下得以解决,写一博客分享之. 另,发现现在网上的资料越发 ...

  6. linux系统预定义变量有哪些,Shell预定义变量用法详解

    预定义变量是在 Shell 一开始时就定义的变量,这一点和默认环境变量有些类似.不同的是,预定义变量不能重新定义,用户只能根据 Shell 的定义来使用这些变量. 严格来说,位置参数变量也是预定义变量 ...

  7. 树莓派4B的串口使用,并通过串口与其他设备经过通讯协议发送、接收数据。

    从树莓派的相关资料我们可以看到,树莓派有两个串口可以使用,一个是硬件串口(/dev/ttyAMA0),另一个是mini串口(/dev/ttyS0).硬件串口有单独的波特率时钟源,性能好,稳定性强:mi ...

  8. Linux系统下实现基于TCP/IP协议的简单Socket通信

    Linux系统下实现基于TCP/IP协议的简单Socket通信 网络套接字Socket Socket概念 主机字节序和网络字节序 Sockaddr地址结构 Socket实现客户端.服务端通信 服务端程 ...

  9. 基于STM32与GSM模块发送中英文短信

    基于STM32与GSM模块发送中英文短信 最近在做毕业设计有用到GSM模块进行短信报警,模块的功能比较多这里就不介绍了,一般的拨打电话都很简单就只需要一条指令即可,发送英文短信也很简单也只要几条命令也 ...

  10. 基于Java的音频转发服务器_javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)...

    javaCV系列文章: 补充篇: 前言:本篇文章基于javaCV-FFMPEG,关于javaCV官方是没有文档或者api文档可以参考的,所以还有很多地方需要研究: 本章对于ffmpeg的需要有一定了解 ...

最新文章

  1. 自动清理归档日志_LGWR 日志写入进程
  2. java总结第四次//常用类
  3. .net core 填坑记之—格式转换问题
  4. java 反射 接口工具类_Java 反射工具类 ReflectionUtils
  5. 华为服务器麒麟系统,麒麟云服务器
  6. 微信公众平台2013.08.05更新说明
  7. 微软MSDN,window10原版系统下载,操作系统msdn下载,microsoft office原版下载,www.msdn.itellyou.cn
  8. 从 ftp 上下载文件、文件夹
  9. MS08067 Web安全进阶实战班-第一期 强势来袭~
  10. Unicode字符集与多字节字符集
  11. 遗传算法应用--基于遗传算法的神经网络结构改进
  12. 龙华大浪注塑加工中模具原理及组成
  13. 陈宁计算机辅助设计说课稿,《归去来兮辞》(并序)说课稿
  14. Java中浏览量怎么实现_Java刷视频浏览量点赞量的实现代码
  15. 以下是根据在下的一些朋友芳名作诗,请朋友指点,继续增加中
  16. spring用到的设计模式
  17. c++快捷店会员管理系统
  18. 多线程与高并发day04
  19. 最新快速提升网站关键词排名方法,附案例
  20. 考研:研究生考试(十五天学完)之《高等数学上/下册》研究生学霸重点知识点总结之考试内容各科占比及常考知识重点梳理(函数极限连续、一元/多元函数微分学/积分学、常微分函数、向量代数与空间几何、无穷级数)

热门文章

  1. 谷歌插件无法显示在地址栏右侧
  2. 银行转账和分布式事务(转)
  3. 线程安全单例模式(C++)
  4. SVN 分支主干的合并
  5. Appscan的下载安装
  6. python 3.6 安装 win32 win32com模块
  7. 大漠为什么不支持win10_Win10系统注册使用大漠插件的方法与设置!常见错误0x8002801...
  8. 【优化调度】基于人工鱼群算法求解梯级水库优化调度matlab源码
  9. 14_星仔带你学Java之Java编码规范、常用类
  10. ABAQUS 有限元仿真分析软件模块介绍