断断续续搞了有四个月了,STM32是去年十月份开始学习的,到目前为止也快有一年了。虽然还有许多未完善的地方,比如游戏和文件传送之类。但由于有别的东西等着做,所以暂时先放下了。趁刚考完试有点时间,和大家分享一下。
这个PDA没用操作系统,完全跑裸机的。如果真要说有操作系统,那我就称它为“正点原子系统”。因为有好多部分的代码(特别是GUI那里)是移植正点原子师兄的毕业设计的,应该也有不少网友看过的了,确实是很强大。真的非常感谢师兄。
经过一些改进后,现在支持的市面上大部分的SD卡了,包括SD1.0,SD2.0,SDHC,实测可以支持到8G,更大的就未试过,不过我想应该是一样可以的,因为更高的16G和32G基本上都是SDHC类型。
文件系统用的是FAT32,这部分确实要花一定时间去学习,记得二月分开始搞FAT文件系统时真的搞得比较头晕,后来是在三月分和一个同学一齐钻研才攻破的。这个弄通了,后面的事就好办多了。另外还有遇到许多其他的问题在这就不多说了。
板子功能:
1、音乐播放器,支持mp3、wma、MIDI等多种音频格式,支持歌词显示,支持频谱显示,上一首、下一首、进度条等。(移植师兄的,很好用^_^)
2、图片浏览,支持BMP、JPG、JPEG格式。
3、电子书功能,支持TXT,C,H,LRC文件的阅读。
4、万年历、温度传感。
5、红外。(这个什么用)
6、无线彩灯控制功能。之前是用NRF24L01来做的,控制一块用LED组成的“SCUT”板。
7、收音机。用的是TEA5767数字收音机芯片。(声音很小啊。。。)
8、画画功能。
9、计算器。
10、加速度传感器,这个其实可以用来玩游戏的,现在我只用它做动作控制图片切换,还有画画时摇一下就可以清屏(这个比较好玩^_^)。
11、文件传送。当时是因为一个比赛需要才做这个功能的。只做了TXT文件传送,以后可以做下其他文件的。
12、蓝牙。
板上加了个PL2303的USB转串口芯片,因此现在下载程序是比较方便的,插上USB线后就可以下载程序了,不用再去找下载器。而且,它还可以用来做串口通信。这个芯片成本不用两块钱,的确是比较实惠的。其实有一个更好玩的东西我没试过。就是无线下载程序,因为板上有个蓝牙,我之前是用它来作无线串口用的,而下载程序也是用串口,所以用来做无线程序下载应该也是可以的。有空再试试。
有个问题想请教一下大家。是不是所有的TEA5767输出音量都很小,我的如果不加功放的话,几乎是听不见的。另外,我将TEA5767的 Rout,Lout,GND分别连到我的耳塞的对应端口,完全没声音。但当我把GND线断开时,也就是只连上Rout和Lout线,却是有声音的(但声音像上面所说的很小),很奇怪。
完整代码下载地址:http://www.51hei.com/f/29782212PDA.rar
以下是文件列表:
http://www.51hei.com/bbs/dpj-21063-1.html
http://www.51hei.com/bbs/dpj-21062-1.html
http://www.51hei.com/bbs/dpj-21061-1.html
http://www.51hei.com/bbs/dpj-21060-1.html
http://www.51hei.com/bbs/dpj-21059-1.html
///////////////////////////////////////////////////
//缓存共用说明:
//图片解码公用了w25x16的4k缓存(SPI_FLASH_BUF[4096])
//生成readme文件公用了w25x16的4k缓存(SPI_FLASH_BUF[4096])
//字库更新共用了图片解码缓存jpg_buffer[1024]
//MP3共享了jpg_buffer[1024]临时存放歌曲数据
//MP3共享了SPI_FLASH_BUF[4096]存路径,从而支持尽量多层文件夹后的音频文件的播放
//文件管理器调用了SPI_FLASH_BUF[4096]用做文件夹删除备份路径
////////////////////////////////////////////////////
//SETUP.SET:
//0-17:触摸屏校准记录
//19:屏保延时
//21:黑屏延时
//23:MP3音量
//24:VS10XXram0
//25:VS10XXram1
//26:VS10XXram2
//27:VS10XXram3
///////////////////////////////////////////////////
//TIM4:屏保延时,黑屏延时
///////////////////////////////////////////////////
//连线配置:
//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
//按键:开机键:PA0,菜单键:PA13
//VS10XX:RST-PA11,DREQ-PA12,MIS0-PA6,MOSI-PA7,SCK-PA5,XDCS-PA4,XCS-PA1
//////////////////////////////////////////////////////
//图标存放位置变动:仅修改了picdecoder.c,theme.h,theme.c这三个文件
///////////////////////////////////////////////////
#include <stm32f10x_lib.h>
#include "includes.h"
//定义文件系统结构体
FATFS fatfs;//引用文件系统结构体
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();//预装载默认触摸屏校准值,为未初始化SD卡之前使用触摸屏做准备
SPI_Flash_Init();//初始化字库flash
Check_SD();//检查SD卡,需要用到液晶,须在液晶后初始化
Theme_Init();//这个应用了Flash,须在Flash初始化后初始化
RTC_Init();//这个应用了触摸屏,必须在触摸屏初始化之后初始化
Key_Init();//初始化按键
///////////////////////
//开机画面
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);//初始化定时器4,初始化屏保
if(Scr_Delay!=0)TimerX_On(4);
VS_Init();//初始化MP3
}
//显示图标特效
void show_icos(void)
{
//第一行图标
show_ico(17,35,73,91,source.addr,source.size);//资源管理器图标
show_string(5,98,80,"资源管理器",16,color(0,0,0));
show_ico(91,35,147,91,pic.addr,pic.size);//图片图标
show_string(103,98,32,"图库",16,color(0,0,0));
show_ico(165,35,221,91,drawing.addr,drawing.size);//绘图板图标
show_string(153,98,80,"简易绘图板",16,color(0,0,0));
//第二行图标
show_ico(17,123,73,179,notebook.addr,notebook.size);//记事本图标
show_string(21,186,48,"记事本",16,color(0,0,0));
show_ico(91,123,147,179,music.addr,music.size);//音乐图标
show_string(103,186,32,"音乐",16,color(0,0,0));
show_ico(165,123,221,179,radio.addr,radio.size);//收音机图标
show_string(169,186,48,"收音机",16,color(0,0,0));
//第三行图标
show_ico(17,211,73,267,others.addr,others.size);//其他功能图标
show_string(13,274,64,"其他功能",16,color(0,0,0));
show_ico(91,211,147,267,date.addr,date.size);//日历图标
show_string(103,274,32,"日历",16,color(0,0,0));
show_ico(165,211,221,267,setup.addr,setup.size);//设置图标
show_string(177,274,32,"设置",16,color(0,0,0));
//显示时间背景
clear(0,0,239,17,color(0,0,255));
clear(0,301,239,319,color(0,0,255));
}
extern u8 reflash;//引用时钟更新标志
u8 app_sta=0;//软件启动状态
int main(void)
{
App_Init();
while(1)
{
//还原触摸屏坐标
Pen_Point.x0=0;
Pen_Point.y0=0;
clear(0,0,239,319,color(255,255,255));
show_icos();//显示图标
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)//还原图标
{
clear(0,0,240,320,color(255,255,255));
show_icos();
Scr_Flag=0;
}
}
else if((reflash)&&(Scr_Flag==0))
{
reflash=0;//清空时钟更新标志
//显示时间日期
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);//关闭中断
Pen_Point.Key_Sta=Key_Up;
do//连续读取数据
{
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;
//第二行图标
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;
//第三行图标
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;
//显示选框
//第一行图标
if(app_sta==1)dis_kuang(15,33,74,95,color(255,153,0));//资源管理器图标
else dis_kuang(15,33,74,95,color(255,255,255));//资源管理器图标
if(app_sta==2)dis_kuang(89,33,148,95,color(255,153,0));//图片图标
else dis_kuang(89,33,148,95,color(255,255,255));//图片图标
if(app_sta==3)dis_kuang(163,33,222,95,color(255,153,0));//绘图板图标
else dis_kuang(163,33,222,95,color(255,255,255));//绘图板图标
//第二行图标
if(app_sta==4)dis_kuang(15,121,74,183,color(255,153,0));//记事本图标
else dis_kuang(15,121,74,183,color(255,255,255));//记事本图标
if(app_sta==5)dis_kuang(89,121,148,183,color(255,153,0));//音乐图标
else dis_kuang(89,121,148,183,color(255,255,255));//音乐图标
if(app_sta==6)dis_kuang(163,121,222,183,color(255,153,0));//收音机图标
else dis_kuang(163,121,222,183,color(255,255,255));//收音机图标
//第三行图标
if(app_sta==7)dis_kuang(15,209,74,271,color(255,153,0));//其他功能图标
else dis_kuang(15,209,74,271,color(255,255,255));//其他功能图标
if(app_sta==8)dis_kuang(89,209,148,271,color(255,153,0));//日历图标
else dis_kuang(89,209,148,271,color(255,255,255));//日历图标
if(app_sta==9)dis_kuang(163,209,222,271,color(255,153,0));//设置图标
else dis_kuang(163,209,222,271,color(255,255,255));//设置图标
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;
}
}
|