標(biāo)題:
stm32示波器制作資料
[打印本頁]
作者:
51hei學(xué)習(xí)技術(shù)中
時間:
2016-11-15 12:20
標(biāo)題:
stm32示波器制作資料
最近想玩玩stm32的ad功能,看到網(wǎng)上ds0201的示波器是開源的!淘寶的店主也很熱情,給了我1.1版的源代碼
是IAR編譯器
我把它移植到KEIL下,為了提高速度,我使用fsmc方式驅(qū)動lcd顯示
現(xiàn)在還有點(diǎn)小問題,正在解決中。。(波形有點(diǎn)重疊)
資料下載:
stm32示波器.zip
(2.36 MB, 下載次數(shù): 110)
2016-11-15 12:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
ds0201.rar
(20.64 KB, 下載次數(shù): 69)
2016-11-15 12:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
主程序預(yù)覽:
/**************************************************************
DQ-STM32開發(fā)板試驗(yàn)程序
2.4寸 示波器顯示實(shí)例(FSMC液晶接口)
源程序由IAR移植
****************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "fsmc_sram.h"
#include "Function.h"
#include "Lcd.h"
#include "HW_V1_Config.h"
#include "misc.h"
#include "stm32f10x_it.h"
#include "Calculate.h"
#include "stm32f10x_usart.h"
#include "stdio.h"
/*******************************************************************************
* Function Name : main
* Description : Main program
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
unsigned int i;
RCC_Configuration(); /* 系統(tǒng)時鐘初始化 */
NVIC_Configuration(); /*GPIO端口配置*/
GPIO_Configuration();
DMA_Configuration();
ADC_Configuration();
Timer_Configuration();
USART_Configuration(); /* 串口初始化 */
LCD_Initial(); /*液晶初始化*/
Clear_Screen(BLACK); //清屏幕
Display_Logo(30,150);
/*----------顯示開機(jī)提示信息頁面----------*/
Display_Str(8, 87, GRN,PRN, " System Initialize...");
Display_Str(8, 55, GRN,PRN, " Please Wait");
Display_Str(8, 23, YEL,PRN, " Snail Dongbin Oscilloscope Ver 1.0 ");
printf("\n\r snail_dongbin 示波器實(shí)驗(yàn) ! \n\r");
Delay_Counter=1000;
while (Delay_Counter)
{
Battery_Detect(); //電池電量檢測
for(i=0; i<300; ++i) Signal_Buffer[i]=120;
for(i=0; i<0x1000; ++i) Scan_Buffer[i]=1940;
};
/*示波器工作頁面顯示初始化*/
Clear_Screen(BLACK); //清屏幕
Display_Grid(); //顯示背景網(wǎng)格
Display_Frame();
/* 主循環(huán) */
while (1)
{
Update_Item();
Scan_Wave();
if(Key_Buffer!=0)
{
Update[Item]=1;
if(Key_Buffer==KEYCODE_PLAY)
{
Update[15]=1;
if(Item_Index[RUNNING_STATUS]==RUN)
Item_Index[RUNNING_STATUS]=HOLD;
else
{
ADC_Start();
Item_Index[RUNNING_STATUS]=RUN;
Sync=0;
}
}
switch (Item)
{
case SYNC_MODE:
if(Key_Buffer==KEYCODE_LEFT) Item=TRIG_LEVEL;
if(Key_Buffer==KEYCODE_RIGHT) Item=Y_SENSITIVITY;
if(Key_Buffer==KEYCODE_DOWN){ //指向下一種掃描同步方式
if(Item_Index[SYNC_MODE]>0) Item_Index[SYNC_MODE]--;
else Item_Index[SYNC_MODE]=3;
ADC_Start();
Sync=0;
Frame=0;
Item_Index[RUNNING_STATUS]=RUN;
Update[RUNNING_STATUS]=1;
}
if(Key_Buffer==KEYCODE_UP){ //指向上一種掃描同步方式
if(Item_Index[SYNC_MODE]<3) Item_Index[SYNC_MODE]++;
else Item_Index[SYNC_MODE]=0;
ADC_Start();
Sync=0;
Frame=0;
Item_Index[RUNNING_STATUS]=RUN;
Update[RUNNING_STATUS]=1;
}
break;
case Y_SENSITIVITY:
if(Key_Buffer==KEYCODE_LEFT) Item=SYNC_MODE;
if(Key_Buffer==KEYCODE_RIGHT) Item=X_SENSITIVITY;
if(Key_Buffer==KEYCODE_UP){
Erase_Wave(MODEL);
ADC_Start();
Sync=0;
if((Item_Index[INPUT_ATTENUATOR]==0)&&(Item_Index[Y_SENSITIVITY]<9))
Item_Index[Y_SENSITIVITY]++; //輸入探頭衰減=1時
if((Item_Index[INPUT_ATTENUATOR]==1)&&(Item_Index[Y_SENSITIVITY]<18))
Item_Index[Y_SENSITIVITY]++; //輸入探頭衰減=10時
}
if(Key_Buffer==KEYCODE_DOWN){
Erase_Wave(MODEL);
ADC_Start();
Sync=0;
if((Item_Index[INPUT_ATTENUATOR]==0)&&(Item_Index[Y_SENSITIVITY]>0))
Item_Index[Y_SENSITIVITY]--; //輸入探頭衰減=1時
if((Item_Index[INPUT_ATTENUATOR]==1)&&(Item_Index[Y_SENSITIVITY]>11))
Item_Index[Y_SENSITIVITY]--; //輸入探頭衰減=10時
}
if(Item_Index[Y_SENSITIVITY]!=Ref_Buffer [302]) Hide_Ref=1;
break;
case X_SENSITIVITY:
if(Key_Buffer==KEYCODE_LEFT) Item=Y_SENSITIVITY;
if(Key_Buffer==KEYCODE_RIGHT) Item=Y_POSITION;
if((Key_Buffer==KEYCODE_UP)&&(Item_Index[X_SENSITIVITY]<21)){
Item_Index[X_SENSITIVITY]++;
Erase_Wave(MODEL);
ADC_Start();
Sync=0;
}
if((Key_Buffer==KEYCODE_DOWN)&&(Item_Index[X_SENSITIVITY]>0)){
Item_Index[X_SENSITIVITY]--;
Erase_Wave(MODEL);
ADC_Start();
Sync=0;
}
if(Item_Index[X_SENSITIVITY]!=Ref_Buffer [303]) Hide_Ref=1;
break;
case Y_POSITION:
if(Key_Buffer==KEYCODE_LEFT) Item=X_SENSITIVITY;
if(Key_Buffer==KEYCODE_RIGHT) Item=MEASUR_KIND;
if((Key_Buffer==KEYCODE_UP)&&(v0<MAX_Y)){
Erase_Wave(MODEL);
Erase_Wave(CURVE);
Erase_Dot_v0();
Erase_Vn(v0);
v0++;
Hide_v0=0;
} //'垂直位移'基線上移,顯示基線。
if((Key_Buffer==KEYCODE_DOWN)&&(v0>(MIN_Y+1))){
Erase_Wave(MODEL);
Erase_Wave(CURVE);
Erase_Dot_v0();
Erase_Vn(v0);
v0--;
Hide_v0=0;
} //'垂直位移'基線下移,顯示基線。
if(Key_Buffer==KEYCODE_MANU)
Hide_v0=1-Hide_v0; //(顯示/消隱)垂直位移基線。
break;
case MEASUR_KIND:
if(Key_Buffer==KEYCODE_LEFT) Item=Y_POSITION;
if(Key_Buffer==KEYCODE_RIGHT){
Hide_vs=0;
Item=TRIG_SENSITIVITY;
}
if(Key_Buffer==KEYCODE_UP){
if(Item_Index[MEASUR_KIND]<2) Item_Index[MEASUR_KIND]++; //選擇下一種測量類型
else Item_Index[MEASUR_KIND]=0;
}
if(Key_Buffer==KEYCODE_DOWN){
if(Item_Index[MEASUR_KIND]>0) Item_Index[MEASUR_KIND]--; //選擇上一種測量類型
else Item_Index[MEASUR_KIND]=2;
}
break; //測量類型共有:FREQN、CYCLE、DUTY 3種
case POWER_INFOMATION:
if(Key_Buffer==KEYCODE_LEFT) Item=MEASUR_KIND;
if(Key_Buffer==KEYCODE_DOWN) Item=TRIG_SENSITIVITY;
break; //供電方式共有:BATT(FULL、HALF、FEW、EMPTY)、USB 5種狀態(tài)
case TRIG_SENSITIVITY:
if(Key_Buffer==KEYCODE_UP){
Hide_vs=1;
Item=MEASUR_KIND;
Update[Y_VERNIER_2]=1;
}
if(Key_Buffer==KEYCODE_DOWN){
Item=TRIG_SLOPE;
Hide_vs=1;
}
if((Key_Buffer==KEYCODE_RIGHT)&&((Item_Index[TRIG_SENSITIVITY]+vt)<(MAX_Y-1))
&&((vt-Item_Index[TRIG_SENSITIVITY])>(MIN_Y+3))){
Item_Index[TRIG_SENSITIVITY]++; //降低觸發(fā)靈敏度
}
if((Key_Buffer==KEYCODE_LEFT)&&(Item_Index[TRIG_SENSITIVITY]>0)){
temp=vt;
vt=temp+Item_Index[TRIG_SENSITIVITY];
Erase_Vn(vt);
vt=temp-Item_Index[TRIG_SENSITIVITY];
Erase_Vn(vt);
vt=temp;
Item_Index[TRIG_SENSITIVITY]--; //提高觸發(fā)靈敏度
}
break;
case TRIG_SLOPE:
if(Key_Buffer==KEYCODE_UP){
Hide_vs=0;
Item=TRIG_SENSITIVITY;
}
if(Key_Buffer==KEYCODE_DOWN) Item=INPUT_ATTENUATOR;
if((Key_Buffer==KEYCODE_LEFT)||(Key_Buffer==KEYCODE_RIGHT)){
Item_Index[TRIG_SLOPE]=1-Item_Index[TRIG_SLOPE]; //選擇(上升沿觸發(fā)/下降沿觸發(fā))
}
break;
case INPUT_ATTENUATOR:
if(Key_Buffer==KEYCODE_UP) Item=TRIG_SLOPE;
if(Key_Buffer==KEYCODE_DOWN){
if(SD_Card_ON()==0) Item=SAVE_WAVE_CURVE;
else Item=OUTPUT_FREQUENCY; //若無SD卡,則指向'頻率輸出設(shè)定'
}
if((Key_Buffer==KEYCODE_LEFT)||(Key_Buffer==KEYCODE_RIGHT)){
Erase_Wave(MODEL);
Erase_Wave(CURVE);
Item_Index[INPUT_ATTENUATOR]=1-Item_Index[INPUT_ATTENUATOR]; //(×1/×0.1)輸入衰減選擇
}
if((Item_Index[INPUT_ATTENUATOR]==0)&&(Item_Index[Y_SENSITIVITY]>9))
Item_Index[Y_SENSITIVITY]-=9;
if((Item_Index[INPUT_ATTENUATOR]==1)&&(Item_Index[Y_SENSITIVITY]<10))
Item_Index[Y_SENSITIVITY]+=9;
break;
case SAVE_WAVE_CURVE:
if(SD_Card_ON()==0) //有SD卡
{
// if(Key_Buffer==KEYCODE_UP) Item=INPUT_ATTENUATOR;
// if(Key_Buffer==KEYCODE_DOWN) Item=LOAD_WAVE_CURVE;
// if((Key_Buffer==KEYCODE_RIGHT)&&(Item_Index[SAVE_WAVE_CURVE]<255))
// Item_Index[SAVE_WAVE_CURVE]++; //波形文件序號號+1
// if((Key_Buffer==KEYCODE_LEFT)&&(Item_Index[SAVE_WAVE_CURVE]>1))
// Item_Index[SAVE_WAVE_CURVE]--; //波形文件序號號-1
// if(Key_Buffer==KEYCODE_MANU){ //按'M'鍵
// Update[SAVE_WAVE_CURVE]=0;
// Cursor_Counter=0;
// Char_to_Str(FileNum, Item_Index[SAVE_WAVE_CURVE]);
// if(FAT_Info()==0){
// if(Open_File(FileNum)==0){
// for(i=0; i<300; ++i) {
// SectorBuff[i+2]=View_Buffer[i];
// }
// SectorBuff[0]=0;
// SectorBuff[1]=0;
// SectorBuff[302]=(unsigned char)Item_Index[Y_SENSITIVITY];
// SectorBuff[303]=(unsigned char)Item_Index[X_SENSITIVITY];
// if(Write_File()==0){
// Item_Index[LOAD_WAVE_CURVE]=Item_Index[SAVE_WAVE_CURVE]; //將當(dāng)前寫入的文件序號定為讀取文件序號缺省值
// if(Item_Index[SAVE_WAVE_CURVE]<255){
// Item_Index[SAVE_WAVE_CURVE]++;
// }
// Update[SAVE_WAVE_CURVE]=1;
// } else Display_Str(89,2,WHITE,PRN,"!FileWriteErr!");
// } else Display_Str(89,2,WHITE,PRN,"!File NoPlace!");
// } else Display_Str(89,2,WHITE,PRN,"!Micro SD Err!");
// }
} else {
Item=OUTPUT_FREQUENCY; //若無SD卡,則指向'頻率輸出設(shè)定'
}
break;
// case LOAD_WAVE_CURVE:
// if(SD_Card_ON()==0){
// if(Key_Buffer==KEYCODE_UP) Item=SAVE_WAVE_CURVE;
// if(Key_Buffer==KEYCODE_DOWN) Item=OUTPUT_FREQUENCY;
// if((Key_Buffer==KEYCODE_RIGHT)&&(Item_Index[LOAD_WAVE_CURVE]<255))
// Item_Index[LOAD_WAVE_CURVE]++; //波形文件序號號+1
// if((Key_Buffer==KEYCODE_LEFT)&&((Item_Index[LOAD_WAVE_CURVE])>1))
// Item_Index[LOAD_WAVE_CURVE]--; //波形文件序號號-1
// if(Key_Buffer==KEYCODE_MANU) { //按'M'鍵
// Erase_Wave(MODEL);
// Update[LOAD_WAVE_CURVE]=0;
// Cursor_Counter=0;
// Char_to_Str(FileNum, Item_Index[LOAD_WAVE_CURVE]);
// if(FAT_Info()==0){
// if(Open_File(FileNum)==0){
// if(Read_File()==0){
// for(i=0; i<300; ++i) {
// Ref_Buffer[i]=SectorBuff[i+2];
// }
// if(SectorBuff[302]<12){
// Item_Index[Y_SENSITIVITY]=SectorBuff[302];
// }else{
// Item_Index[Y_SENSITIVITY]=4;
// }
// if(SectorBuff[303]<22){
// Item_Index[X_SENSITIVITY]=SectorBuff[303];
// }else{
// Item_Index[X_SENSITIVITY]=8;
// }
// } else Display_Str(89,2,WHITE,PRN,"!File ReadErr!");
// } else Display_Str(89,2,WHITE,PRN,"!File NoFound!");
// } else Display_Str(89,2,WHITE,PRN,"!Micro SD Err!");
// Hide_Ref=0;//;顯示新參考樣本波形
// }
// } else Item=OUTPUT_FREQUENCY; //若無SD卡,則指向'頻率輸出設(shè)定'
// break;
case OUTPUT_FREQUENCY:
if(Key_Buffer==KEYCODE_UP) {
if(SD_Card_ON()==0) Item=LOAD_WAVE_CURVE;
else Item=INPUT_ATTENUATOR; //若無SD卡,則指向'輸入衰減選擇'
}
if(Key_Buffer==KEYCODE_DOWN) Item=X_VERNIER_2;
if((Key_Buffer==KEYCODE_RIGHT)&&(Item_Index[OUTPUT_FREQUENCY]<15))
Item_Index[OUTPUT_FREQUENCY]++; //基準(zhǔn)頻率輸出提高一檔
if((Key_Buffer==KEYCODE_LEFT)&&(Item_Index[OUTPUT_FREQUENCY]>0))
Item_Index[OUTPUT_FREQUENCY]--; //基準(zhǔn)頻率輸出降低一檔
break;
case X_VERNIER_2:
if(Key_Buffer==KEYCODE_UP) Item=OUTPUT_FREQUENCY;
if(Key_Buffer==KEYCODE_DOWN) Item=X_VERNIER_1;
if(Key_Buffer==KEYCODE_MANU){
Hide_t2=1-Hide_t2; //(顯示/消隱)水平測量游標(biāo)T2
Erase_Ti(t2);
}
if((Key_Buffer==KEYCODE_RIGHT)&&(t2<MAX_X)) { //時間測量游標(biāo)線2右移
Erase_Dot_ti(t2);
Erase_Ti(t2);
t2++;
Hide_t1=0;
Hide_t2=0;
}
if((Key_Buffer==KEYCODE_LEFT)&&(t2>MIN_X+1)) { //時間測量游標(biāo)線2左移
Erase_Dot_ti(t2);
Erase_Ti(t2);
t2--;
Hide_t1=0;
Hide_t2=0;
}
Update[DELTA_T]=1;
Update[VERNIERS]=1;
break;
case X_VERNIER_1:
if(Key_Buffer==KEYCODE_UP) Item=X_VERNIER_2;
if(Key_Buffer==KEYCODE_DOWN) {
Item=X_POSITION;
Draw_View_Area();
}
if(Key_Buffer==KEYCODE_MANU){
Hide_t1=1-Hide_t1; //(顯示/消隱)水平測量游標(biāo)T1
Erase_Ti(t1);
}
if((Key_Buffer==KEYCODE_RIGHT)&&(t1<MAX_X)) { //時間測量游標(biāo)線1右移
Erase_Dot_ti(t1);
Erase_Ti(t1);
t1++;
Hide_t1=0;
Hide_t2=0;
}
if((Key_Buffer==KEYCODE_LEFT)&&(t1>MIN_X+1)) { //時間測量游標(biāo)線1左移
Erase_Dot_ti(t1);
Erase_Ti(t1);
t1--;
Hide_t1=0;
Hide_t2=0;
}
Update[DELTA_T]=1;
Update[VERNIERS]=1;
break;
case X_POSITION:
if(Key_Buffer==KEYCODE_UP) {
Item=X_VERNIER_1;
Erase_View_Area();
}
if(Key_Buffer==KEYCODE_DOWN){
Item=Y_VERNIER_2;
Update[Y_VERNIER_2]=1;
Erase_View_Area();
}
if(Key_Buffer==KEYCODE_RIGHT){
Stop=0;
Item_Index[X_POSITION]++; //水平顯示窗口位置右移
Draw_View_Area();
}
if(Key_Buffer==KEYCODE_LEFT){
Stop=0;
Item_Index[X_POSITION]--; //水平顯示窗口位置左移
Draw_View_Area();
}
Update[VERNIERS]=1;
break;
case RUNNING_STATUS:
if(Key_Buffer==KEYCODE_UP) Item=X_POSITION;
if(Key_Buffer==KEYCODE_LEFT) Item =Y_VERNIER_2;
break;
case Y_VERNIER_2:
if(Key_Buffer==KEYCODE_RIGHT) {
Item=X_POSITION;
Draw_View_Area();
}
if(Key_Buffer==KEYCODE_LEFT) Item=Y_VERNIER_1;
if(Key_Buffer==KEYCODE_MANU){
Hide_v2=1-Hide_v2; //(顯示/消隱)垂直測量游標(biāo)V2。
Erase_Vi(v2);
}
if((Key_Buffer==KEYCODE_UP)&&(v2<MAX_Y)){
Erase_Dot_vi(v2);
Erase_Vi(v2);
v2++; //垂直測量游標(biāo)V2上移
}
if((Key_Buffer==KEYCODE_DOWN)&&(v2>MIN_Y+1)){
Erase_Dot_vi(v2);
Erase_Vi(v2);
v2--; //垂直測量游標(biāo)V2下移
}
Update[VERNIERS]=1;
break;
case Y_VERNIER_1:
if(Key_Buffer==KEYCODE_RIGHT) Item=Y_VERNIER_2; //指向'垂直測量游標(biāo)V2調(diào)整'模式
if(Key_Buffer==KEYCODE_LEFT) Item=TRIG_LEVEL; //指向'觸發(fā)電平設(shè)定'模式
if(Key_Buffer==KEYCODE_MANU){
Hide_v1=1-Hide_v1; //(顯示/消隱)垂直測量游標(biāo)V1。
Erase_Vi(v1);
}
if((Key_Buffer==KEYCODE_UP)&&(v1<MAX_Y)){
Erase_Dot_vi(v1);
Erase_Vi(v1);
v1++; //垂直測量游標(biāo)V2上移
}
if((Key_Buffer==KEYCODE_DOWN)&&(v1>MIN_Y+1)){
Erase_Dot_vi(v1);
Erase_Vi(v1);
v1--; //垂直測量游標(biāo)V2下移
}
Update[VERNIERS]=1;
break;
case TRIG_LEVEL:
if(Key_Buffer==KEYCODE_RIGHT) Item=Y_VERNIER_1;
if(Key_Buffer==KEYCODE_LEFT) Item=SYNC_MODE;
if(Key_Buffer==KEYCODE_MANU) Hide_vt=1-Hide_vt; //(顯示/消隱)觸發(fā)電平基線
if((Key_Buffer==KEYCODE_UP)&&(vt<(MAX_Y-Item_Index[TRIG_SENSITIVITY]))){
Erase_Dot_vt();
Erase_Vn(vt);
vt++; //觸發(fā)電平游標(biāo)Vt上移
}
if((Key_Buffer==KEYCODE_DOWN)&&(v1>(MIN_Y+5+Item_Index[TRIG_SENSITIVITY]))){
Erase_Dot_vt();
Erase_Vn(vt);
vt--; //觸發(fā)電平游標(biāo)Vt下移
}
break;
}
Key_Buffer=0;
}
}
}
/*******************************************************************************
* Function Name : fputc
* Description : 重定義C語言的fprint函數(shù)
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int fputc(int ch,FILE *f)
{
/* Write a character to the USART */
USART_SendData(USART1, (unsigned char) ch);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
return ch;
}
/******************* (C) COPYRIGHT 2012 DQ.elc *****END OF FILE****/
復(fù)制代碼
作者:
bg2ixd
時間:
2016-11-15 18:40
下來學(xué)習(xí),祝樓主早日成功。
作者:
bg2ixd
時間:
2016-11-15 18:41
謝謝樓主分享
作者:
涼白開_-
時間:
2019-4-16 17:49
感謝分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1