打印

STM32 操作 DMX512 探讨 の 1

[复制链接]
3081|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjiahao88|  楼主 | 2017-12-7 09:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做一个用STM32读SD卡中的BIN文件,每次读取512个数据然后通过串口发送DMX512数据,但DMX512数据时间只有23ms,若连续发送约为44帧数据,不会出现闪烁,但其中要边读SD卡数据边发送,就有个时间延时,DMX512 LED接收灯具闪烁,求助如何解决次问题!!如下为相关部分代码:

相关帖子

沙发
wangjiahao88|  楼主 | 2017-12-7 09:10 | 只看该作者
/******************************************
*函数功能:DMX_SendPacket
*输入数据:无
*  返回值:无
*调用函数:DMX_SendPacket();
*作    者:
*日    期:2015.1.15
******************************************/
void DMX_SendPacket(u8 *DMX_buf)
{
//    u8 i;
//    for(i=0;i<10;i++)
//    {
        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++;
            }  
        }
//    }
}

使用特权

评论回复
板凳
wangjiahao88|  楼主 | 2017-12-7 09:10 | 只看该作者
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DMX512_Play_bin(unsigned char *pic_name)
{
    int  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<4000;j++)                                                                                   //300表示一幅图片含有300x512字节的信息
    {
                f_lseek (&bmpfsrc,(512*j));
                f_read(&bmpfsrc,pdata,512,&read_num);        
        DMX_SendPacket(pdata);            
    }
    f_close(&bmpfsrc);  
}

使用特权

评论回复
地板
wangjiahao88|  楼主 | 2017-12-7 09:13 | 只看该作者
请问 54 颗灯 是 怎么个数据呢?

使用特权

评论回复
5
stm32lover| | 2017-12-7 09:16 | 只看该作者
这是DMX512发送的数据帧格式

1.gif (10.05 KB )

1.gif

使用特权

评论回复
6
stm32lover| | 2017-12-7 09:16 | 只看该作者
我是做灯光控制的,但是涉及到DMX512协议我就一窍不通,所以赶紧在网上找相关的资料来恶补一下,就在网上了解DMX512协议是只发或只接收,是单向的,但是要处理好起始标志否则你接收不到正确数据!
数据位是9位,1位停止位,无奇偶校验,无硬件流,波特率固定是250000;
以下是模拟DMX512发出的数据帧,接收程序在网上一搜就有

使用特权

评论回复
7
stm32lover| | 2017-12-7 09:17 | 只看该作者
有需要DMX512接收程序的跟我说下,我就会把它贴出来分享给大家!
走过路过千万不要错过,希望大家看到的能帮忙为这个贴留个言,把帖顶起来让更多像我一样初学者能少走一些弯路把项目做好!

使用特权

评论回复
8
stm32lover| | 2017-12-7 09:17 | 只看该作者
u8 TXDData[530]; //接收缓冲区200个数据

使用特权

评论回复
9
stm32lover| | 2017-12-7 09:18 | 只看该作者
/************************************************************
*函数名称: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
}

使用特权

评论回复
10
stm32lover| | 2017-12-7 09:18 | 只看该作者
/*******************************************************************************
* 函数名称: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
}

使用特权

评论回复
11
stm32lover| | 2017-12-7 09:20 | 只看该作者
/*******************************************************************************
* 函数名称: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); //引脚初始化
}

使用特权

评论回复
12
stm32lover| | 2017-12-7 09:24 | 只看该作者
/*******************************************************************************
* 函数名称: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++;
    }  
  }
}

使用特权

评论回复
13
stm32lover| | 2017-12-7 09:25 | 只看该作者
这一份 发送 与您的大同小异哦!

使用特权

评论回复
14
stm32lover| | 2017-12-7 09:26 | 只看该作者
例程如下:
~~~

DMX512发送接收程序.zip

330.84 KB

使用特权

评论回复
15
arm86| | 2017-12-7 09:36 | 只看该作者
串口使用 DMA 方式来传输数据。
读 SD 卡使用乒乓方式。
读 SD 卡的速度远大于 UART 的发送速度。准备好第 1 帧数据后,启动 UART 的 DMA 发送。然后读 SD 卡,准备第 2 帧的数据,在准备好之后, UART 还没有发送完,所以要检测 DMA 的一些相关标识。
当然,如果 RAM 足够大,也可以一次读入 SD 的文件数据,然后分别加上帧头格式,按顺序发送。

使用特权

评论回复
16
stm32lover| | 2017-12-7 09:56 | 只看该作者
请问一下 如果操作一个灯的话 这个512 需要设置成 其他的数据吗?

使用特权

评论回复
17
wangjiahao88|  楼主 | 2017-12-7 10:04 | 只看该作者
请问 有没有成熟的 DMX512 的控制案例啊?

使用特权

评论回复
18
wangjiahao88|  楼主 | 2017-12-7 10:23 | 只看该作者
本程序用于实现LDMX512为接收,DMX512信号自动识别
如下:
#include<stc11f0x.h>
#define uchar unsigned char
#define uint  unsigned int

使用特权

评论回复
19
wangjiahao88|  楼主 | 2017-12-7 10:24 | 只看该作者
//宏定义与变量

#define ON  1
#define OFF 0

sbit         R = P1^7 ;
sbit         G = P1^6 ;
sbit         Y = P1^5 ;

sbit   COM   =  P3^7 ;

sbit   EN_485   = P3^4;                           //MAX485使能口
sbit   Work_LED = P3^3;                           //LED指示灯
sbit   TXD      = P3^1;                           //串口输出口

使用特权

评论回复
20
wangjiahao88|  楼主 | 2017-12-7 10:24 | 只看该作者
//宏定义与变量

uint   Address;                     //  Set_R, Set_G, Set_B  ;  //3路 接收和设置地址
bit    start_ok, Head_ok;
bit    DMX512_ok;                 //DMX512信号标志
uchar  cnt;                                                      //

uchar  R_dat,  G_dat,  B_dat ;     //RGB三路数据
uint   DMX_channel;                //DMX三路的起始地址
uchar  PWM;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

474

主题

7520

帖子

30

粉丝