调通SPI通信之后,并将所需要的音频文件静态的写入到W25Q80DV的flash中后,接下来要做的主要工作就是将音频文件通过mm32芯片播放出来。
主要工作就是将W25Q80DV中的音频文件读取出来,并且储存到mm32的内存当中,再通过DAC将音频文件通过mm32引脚输出。
首先就是将所对应的引脚进行初始化,设置成模拟输入的形式。这里遇到了第一个问题,由于选用的mm32芯片的型号引脚数量有限,所以导致SPI的引脚与DAC引脚功能冲突。
这个并不难解决,所有的I/O口都可以模拟各种引脚的功能,写好对应的代码即可。我从最简单的引脚入手,即改变片选信号的功能,直接用GPIO引脚置高,来代替片选信号的高。低则同样设置。那么PA4引脚就实现了DAC的功能。
下一步就是对音频程序的移植,音频程序是运行在STM32芯片上的,不能直接下载到mm32芯片上。所以,需要对所需要的功能进行移植。将代码拷贝过来之后,有大量错误。找到所对应的错误,发现其函数需要所依赖其他文件,将其他文件以同样的结构移植进来,并且在文件中包含头文件。但是此处再次遇到了问题。发现包含文件时,找不到此文件的目录。从网上得知,在keil中需要在配置中添加所对应的路径。
这样,慢慢的进行修改,直至没有错误。但是在编译没有错误之后,又产生了大量的连接错误:No space in execution regions with .ANY selector... ,提示空间不足,那么可以修改所对应的的空间大小,也可以改变其编译等级。
这样基本就解决了编译以及连接的错误,接下来就是将从FLASH中读取数据的数组移到主函数当中来。将其以外部变量的形式读取到函数当中,再就是将其在内存中的地址传给移植过来的函数即可。接下来的问题是所定义的数组为无符号char型,而传过去的地址是无符号int型,直接取地址赋值给子函数不行,因为子函数接收时就不是以指针类型进行接收的。所以这个时候会产生类型不匹配的问题。
我的第一个想法就是,将其进行强制类型转换,然后将其传下去,但是此时传下去的是数据,并不是所需要的地址。第二个想法就是将其数组中的值重新赋值给另一个无符号int型的数组,发现赋值出来的数据全是0。第三个想法就是(uint32_t)&rxtmpdata,将数组取地址之后再强制类型转换。发现可以将数组地址传到子函数当中。至此,整个程序移植基本就结束了,接下来就要验证一下是否有声音了,因为考虑到兼容性的问题,其他很多方面还是可能存在问题的。
从此次进行开发来看,主要问题都是一个很小的问题就会导致整个项目无法向下进行。反而是看起来很复杂的的问题一步步照着错误提示去改,很快就可以修改完成。就像那些没有错误,感觉逻辑也说得通,但就是实现不了其功能的问题。需要耗费很大的精力去查阅文献,并且去慢慢的通过逻辑分析排除问题,这样耗费的时间较长。