[求助] 基于stm32 dmx512控制系统设计问题

yuxuanwlfei   2015-1-30 09:10 楼主
最近做一个用STM32读SD卡中的BIN文件,每次读取512个数据然后通过串口发送DMX512数据,但DMX512数据时间只有23ms,若连续发送约为44帧数据,不会出现闪烁,但其中要边读SD卡数据边发送,就有个时间延时,DMX512 LED接收灯具闪烁,求助如何解决次问题!!如下为相关部分代码:
/******************************************
*函数功能: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++;
            }  
        }
//    }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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);  
}
///////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
        NVIC_Configuration();
    RCC_Configuration();   
    GPIOA_Configuration();   
    DMX_init();   
        while(1)          
        {
                DMX512_Play_bin("/美女2.bin");
        }
}

回复评论 (3)

建立双缓冲,发一个缓冲,读另外一个缓冲。。。。。。。。。。
我的博客
点赞  2015-1-30 09:30
我也想到用这个方法。可是这个要同事做两件事情,第一不停的读SD卡数据,有30M那么大所以不能缓存;第二要发送数据,而且每次发送512个数据,就想不到如何读SD卡的数据与两BUF之间数据衔接?
点赞  2015-1-30 09:37
这是这个系统的程序。
点赞  2015-1-30 09:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复