最初調試的時候是因為有個錯誤在wavplay.h文件中
於是我跳到了recorderl.h中:從圖中看到引用了main.h
出現這個問題的具體原因還是不太清楚:
不過我任務是因為:
wavplay.h中定義了 __WaveHeader 變量
在main.h文件中引用了wavplay.h
而在wavplay.h中試圖引用main.h里的 __WaveHeader 然而main.h里沒有定義__WaveHeader;
最好在.h文件中不要 定義變量,,而是在.c中定義,在.h中extern該變量.
我想把全局變量都設置在, main.c中
把所有頭文件都集中在 main.h中
然后這樣就可以在,所有.c和.h文件中引用main.h了...
現在就去試一下,,,看一下結果如何
其實在 #include各個頭文件的時候是有次序的,,,只不過有的時候他們關聯不大,就不需要排序了
比如: 要先include "sys.h" 然后才能定義一些東西,
否則會::我把 include "sys.h" 注釋掉之后::
///////////////////////////////////////////////
編譯的過程是從頭文件開始的,,如果過程中有一個地方出錯,它可能就不在往下編譯了,
所以找到第一個錯誤,,解決它,,,其它的頭文件才能起作用,,,
所以這種方法會帶來很多次序的考慮
不知道這樣程序占用的空間會不會變::應該不會變...
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef _main_H
#define _main_H
#include "sys.h"
//RIFF塊
typedef __packed struct
{
u32 ChunkID; //chunk id;這里固定為"RIFF",即0X46464952
u32 ChunkSize ; //集合大小;文件總大小-8
u32 Format; //格式;WAVE,即0X45564157
}ChunkRIFF ;
//fmt塊
typedef __packed struct
{
u32 ChunkID; //chunk id;這里固定為"fmt ",即0X20746D66
u32 ChunkSize ; //子集合大小(不包括ID和Size);這里為:20.
u16 AudioFormat; //音頻格式;0X01,表示線性PCM;0X11表示IMA ADPCM
u16 NumOfChannels; //通道數量;1,表示單聲道;2,表示雙聲道;
u32 SampleRate; //采樣率;0X1F40,表示8Khz
u32 ByteRate; //字節速率;
u16 BlockAlign; //塊對齊(字節);
u16 BitsPerSample; //單個采樣數據大小;4位ADPCM,設置為4
// u16 ByteExtraData; //附加的數據字節;2個; 線性PCM,沒有這個參數
}ChunkFMT;
//fact塊
typedef __packed struct
{
u32 ChunkID; //chunk id;這里固定為"fact",即0X74636166;
u32 ChunkSize ; //子集合大小(不包括ID和Size);這里為:4.
u32 NumOfSamples; //采樣的數量;
}ChunkFACT;
//LIST塊
typedef __packed struct
{
u32 ChunkID; //chunk id;這里固定為"LIST",即0X74636166;
u32 ChunkSize ; //子集合大小(不包括ID和Size);這里為:4.
}ChunkLIST;
//data塊
typedef __packed struct
{
u32 ChunkID; //chunk id;這里固定為"data",即0X5453494C
u32 ChunkSize ; //子集合大小(不包括ID和Size)
}ChunkDATA;
//wav頭
typedef __packed struct
{
ChunkRIFF riff; //riff塊
ChunkFMT fmt; //fmt塊
// ChunkFACT fact; //fact塊 線性PCM,沒有這個結構體
ChunkDATA data; //data塊
}__WaveHeader;
//wav 播放控制結構體
typedef __packed struct
{
u16 audioformat; //音頻格式;0X01,表示線性PCM;0X11表示IMA ADPCM
u16 nchannels; //通道數量;1,表示單聲道;2,表示雙聲道;
u16 blockalign; //塊對齊(字節);
u32 datasize; //WAV數據大小
u32 totsec ; //整首歌時長,單位:秒
u32 cursec ; //當前播放時長
u32 bitrate; //比特率(位速)
u32 samplerate; //采樣率
u16 bps; //位數,比如16bit,24bit,32bit
u32 datastart; //數據幀開始的位置(在文件里面的偏移)
}__wavctrl;
#include "stdio.h"
#include "usart.h"
#include "malloc.h"
#include "ff.h"
#include "exfuns.h"
#include "wavedac.h"
#include "wavplay.h"
#include "timer4.h" //現在改成了timer4
#include "stm32f10x_dac.h"
#include "stdlib.h" //字符串和浮點數的相互轉換庫
#include "key.h"
#include "txt.h"
#include "adc.h"
#include "led.h"
//下面是錄音頭文件
#include "recorderl.h"
#include "timerl.h"
#include "adcl.h"
#include "dmal.h"
#include "ledl.h"
//#include "memory.h"
#include "string.h"
#include "flash.h" //關於flash的頭文件
#include "sdio_sdcard.h"
注意以上是我的一個頭文件,,,,這個文件是main.h文件
因為我感覺頭文件太多,所以就建立了一個總的頭文件,
結果引入 main.h不但沒有省下多少力氣,反而更加費力了,
原因在於你需要弄好這個幾個頭文件的順序<><><><>
不過經驗告訴我,,,還是不要建什么main.h了,,{不過總要有排序的,,在主函數中#include也是有順序的.}
一開始我想初始化SD卡,,起初程序好好的
但是不知道為什么,,后來就不行了,,而且也沒有報錯
后來找到修改的地方,我只是在main.h中又加入了幾個.h文件
可能是這個原因導致SD卡不能初始化,具體是哪個還不太清楚????