BADAPPLE_STM32_OLED,视频保存格式为C版本。
期末了,我现在还在搞单片机我也是佩服我自己。真不怕挂科了。
看到网上的大佬都能做到用STM32显示BADAPPLE在OLED上,本宝宝表示也想做一个。奈何资料太少,只能自己动手做一个
先用CUBEMX初始化SPI以及SDIO+FAFTS
将视频的每一帧转成数组,内容参考
https://www.bilibili.com/video/BV174411Z7qc
一共创建了6564个C文件,大小51.2M
现在就是如何读取数组的问题
我的打算是用FATFS将数组的内容提取出来,赋值给TEMP数组,毕竟一个数组就只有128*64,stm32的内容RAM是够用。
现在的问题就是,我对FATFS系统不熟悉,所以不知道读出来的数组是否正确.
OLED显示
直接移植图形库,去结合HAL库,画了我一下午的时间,图形库出处:https://www.bilibili.com/video/BV1MV411o7P5
他的程序还是很好移植的,我花了半天的代价,把他的程序移植到了我的hal库中.注:对考研狗来说,时间就是金钱.
SD卡的读取
经过一天的尝试,我已经能够读取SD卡中的内容,现在需要做的就是将读取的内容转换成CHAR型变量输出到OLED中去,这时候我就需要申请一个temp数组,大小为1024,将所获得的字符串的相应的部分提取出来减去’0’,然后将所得的16进制代码转换成十进制代码赋值.是这样吗?
现在还剩最后一步:将读出来的数据处理成数据后传给图片缓存函数.
FATFS系统一次能读4G的数据,所以我就设计了一个c语言,将所有的文件都集中在一个文件中。然后一次性打开文件。然后读取特定位,就是打开文件后,发现读取文件之后的数组好像不能直接使用,所以就用一个for循环,将数据读出来。我也不太清楚是怎么一回事。
出新问题
现在发现,光是打开文件,并且关闭文件就要好长时间,遍历整个文件需要将近两个消失。这是我不能接受的,只能在电脑上处理文件之后,单片机再去读取。
大坑
由于需要读取内存卡里的数组的时候需要将数组转化成字符串,所以我用DEV在电脑上先行实验。实验结果完善后,加在单片机上,发现没有完美运行。实验发现,单片机的换行符为‘/r/n’,所以在特判的时候需要
if (*temp_pointer == '\r') temp_pointer=temp_pointer+2;;
2、有时候SD卡读取失败可以试一下,重新上电。为此我折腾了半个小时。定时器中断不能占用太长时间不然回导致SD卡读取失败。
字符串16进制转十进制
因为程序运行时不能再以十六进制传数,所以只能转换
uint8_t HEX_TO_DEC(uint8_t *T_HEX)
{
char str[2],temp;
if((*T_HEX>='0')&&(*T_HEX<='9'))
str[0] = *T_HEX - '0';
else if((*T_HEX>='A')&&(*T_HEX<='F'))
str[0] = *T_HEX - 'A' + 10;
T_HEX++;
if((*T_HEX>='0')&&(*T_HEX<='9'))
str[1] = *T_HEX - '0';
else if((*T_HEX>='A')&&(*T_HEX<='F'))
str[1] = *T_HEX - 'A' + 10;
temp = str[0]*16+str[1];
return temp;
}
时间定时
我定时器没有配置好,导致我一直以为是数据传输有问题,搞了半天结果发现是定时器的问题,具体问题就是定时器时间没设定好。结果我没乐意等,就以为是数据处理的问题。哎