OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 42679|回复: 67

我在此分享一份DMX512协议的发送程序,希望对做灯光控制的人有一定的帮助(我测试过了跟DMX512控制台发出的方波是一样一样的)

[复制链接]

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
发表于 2015-1-6 08:55:10 | 显示全部楼层 |阅读模式

这是DMX512发送的数据帧格式

我是做灯光控制的,但是涉及到DMX512协议我就一窍不通,所以赶紧在网上找相关的资料来恶补一下,就在网上了解DMX512协议是只发或只接收,是单向的,但是要处理好起始标志否则你接收不到正确数据!
数据位是9位,1位停止位,无奇偶校验,无硬件流,波特率固定是250000;
以下是模拟DMX512发出的数据帧,接收程序在网上一搜就有~
有需要DMX512接收程序的跟我说下,我就会把它贴出来分享给大家!
走过路过千万不要错过,希望大家看到的能帮忙为这个贴留个言,把帖顶起来让更多像我一样初学者能少走一些弯路把项目做好!
(非常喜欢原子的开源精神,希望大家能把原子的论坛炒热起来,这样路过的大神就能在这多分享一些好东西,我们这些初学者也就能多多学习一些知识!谢谢大家!)

u8 TXDData[530]; //接收缓冲区200个数据

/************************************************************
*函数名称:void uart2_init(u32 bound)
*功    能:串口2初始化函数
*说    明:初始化IO 串口2
*输入参数:bound=波特率
*输出参数:无
*************************************************************/
void uart2_init(u32 bound) //串口2初始化函数
{
//GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);  //使能USART2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //使能引脚复用,GPIOA时钟
 
  USART_DeInit(USART2);  //复位串口2

//USART2_TX   PA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2

//USART2_RX  A.3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA3

  //USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;         //一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_9b;           //字长为8位数据格式
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(USART2, &USART_InitStructure); //初始化串口2

//USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接收中断  
//USART_ITConfig(USART2, USART_IT_TXE, ENABLE); //开启发送中断
USART_Cmd(USART2, ENABLE);                    //使能串口2
}

/*******************************************************************************
* 函数名称:void DMX_init(void)
* 功能描述:DMX512初始化
* 参数含义:无
* 备    注: 无
*********************************************************************************/
void DMX_init(void) //DMX512初始化
{
int i;
  TXDData[0] = 0; //起始码00
  for(i = 1; i<=512; i++)
  {
     TXDData = 0;
  }
uart2_init(250000);//串口2初始化函数->发送DMX512
}
/*******************************************************************************
* 函数名称:void GPIO_Tx_Normal_Config(void)
* 功能描述:发送引脚变为普通IO
* 参数含义:无
* 备    注: 无
*********************************************************************************/
void GPIO_Tx_Config(u8 Set)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  //设置发送的引脚为普通IO
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
if(0 == Set)
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //普通IO
}
else
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用IO
}
  GPIO_Init(GPIOA, &GPIO_InitStructure); //引脚初始化
}
/*******************************************************************************
* 函数名称:void DMX_SendPacket(void)
* 功能描述:DMX512发送数据 
* 参数含义:无
* 备    注: 无
*********************************************************************************/
void DMX_SendPacket(void) //发送DMX512数据
{
//配置为普通IO
pDMX_buf = 0; /*发送起始码 00*/
GPIO_Tx_Config(0); //设置发送的引脚为普通IO
PA2 = 0; //输出低电平
delay_us(150); //延时150us
PA2 = 1; //输出高电平
delay_us(13); //延时13us
GPIO_Tx_Config(1); //设置发送的引脚为复用IO

  //USART1->DR = 0x0100 | TXDData[0]; //第0帧前导码
  //while((USART2->SR&0X40)==0);//循环发送,直到发送完毕
IWDG_ReloadCounter();    //喂狗
while(pDMX_buf <= 18) //1-512 195
  {
while((USART2->SR&0X40)==0);//等待,直到发送完毕
    if(USART2->SR & (1<<6))
    { 
       
USART2->DR = 0x0100 | TXDData[pDMX_buf];
       pDMX_buf++;
    }  
  }
}


DMX512发送接收程序.zip

330.84 KB, 下载次数: 4690

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2015-1-10 16:25:04 | 显示全部楼层
回复【7楼】yuxuanwlfei:
---------------------------------
既然你诚心诚意的要求了,那么我就大发慈悲的贴出来给大家吧!(嘿嘿,我就是火箭队,不。。。不是火箭队!)
哈哈~开个玩笑,记得给我个赞哟~
回复 支持 1 反对 0

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-1-6
在线时间
2 小时
发表于 2015-1-6 11:33:44 | 显示全部楼层
顶起来! 顶起来! 顶起来!
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2015-1-6 11:41:42 | 显示全部楼层
回复【2楼】杨子2015:
---------------------------------
谢谢!非常感谢你的支持,希望大家都能去留留言,支持一下发帖人
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-1-6 12:39:28 | 显示全部楼层
谢谢分享!!!不错啊
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2015-1-6 13:48:18 | 显示全部楼层
回复【4楼】八度空间:
---------------------------------
感谢支持!!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-1-6 23:08:12 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-1-10
在线时间
0 小时
发表于 2015-1-10 13:34:50 | 显示全部楼层
QQ:844767898 本人也在写STM32 dmx12发送程序,一直不成功,楼主能把源码打包发给我不,十分谢谢啦!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-1-10 23:46:35 | 显示全部楼层
回复【8楼】潜龙探渊:
---------------------------------
谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-1-10
在线时间
0 小时
发表于 2015-1-14 15:23:58 | 显示全部楼层
回复【8楼】潜龙探渊:
---------------------------------
撸主好人呀...跪谢啦...
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-1-10
在线时间
0 小时
发表于 2015-1-23 15:27:12 | 显示全部楼层
回复【8楼】潜龙探渊:
---------------------------------
请问楼主,如何实现读SD卡中的BIN文件然后通过串口发送DMX512数据...?
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2015-1-23 17:50:51 | 显示全部楼层
回复【11楼】yuxuanwlfei:
---------------------------------
先把SD卡中的BIM文件数据读出来存到DMX512的发送数组里就可以发了,因为DMX512是一直在发送的~
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-1-10
在线时间
0 小时
发表于 2015-1-24 11:54:43 | 显示全部楼层

回复【12楼】潜龙探渊:
---------------------------------
由于DMX512播放文件有30M那么大,所以无法缓存那么大的数据,我是采用先读取SD卡BIN中的数据,每次读512一个,然后通过DMX_SendPacket();这样一直循环发送,可这样会有个读取数据的延时,导致LED闪烁,请问如何解决此问题???
void DMX512_Play_bin(unsigned char *pic_name)
{
    int i, j;
    unsigned char tmp_name[20];
// WORD data;
BYTE * pdata = pColorData;
BYTE * tmp_pdata;
    unsigned int read_num;
    sprintf((char*)tmp_name,"0:%s",pic_name);
    f_mount(0, &bmpfs[0]);
    
    bmpres = f_open( &bmpfsrc , (char *)tmp_name, FA_OPEN_EXISTING | FA_READ);
    if(bmpres == FR_OK)
    {
//        printf("Open file success\r\n");
    }    
    else
    {
//        printf("file open fail!\r\n");
        return;
    }    

for(j=0;j<300;j++)    //300表示一幅图片含有300x512字节的信息
    {
tmp_pdata = NULL;
f_lseek (&bmpfsrc,(512*j));
f_read(&bmpfsrc,pdata,512,&read_num);
tmp_pdata = pdata;
       
for(i=1;i<512;i++)                    
{  
      DMX_buf = LD_WORD(tmp_pdata); 

DMX_SendPacket();
    } 
    f_close(&bmpfsrc);  
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
void DMX_SendPacket(void)
{
    u16 pDMX_buf=0;
 //配置为普通IO
 GPIO_Tx_Normal_Config();       //设置发送的引脚为普通IO
 GPIO_ResetBits(GPIOA,GPIO_Pin_2);       //输出低电平          
 delay_us(150);        //延时150us
 GPIO_SetBits(GPIOA,GPIO_Pin_2);   //输出高电平
 delay_us(13);        //延时13us
 GPIO_Tx_Usart_Config();     //设置发送的引脚为串口

    USART2->DR = 0x0100 | 0x00;       //第0帧前导码,发送起始码
    while((USART2->SR&0X40)==0);            //循环发送,直到发送完毕

 while(pDMX_buf < 512) //1-512
    {
  while((USART2->SR&0X40)==0);        //循环发送,直到发送完毕
        if(USART2->SR & (1<<6))
        { 
   USART2->DR = 0x0100 | DMX_buf[pDMX_buf];
            pDMX_buf++;
        } 
    }
}
int main(void)
{
 NVIC_Configuration();
//    ili9320_Initializtion();
    RCC_Configuration();   
    GPIO_ConfigurationA();  
    DMX_init();  
 while(1)   
 {
  DMX512_Play_bin("/DMX512.bin");
//      DMX_SendPacket();
 }
}

DMX512读SD卡数据发送.zip

6.03 MB, 下载次数: 9091

回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2015-1-24 13:55:32 | 显示全部楼层
回复【13楼】yuxuanwlfei:
---------------------------------
弄两个512字节的数组乒乓切换不就行了
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-1-10
在线时间
0 小时
发表于 2015-1-26 13:17:17 | 显示全部楼层
回复【14楼】潜龙探渊:
---------------------------------
但是要不停的读SD卡的DMX512数据,有30M那么大,还要不停的通过串口DMX512发送数据,若采用乒乓数组发送,那SD卡的数据如何与乒乓数组衔接?
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2015-1-28 10:43:27 | 显示全部楼层
回复【15楼】yuxuanwlfei:
---------------------------------
我也不是很懂,要不你请像原子这样的大神来帮你下
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-1-10
在线时间
0 小时
发表于 2015-1-28 13:27:20 | 显示全部楼层
回复【16楼】潜龙探渊:
---------------------------------
那你那有DMX控制器读SD开BIN发送标准DMX512的程序不,我现在做的就是要实现这个功能的。
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2015-1-28 13:31:12 | 显示全部楼层
回复【17楼】yuxuanwlfei:
---------------------------------没有
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-2-15
在线时间
0 小时
发表于 2015-2-15 21:11:46 | 显示全部楼层
回复【18楼】潜龙探渊:
---------------------------------
今年进了某舞台灯光公司,现在也在学习STM32和DMX512,先顶,多谢楼主,有空多交流。
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2015-3-13 10:52:19 | 显示全部楼层
回复【19楼】圆运动:
---------------------------------
好的好的
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-12
在线时间
0 小时
发表于 2015-5-29 20:54:22 | 显示全部楼层
顶!!!刚学STM32,现在在弄DMX512,正一头雾水,有空求多指教啊。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-6-12
在线时间
0 小时
发表于 2015-6-12 15:32:56 | 显示全部楼层
正在做DMX512,下载研究一下先
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2015-6-16
在线时间
1 小时
发表于 2015-6-16 12:37:52 | 显示全部楼层
想请教楼主, 如果接收程序在编写的时候肯定不能使用固定的通道号,因为不知道实际接几个灯,是不是还要另外设计写码器啊。如果不用写码器用什么方法实现,谢谢。
回复 支持 反对

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2012-8-11
在线时间
31 小时
发表于 2015-6-27 11:14:01 | 显示全部楼层
楼主我想问一下DMX512数据帧:数据位是9位,1位停止位,无奇偶校验,无硬件流,波特率固定是250000好像跟我看到的标准不一样??
应该是---DMX512 协议规定数据以数据包的形式通过异步通讯的方式进行传输。每个
数据包由若干数据帧组成, 每帧数据包括1 位低电平起始位、8 位数据位和2 位
高电平停止位。DMX512 协议要求数据传输的波特率为250kbps, 亦即每位的传
输时间为4us, 每帧数据的传输时间为44us, 它支持多达512 帧数据传输, 每帧
数据与相应的控制支路相对应。
以上有点疑问,数据帧到底要哪个为准?
做人要出于情,做事要出于心!
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2015-7-25 11:40:41 | 显示全部楼层
回复【23楼】freewaterzws:
---------------------------------
用硬件实现通道选择咯
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2015-7-25 11:43:13 | 显示全部楼层
回复【24楼】pandy:
---------------------------------
我是实际用示波器测量出来的波形跟图片的波形一样就可以正常跟非标准DMX512控制台通信了
回复 支持 反对

使用道具 举报

11

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2014-9-24
在线时间
15 小时
发表于 2015-8-9 09:21:01 | 显示全部楼层
ding,shu ru fa peng kui le,zhi neng ping ying le...............................
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2015-8-9
在线时间
1 小时
发表于 2015-8-9 21:03:30 | 显示全部楼层
支持。。。。。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-8-1
在线时间
0 小时
发表于 2015-11-24 20:25:07 | 显示全部楼层
顶起!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-3-30 16:30:01 | 显示全部楼层
支持一下楼主
回复 支持 反对

使用道具 举报

15

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2014-7-1
在线时间
28 小时
发表于 2016-8-1 17:37:00 | 显示全部楼层
不知道楼主还上不上来,有几个小问题想讨教一下楼主呢!
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-10-25
在线时间
75 小时
发表于 2016-11-9 09:40:44 | 显示全部楼层
楼主 把接收的发一下呗 急需  跪谢
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2016-11-10 09:52:43 | 显示全部楼层
ruoshui215113 发表于 2016-11-9 09:40
楼主 把接收的发一下呗 急需  跪谢

哦,那我要找一下了,因为太久了程序都不知道放哪里啦
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2016-11-10 09:58:25 | 显示全部楼层
/************************************************************
*函数名称:void uart2_init(u32 bound)
*功    能:串口2初始化函数
*说    明:初始化IO 串口2
*输入参数:bound:波特率
*输出参数:无
*************************************************************/
void uart2_init(u32 bound) //串口2初始化函数
{
//GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);  //使能USART2
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);         //使能引脚复用,GPIOA时钟

        USART_DeInit(USART2);  //复位串口2
       
        //USART2_TX   PA.2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure);                 //初始化PA2

        //USART2_RX          PA.3
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA3

  //Usart2 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;  //抢占优先级2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                         //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                   //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  
  //USART 初始化设置
        USART_InitStructure.USART_BaudRate                                                 = bound;                                                                         //一般设置为9600;
        USART_InitStructure.USART_WordLength                                         = USART_WordLength_9b;           //字长为8位数据格式
        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(USART2, &USART_InitStructure);                 //初始化串口2
       
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接收中断                                                                         //接收个数清零
        USART_Cmd(USART2, ENABLE);                    //使能串口2
}

/************************************************************
*函数名称:void USART2_IRQHandler(void)  
*功    能:串口中断函数
*说    明:串口2中断服务程序
*************************************************************/
void USART2_IRQHandler(void)                        //串口2中断服务程序
{
        static u16 UDR=0;
        static u16 RXB8=0;
        static uint16_t pDMX_buf = 0;  //数据指针
        static uint8_t fDMX_buf_right = 0;

        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//USART_FLAG_RXNE
        {
                IWDG_ReloadCounter();    //喂狗
                UDR  = USART_ReceiveData(USART2);  //16bit  0-8  9bit
                RXB8 = (UDR&0x0100);  //得到第9位数据

                if(RXB8 == 0) //如果是复位信号
                {   
                        if(!UDR) //如果数据为0
                        {
                    fDMX_buf_right = 1; //接收数据正确
                                pDMX_buf = 0;       //直接接收第一个数据,不保存第0个数据
                  }
                }
                else  //rxb8=1 pDMX_buf =1 调光数据
                {
                         if(1 == fDMX_buf_right)
                         {
                     RXDData[pDMX_buf++] = (u8)UDR; //得到8位的数据
                                 //接收到0-192个数据
                                 if(pDMX_buf > 20)
                                 {
                                                fDMX_buf_right = 0;
                                                DMXSignalFlag = 1;                 //更新调光数据
                                 }
                   }
                }
        }
//--------------------------------接收中断---------------------------------------------       
  if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
  {   
      // Disable the USART2 Transmit interrupt
      USART_ITConfig(USART2, USART_IT_TXE, DISABLE);         //清中断 要不然一直执行此中断 OK
  }
}
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-10-25
在线时间
75 小时
发表于 2016-11-10 15:46:34 | 显示全部楼层
潜龙探渊 发表于 2016-11-10 09:52
哦,那我要找一下了,因为太久了程序都不知道放哪里啦

主要通过485接受DMX数据,DMX512中break的88us和MAB的8us如何处理判断
回复 支持 反对

使用道具 举报

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2017-10-31
在线时间
23 小时
发表于 2017-10-31 11:37:07 | 显示全部楼层
为什么发送的时候IO需要变为普通Io
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2017-10-31 13:31:26 | 显示全部楼层
ioremap 发表于 2017-10-31 11:37
为什么发送的时候IO需要变为普通Io

因为要发送头帧的波形
回复 支持 反对

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2012-10-30
在线时间
6 小时
发表于 2017-11-16 10:26:36 | 显示全部楼层
你好,我直接用串口转485线接DMX512上,用串口助手设置波特率256000,然后发送命令下去就能控制,但每次控制后,它自己又会变色,是怎么回事呢?是波特率跟时序的问题导致数据错位吗
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2017-11-16 17:53:57 | 显示全部楼层
军临忆枫 发表于 2017-11-16 10:26
你好,我直接用串口转485线接DMX512上,用串口助手设置波特率256000,然后发送命令下去就能控制,但每次控 ...

波特率不对
回复 支持 反对

使用道具 举报

9

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2015-8-16
在线时间
23 小时
发表于 2017-12-28 14:11:55 | 显示全部楼层
好人好人
回复 支持 反对

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2012-10-30
在线时间
6 小时
发表于 2018-3-7 16:15:49 | 显示全部楼层

不是,需要一直发送命令
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-9-9
在线时间
28 小时
发表于 2019-1-7 15:35:21 | 显示全部楼层
感谢分享!!!
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2019-11-1
在线时间
3 小时
发表于 2020-1-2 09:46:07 | 显示全部楼层
楼主,我有个疑问,你的程序实现的不是标准的DMX512协议吧?标准的是8个数据位,2个停止位
回复 支持 反对

使用道具 举报

16

主题

189

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1296
金钱
1296
注册时间
2013-8-27
在线时间
503 小时
 楼主| 发表于 2020-1-2 10:13:09 | 显示全部楼层
翚summDy 发表于 2020-1-2 09:46
楼主,我有个疑问,你的程序实现的不是标准的DMX512协议吧?标准的是8个数据位,2个停止位

有点忘记了,之前是在百度上搜索的协议,然后安装那个协议编程的
回复 支持 反对

使用道具 举报

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2019-11-24
在线时间
24 小时
发表于 2020-2-12 16:30:06 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2018-4-28
在线时间
204 小时
发表于 2020-2-12 16:52:39 | 显示全部楼层
谢谢分享!!!不错啊
回复 支持 反对

使用道具 举报

0

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2019-5-8
在线时间
95 小时
发表于 2020-2-13 19:32:08 | 显示全部楼层
来学习的
回复 支持 反对

使用道具 举报

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2019-11-24
在线时间
24 小时
发表于 2020-2-15 01:29:53 | 显示全部楼层
老兄,能发个控制灯跳变,渐变的程序么?谢谢
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2020-2-13
在线时间
18 小时
发表于 2020-2-15 11:49:27 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-8-2
在线时间
4 小时
发表于 2020-8-2 10:16:51 | 显示全部楼层
下载,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-19 02:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表