基于stm32 dmx512控制系统设计问题

2019-03-23 18:43发布

最近做一个用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 ");
    }   
    else
    {
//        printf("file open fail! ");
        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条回答
zhaojun_xf
1楼-- · 2019-03-24 00:49
/ 建立双缓冲,发一个缓冲,读另外一个缓冲。。。。。。。。。。
yuxuanwlfei
2楼-- · 2019-03-24 02:06
 精彩回答 2  元偷偷看……
yuxuanwlfei
3楼-- · 2019-03-24 03:35
这是这个系统的程序。

一周热门 更多>