最近做一个用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");
}
}
建立双缓冲,发一个缓冲,读另外一个缓冲。。。。。。。。。。
我也想到用这个方法。可是这个要同事做两件事情,第一不停的读SD卡数据,有30M那么大所以不能缓存;第二要发送数据,而且每次发送512个数据,就想不到如何读SD卡的数据与两BUF之间数据衔接?