标题:
stm32示波器制作资料
[打印本页]
作者:
51hei学习技术中
时间:
2016-11-15 12:20
标题:
stm32示波器制作资料
最近想玩玩stm32的ad功能,看到网上ds0201的示波器是开源的!淘宝的店主也很热情,给了我1.1版的源代码
是IAR编译器
我把它移植到KEIL下,为了提高速度,我使用fsmc方式驱动lcd显示
现在还有点小问题,正在解决中。。(波形有点重叠)
资料下载:
stm32示波器.zip
(2.36 MB, 下载次数: 110)
2016-11-15 12:20 上传
点击文件名下载附件
下载积分: 黑币 -5
ds0201.rar
(20.64 KB, 下载次数: 69)
2016-11-15 12:20 上传
点击文件名下载附件
下载积分: 黑币 -5
主程序预览:
/**************************************************************
DQ-STM32开发板试验程序
2.4寸 示波器显示实例(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(); /* 系统时钟初始化 */
NVIC_Configuration(); /*GPIO端口配置*/
GPIO_Configuration();
DMA_Configuration();
ADC_Configuration();
Timer_Configuration();
USART_Configuration(); /* 串口初始化 */
LCD_Initial(); /*液晶初始化*/
Clear_Screen(BLACK); //清屏幕
Display_Logo(30,150);
/*----------显示开机提示信息页面----------*/
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 示波器实验 ! \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(); //显示背景网格
Display_Frame();
/* 主循环 */
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种状态
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]++; //降低触发灵敏度
}
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]--; //提高触发灵敏度
}
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]; //选择(上升沿触发/下降沿触发)
}
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卡,则指向'频率输出设定'
}
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]; //将当前写入的文件序号定为读取文件序号缺省值
// 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卡,则指向'频率输出设定'
}
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卡,则指向'频率输出设定'
// 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]++; //基准频率输出提高一档
if((Key_Buffer==KEYCODE_LEFT)&&(Item_Index[OUTPUT_FREQUENCY]>0))
Item_Index[OUTPUT_FREQUENCY]--; //基准频率输出降低一档
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; //(显示/消隐)水平测量游标T2
Erase_Ti(t2);
}
if((Key_Buffer==KEYCODE_RIGHT)&&(t2<MAX_X)) { //时间测量游标线2右移
Erase_Dot_ti(t2);
Erase_Ti(t2);
t2++;
Hide_t1=0;
Hide_t2=0;
}
if((Key_Buffer==KEYCODE_LEFT)&&(t2>MIN_X+1)) { //时间测量游标线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; //(显示/消隐)水平测量游标T1
Erase_Ti(t1);
}
if((Key_Buffer==KEYCODE_RIGHT)&&(t1<MAX_X)) { //时间测量游标线1右移
Erase_Dot_ti(t1);
Erase_Ti(t1);
t1++;
Hide_t1=0;
Hide_t2=0;
}
if((Key_Buffer==KEYCODE_LEFT)&&(t1>MIN_X+1)) { //时间测量游标线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; //(显示/消隐)垂直测量游标V2。
Erase_Vi(v2);
}
if((Key_Buffer==KEYCODE_UP)&&(v2<MAX_Y)){
Erase_Dot_vi(v2);
Erase_Vi(v2);
v2++; //垂直测量游标V2上移
}
if((Key_Buffer==KEYCODE_DOWN)&&(v2>MIN_Y+1)){
Erase_Dot_vi(v2);
Erase_Vi(v2);
v2--; //垂直测量游标V2下移
}
Update[VERNIERS]=1;
break;
case Y_VERNIER_1:
if(Key_Buffer==KEYCODE_RIGHT) Item=Y_VERNIER_2; //指向'垂直测量游标V2调整'模式
if(Key_Buffer==KEYCODE_LEFT) Item=TRIG_LEVEL; //指向'触发电平设定'模式
if(Key_Buffer==KEYCODE_MANU){
Hide_v1=1-Hide_v1; //(显示/消隐)垂直测量游标V1。
Erase_Vi(v1);
}
if((Key_Buffer==KEYCODE_UP)&&(v1<MAX_Y)){
Erase_Dot_vi(v1);
Erase_Vi(v1);
v1++; //垂直测量游标V2上移
}
if((Key_Buffer==KEYCODE_DOWN)&&(v1>MIN_Y+1)){
Erase_Dot_vi(v1);
Erase_Vi(v1);
v1--; //垂直测量游标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; //(显示/消隐)触发电平基线
if((Key_Buffer==KEYCODE_UP)&&(vt<(MAX_Y-Item_Index[TRIG_SENSITIVITY]))){
Erase_Dot_vt();
Erase_Vn(vt);
vt++; //触发电平游标Vt上移
}
if((Key_Buffer==KEYCODE_DOWN)&&(v1>(MIN_Y+5+Item_Index[TRIG_SENSITIVITY]))){
Erase_Dot_vt();
Erase_Vn(vt);
vt--; //触发电平游标Vt下移
}
break;
}
Key_Buffer=0;
}
}
}
/*******************************************************************************
* Function Name : fputc
* Description : 重定义C语言的fprint函数
* 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****/
复制代码
作者:
bg2ixd
时间:
2016-11-15 18:40
下来学习,祝楼主早日成功。
作者:
bg2ixd
时间:
2016-11-15 18:41
谢谢楼主分享
作者:
凉白开_-
时间:
2019-4-16 17:49
感谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1