STM32 操作 DMX512 探讨 の 1

[复制链接]
777|25
 楼主 | 2017-12-7 09:08 | 显示全部楼层 |阅读模式
最近做一个用STM32读SD卡中的BIN文件,每次读取512个数据然后通过串口发送DMX512数据,但DMX512数据时间只有23ms,若连续发送约为44帧数据,不会出现闪烁,但其中要边读SD卡数据边发送,就有个时间延时,DMX512 LED接收灯具闪烁,求助如何解决次问题!!如下为相关部分代码:
 楼主 | 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++;
            }  
        }
//    }
}
 楼主 | 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);  
}
 楼主 | 2017-12-7 09:11 | 显示全部楼层
///////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
        NVIC_Configuration();
    RCC_Configuration();   
    GPIOA_Configuration();   
    DMX_init();   
        while(1)           
        {
                DMX512_Play_bin("/美女2.bin");
        }
}
 楼主 | 2017-12-7 09:13 | 显示全部楼层
请问 54 颗灯 是 怎么个数据呢?
| 2017-12-7 09:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2017-12-7 09:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2017-12-7 09:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2017-12-7 09:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2017-12-7 09:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2017-12-7 09:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2017-12-7 09:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2017-12-7 09:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2017-12-7 09:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2017-12-7 09:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2017-12-7 09:36 | 显示全部楼层
串口使用 DMA 方式来传输数据。
读 SD 卡使用乒乓方式。
读 SD 卡的速度远大于 UART 的发送速度。准备好第 1 帧数据后,启动 UART 的 DMA 发送。然后读 SD 卡,准备第 2 帧的数据,在准备好之后, UART 还没有发送完,所以要检测 DMA 的一些相关标识。
当然,如果 RAM 足够大,也可以一次读入 SD 的文件数据,然后分别加上帧头格式,按顺序发送。
| 2017-12-7 09:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主 | 2017-12-7 10:04 | 显示全部楼层
请问 有没有成熟的 DMX512 的控制案例啊?
 楼主 | 2017-12-7 10:23 | 显示全部楼层
本程序用于实现LDMX512为接收,DMX512信号自动识别
如下:
#include<stc11f0x.h>
#define uchar unsigned char
#define uint  unsigned int
 楼主 | 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;                           //串口输出口
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /8 下一条

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