|
斷斷續(xù)續(xù)搞了有四個(gè)月了,STM32是去年十月份開始學(xué)習(xí)的,到目前為止也快有一年了。雖然還有許多未完善的地方,比如游戲和文件傳送之類。但由于有別的東西等著做,所以暫時(shí)先放下了。趁剛考完試有點(diǎn)時(shí)間,和大家分享一下。
這個(gè)PDA沒(méi)用操作系統(tǒng),完全跑裸機(jī)的。如果真要說(shuō)有操作系統(tǒng),那我就稱它為“正點(diǎn)原子系統(tǒng)”。因?yàn)橛泻枚嗖糠值拇a(特別是GUI那里)是移植正點(diǎn)原子師兄的畢業(yè)設(shè)計(jì)的,應(yīng)該也有不少網(wǎng)友看過(guò)的了,確實(shí)是很強(qiáng)大。真的非常感謝師兄。
經(jīng)過(guò)一些改進(jìn)后,現(xiàn)在支持的市面上大部分的SD卡了,包括SD1.0,SD2.0,SDHC,實(shí)測(cè)可以支持到8G,更大的就未試過(guò),不過(guò)我想應(yīng)該是一樣可以的,因?yàn)楦叩?6G和32G基本上都是SDHC類型。
文件系統(tǒng)用的是FAT32,這部分確實(shí)要花一定時(shí)間去學(xué)習(xí),記得二月分開始搞FAT文件系統(tǒng)時(shí)真的搞得比較頭暈,后來(lái)是在三月分和一個(gè)同學(xué)一齊鉆研才攻破的。這個(gè)弄通了,后面的事就好辦多了。另外還有遇到許多其他的問(wèn)題在這就不多說(shuō)了。
板子功能:
1、音樂(lè)播放器,支持mp3、wma、MIDI等多種音頻格式,支持歌詞顯示,支持頻譜顯示,上一首、下一首、進(jìn)度條等。(移植師兄的,很好用^_^)
2、圖片瀏覽,支持BMP、JPG、JPEG格式。
3、電子書功能,支持TXT,C,H,LRC文件的閱讀。
4、萬(wàn)年歷、溫度傳感。
5、紅外。(這個(gè)什么用)
6、無(wú)線彩燈控制功能。之前是用NRF24L01來(lái)做的,控制一塊用LED組成的“SCUT”板。
7、收音機(jī)。用的是TEA5767數(shù)字收音機(jī)芯片。(聲音很小啊。。。)
8、畫畫功能。
9、計(jì)算器。
10、加速度傳感器,這個(gè)其實(shí)可以用來(lái)玩游戲的,現(xiàn)在我只用它做動(dòng)作控制圖片切換,還有畫畫時(shí)搖一下就可以清屏(這個(gè)比較好玩^_^)。
11、文件傳送。當(dāng)時(shí)是因?yàn)橐粋(gè)比賽需要才做這個(gè)功能的。只做了TXT文件傳送,以后可以做下其他文件的。
12、藍(lán)牙。
板上加了個(gè)PL2303的USB轉(zhuǎn)串口芯片,因此現(xiàn)在下載程序是比較方便的,插上USB線后就可以下載程序了,不用再去找下載器。而且,它還可以用來(lái)做串口通信。這個(gè)芯片成本不用兩塊錢,的確是比較實(shí)惠的。其實(shí)有一個(gè)更好玩的東西我沒(méi)試過(guò)。就是無(wú)線下載程序,因?yàn)榘迳嫌袀(gè)藍(lán)牙,我之前是用它來(lái)作無(wú)線串口用的,而下載程序也是用串口,所以用來(lái)做無(wú)線程序下載應(yīng)該也是可以的。有空再試試。
有個(gè)問(wèn)題想請(qǐng)教一下大家。是不是所有的TEA5767輸出音量都很小,我的如果不加功放的話,幾乎是聽不見的。另外,我將TEA5767的 Rout,Lout,GND分別連到我的耳塞的對(duì)應(yīng)端口,完全沒(méi)聲音。但當(dāng)我把GND線斷開時(shí),也就是只連上Rout和Lout線,卻是有聲音的(但聲音像上面所說(shuō)的很小),很奇怪。
完整代碼下載地址:http://www.torrancerestoration.com/f/29782212PDA.rar
以下是文件列表:
http://www.torrancerestoration.com/bbs/dpj-21063-1.html
http://www.torrancerestoration.com/bbs/dpj-21062-1.html
http://www.torrancerestoration.com/bbs/dpj-21061-1.html
http://www.torrancerestoration.com/bbs/dpj-21060-1.html
http://www.torrancerestoration.com/bbs/dpj-21059-1.html
///////////////////////////////////////////////////
//緩存共用說(shuō)明:
//圖片解碼公用了w25x16的4k緩存(SPI_FLASH_BUF[4096])
//生成readme文件公用了w25x16的4k緩存(SPI_FLASH_BUF[4096])
//字庫(kù)更新共用了圖片解碼緩存jpg_buffer[1024]
//MP3共享了jpg_buffer[1024]臨時(shí)存放歌曲數(shù)據(jù)
//MP3共享了SPI_FLASH_BUF[4096]存路徑,從而支持盡量多層文件夾后的音頻文件的播放
//文件管理器調(diào)用了SPI_FLASH_BUF[4096]用做文件夾刪除備份路徑
////////////////////////////////////////////////////
//SETUP.SET:
//0-17:觸摸屏校準(zhǔn)記錄
//19:屏保延時(shí)
//21:黑屏延時(shí)
//23:MP3音量
//24:VS10XXram0
//25:VS10XXram1
//26:VS10XXram2
//27:VS10XXram3
///////////////////////////////////////////////////
//TIM4:屏保延時(shí),黑屏延時(shí)
///////////////////////////////////////////////////
//連線配置:
//SPI:SCK-PA5,MISO-PA6,MOSI-PA7
//FLASH:CS-PA2,LED-PA8
//SD:CS-PA3,LED-PD2
//觸摸屏:MOSI-PC3,MISO-PC2,CLK-PC0,CS-PC13,PEN-PC1
//液晶:LED-PC10,CS-PC9,RS-PC8,WR-PC7,RD-PC6,RST-PC4,DAT-PB
//按鍵:開機(jī)鍵:PA0,菜單鍵:PA13
//VS10XX:RST-PA11,DREQ-PA12,MIS0-PA6,MOSI-PA7,SCK-PA5,XDCS-PA4,XCS-PA1
//////////////////////////////////////////////////////
//圖標(biāo)存放位置變動(dòng):僅修改了picdecoder.c,theme.h,theme.c這三個(gè)文件
///////////////////////////////////////////////////
#include <stm32f10x_lib.h>
#include "includes.h"
//定義文件系統(tǒng)結(jié)構(gòu)體
FATFS fatfs;//引用文件系統(tǒng)結(jié)構(gòu)體
void SystemInit(void){}
extern u8 bootup_adjust;
extern u8 bootup_font_update;
#if ICO_TO_SD==0
extern u8 bootup_ico_update;
#endif
void App_Init(void)
{
Stm32_Clock_Init(9);
Delay_Init(72);
Power_Init();
ILI9320_Init();//初始化液晶
clear(0,0,240,320,color(0,0,0));//立馬清屏
Touch_Init();//初始化觸摸屏
Adc_Init();//ADC初始化,為CPU溫度使用
// Load_Touch_Default();//預(yù)裝載默認(rèn)觸摸屏校準(zhǔn)值,為未初始化SD卡之前使用觸摸屏做準(zhǔn)備
SPI_Flash_Init();//初始化字庫(kù)flash
Check_SD();//檢查SD卡,需要用到液晶,須在液晶后初始化
Theme_Init();//這個(gè)應(yīng)用了Flash,須在Flash初始化后初始化
RTC_Init();//這個(gè)應(yīng)用了觸摸屏,必須在觸摸屏初始化之后初始化
Key_Init();//初始化按鍵
///////////////////////
//開機(jī)畫面
if(PAin(13)==0)
{
bootup_adjust=1;
Touch_Adjust();
bootup_font_update=1;
Font_Update();
#if ICO_TO_SD==0
bootup_ico_update=1;
Ico_Update();
#endif
}
display_off(1);
show_ico(0,0,240,320,bootup.addr,bootup.size);
display_on(1);
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
///////////////////////
TimerX_Init(10000,7199,4);//初始化定時(shí)器4,初始化屏保
if(Scr_Delay!=0)TimerX_On(4);
VS_Init();//初始化MP3
}
//顯示圖標(biāo)特效
void show_icos(void)
{
//第一行圖標(biāo)
show_ico(17,35,73,91,source.addr,source.size);//資源管理器圖標(biāo)
show_string(5,98,80,"資源管理器",16,color(0,0,0));
show_ico(91,35,147,91,pic.addr,pic.size);//圖片圖標(biāo)
show_string(103,98,32,"圖庫(kù)",16,color(0,0,0));
show_ico(165,35,221,91,drawing.addr,drawing.size);//繪圖板圖標(biāo)
show_string(153,98,80,"簡(jiǎn)易繪圖板",16,color(0,0,0));
//第二行圖標(biāo)
show_ico(17,123,73,179,notebook.addr,notebook.size);//記事本圖標(biāo)
show_string(21,186,48,"記事本",16,color(0,0,0));
show_ico(91,123,147,179,music.addr,music.size);//音樂(lè)圖標(biāo)
show_string(103,186,32,"音樂(lè)",16,color(0,0,0));
show_ico(165,123,221,179,radio.addr,radio.size);//收音機(jī)圖標(biāo)
show_string(169,186,48,"收音機(jī)",16,color(0,0,0));
//第三行圖標(biāo)
show_ico(17,211,73,267,others.addr,others.size);//其他功能圖標(biāo)
show_string(13,274,64,"其他功能",16,color(0,0,0));
show_ico(91,211,147,267,date.addr,date.size);//日歷圖標(biāo)
show_string(103,274,32,"日歷",16,color(0,0,0));
show_ico(165,211,221,267,setup.addr,setup.size);//設(shè)置圖標(biāo)
show_string(177,274,32,"設(shè)置",16,color(0,0,0));
//顯示時(shí)間背景
clear(0,0,239,17,color(0,0,255));
clear(0,301,239,319,color(0,0,255));
}
extern u8 reflash;//引用時(shí)鐘更新標(biāo)志
u8 app_sta=0;//軟件啟動(dòng)狀態(tài)
int main(void)
{
App_Init();
while(1)
{
//還原觸摸屏坐標(biāo)
Pen_Point.x0=0;
Pen_Point.y0=0;
clear(0,0,239,319,color(255,255,255));
show_icos();//顯示圖標(biāo)
while(app_sta==0)
{
if(Scr_Flag==1)
{
Scr_Flag=2;
clear(0,0,240,320,color(0,0,0));
}
else if(Scr_Flag)
{
Screen_Saver();//屏保程序
if(Scr_Flag==3)//還原圖標(biāo)
{
clear(0,0,240,320,color(255,255,255));
show_icos();
Scr_Flag=0;
}
}
else if((reflash)&&(Scr_Flag==0))
{
reflash=0;//清空時(shí)鐘更新標(biāo)志
//顯示時(shí)間日期
Show_Digital_Clock(95,3,12,color(0,255,255),color(0,0,255));
Show_Digital_Date(53,304,12,color(0,255,255),color(0,0,255));
Show_Digital_Week(149,304,12,color(0,255,255),color(0,0,255));
}
if(Pen_Point.Key_Sta==Key_Down)
{
Pen_Int_Set(0);//關(guān)閉中斷
Pen_Point.Key_Sta=Key_Up;
do//連續(xù)讀取數(shù)據(jù)
{
Convert_Pos();
if(Is_In_Area(15,33,75,107))app_sta=1;//((Pen_Point.x0>15)&&(Pen_Point.x0<75))&&((Pen_Point.y0>33)&&(Pen_Point.y0<107)))app_sta=1;
else if(Is_In_Area(89,33,149,107))app_sta=2;//((Pen_Point.x0>89)&&(Pen_Point.x0<149))&&((Pen_Point.y0>33)&&(Pen_Point.y0<107)))app_sta=2;
else if(Is_In_Area(163,33,223,107))app_sta=3;//((Pen_Point.x0>163)&&(Pen_Point.x0<223))&&((Pen_Point.y0>33)&&(Pen_Point.y0<107)))app_sta=3;
//第二行圖標(biāo)
else if(Is_In_Area(15,121,75,193))app_sta=4;//((Pen_Point.x0>15)&&(Pen_Point.x0<75))&&((Pen_Point.y0>121)&&(Pen_Point.y0<193)))app_sta=4;
else if(Is_In_Area(89,121,149,193))app_sta=5;//((Pen_Point.x0>89)&&(Pen_Point.x0<149))&&((Pen_Point.y0>121)&&(Pen_Point.y0<193)))app_sta=5;
else if(Is_In_Area(163,121,223,193))app_sta=6;//((Pen_Point.x0>163)&&(Pen_Point.x0<223))&&((Pen_Point.y0>121)&&(Pen_Point.y0<193)))app_sta=6;
//第三行圖標(biāo)
else if(Is_In_Area(15,209,75,281))app_sta=7;//((Pen_Point.x0>15)&&(Pen_Point.x0<75))&&((Pen_Point.y0>209)&&(Pen_Point.y0<281)))app_sta=7;
else if(Is_In_Area(89,209,149,281))app_sta=8;//((Pen_Point.x0>89)&&(Pen_Point.x0<149))&&((Pen_Point.y0>209)&&(Pen_Point.y0<281)))app_sta=8;
else if(Is_In_Area(163,209,223,281))app_sta=9;//((Pen_Point.x0>163)&&(Pen_Point.x0<223))&&((Pen_Point.y0>209)&&(Pen_Point.y0<281)))app_sta=9;
else app_sta=0;
//顯示選框
//第一行圖標(biāo)
if(app_sta==1)dis_kuang(15,33,74,95,color(255,153,0));//資源管理器圖標(biāo)
else dis_kuang(15,33,74,95,color(255,255,255));//資源管理器圖標(biāo)
if(app_sta==2)dis_kuang(89,33,148,95,color(255,153,0));//圖片圖標(biāo)
else dis_kuang(89,33,148,95,color(255,255,255));//圖片圖標(biāo)
if(app_sta==3)dis_kuang(163,33,222,95,color(255,153,0));//繪圖板圖標(biāo)
else dis_kuang(163,33,222,95,color(255,255,255));//繪圖板圖標(biāo)
//第二行圖標(biāo)
if(app_sta==4)dis_kuang(15,121,74,183,color(255,153,0));//記事本圖標(biāo)
else dis_kuang(15,121,74,183,color(255,255,255));//記事本圖標(biāo)
if(app_sta==5)dis_kuang(89,121,148,183,color(255,153,0));//音樂(lè)圖標(biāo)
else dis_kuang(89,121,148,183,color(255,255,255));//音樂(lè)圖標(biāo)
if(app_sta==6)dis_kuang(163,121,222,183,color(255,153,0));//收音機(jī)圖標(biāo)
else dis_kuang(163,121,222,183,color(255,255,255));//收音機(jī)圖標(biāo)
//第三行圖標(biāo)
if(app_sta==7)dis_kuang(15,209,74,271,color(255,153,0));//其他功能圖標(biāo)
else dis_kuang(15,209,74,271,color(255,255,255));//其他功能圖標(biāo)
if(app_sta==8)dis_kuang(89,209,148,271,color(255,153,0));//日歷圖標(biāo)
else dis_kuang(89,209,148,271,color(255,255,255));//日歷圖標(biāo)
if(app_sta==9)dis_kuang(163,209,222,271,color(255,153,0));//設(shè)置圖標(biāo)
else dis_kuang(163,209,222,271,color(255,255,255));//設(shè)置圖標(biāo)
Delay_us(50);
}while(T_PEN==0);
Pen_Int_Set(1);//開啟中斷
}
}
switch(app_sta)
{
case 1:Resource();break;
case 2:break;
case 3:Drawing();break;
case 4:break;
case 5:Music();break;
case 6:break;
case 7:break;
case 8:Ri_Li();break;
case 9:Set_Up();break;
}
app_sta=0;
}
}
|
|