|
基于STM32虚拟示波器,有兴趣可以看看,附件里面包含全部的制作资料
1. 分析仪功能介绍
以“低成本和高性能”为设计思想,借助虚拟仪器的概念和高速的数字信号处理算法将
传统的函数发生器、示波器、数据记录仪、频率计、谱分析仪以及滤波器设计和仿真等功能
高度集成、统一平台方便使用。
软件环境支持声卡、USB 模块和虚拟仿真,三种模式。声卡模式,可以借助电脑的声
卡来完成对音频范围内信号的分析和处理;USB 模块,可以完成对带宽允许内的信号的分
析和处理;其中演示模式采用软件模拟来实现所有的功能,便于教学和理论的演示。
公开软件通信协议,可以按照协议将自己的硬件加入我们的软件环境,使用所有的分析
功能。
函数发生器
支持产生“正弦波”、“三角波”、“矩形波”、“上锯齿波”、“下锯齿波”、“白噪声”和“合
成波形”,并提供峰值、频率、输出相位差的调整功能。
波形文件输出,可以支持“正弦波”、“三角波”、“矩形波”、“上锯齿波”、“下锯齿波”、
“白噪声”和“合成波形”,提供峰值、频率、输出相位差的调整功能,支持以wav、txt、
hex 和mif 文件形式的输出。
示波器/谱分析仪
可以工作在“声卡”、“USB 模块”、“仿真”和“串口捕获”四种模式。支持任意多画
面的同时显示,便于波形的多样分析;支持输入波形硬件和软件触发;支持输入波形的插值
和等效采样;支持输入波形的“相加”、“相减”和“相乘”合成;支持对输入波形加“矩形
窗”、“三角窗”、“海明窗”、“汉宁窗”和“布莱克曼窗”;支持对输入波形的滤波处理; 支
持对输入波形的“李萨茹图形”、“幅频”、“相频”、“对数幅频”、“自功率谱”、“对数自功率
谱”、“自相关”和“互相关”的分析。
说明:本协议中B 代表 bit,即8B=1 字节
1.重启序列
改序列用于整个下位机的重启,收到该序列后,需重新握手,其过程如下:
PC ---------->0xff,0xff,0xff,0xff,0xff,0x11,0x22,0x33,0x44,0x55
0xff,0xff,0xff,0xff,0xff,0x11,0x22,0x33,0x44,0x55<-------------CE
2.握手
握手用于上位机和下位机的相互识别过程。其过程如下:
PC ---------->XX XX XX XX XX (5 个随机数)
XX XX XX XX XX (5 个随机数) <-------------CE
PC---------->XX XX XX XX XX XX XX XX XX XX (上面10 个随机数)
版本信息 <-------------CE
PC----------> AA
(握手成功) 55 <-------------CE
版本信息(32B):
static const unsigned char banben[]=
{ ‘Y’,’i’,’X’,’i’,’n’,’g’,’d’,’i’,’a’,’n’,’z’,‘i’, 0, 0, 0, 0,
‘S’,’t’,’u‘,’-’,’0’ ‘.’, ‘1’, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
3.控制
控制协议用于PC 控制下位机工作和获得一些必要的信息。包含两种格式,第一种:“PC
控制特定通道”用于 PC 控制通道 ID 指定的下位机通道;第二种:“PC 控制所有通道”用
于 PC 控制下位机中支持的所有通道。例如发送 0x01,0x01,0x00 表示开启通道 0x01;发送
0xff,0x12,0x00 表示要求下位机的所有通道开始采集数据,并上传。
需要说明的是,假如你有两个通道,则这两个通道的ID,默认为0x01 和0x02。PC 就
用这两个ID 两控制下位机响应的通道。
3.1 控制信息格式
PC 控制特定通道:
通道ID(8B) 控制码(8B) 控制信息(32B) 附加信息
PC 控制所有通道:
通道ID (0xFF) 控制码(8B) 控制信息(32B) 附加信息
3.2 控制码
开启 控制码 01
关闭 控制码 10
通道数 控制码 02
采样位数 控制码 04
采样符号 控制码 08
采集并上传数据 控制码 12
3.3 CE 应答信息格式:
通道ID(8B) 应答码(8B) 应答信息(32B) 附加信息
成功 应答码 01
失败 应答码 10
例如:
通道数 控制码 02 回复信息: 0xFF(8B) 0x01(8B) 0x00000002(32B)
通道ID:所有通道 应答码:成功 应答信息:2 个通道
采样位数 控制码 04 回复信息: 0xFF(8B) 0x01(8B) 0x00000008(32B)
通道ID:所有通道 应答码:成功 应答信息:8 位
采样符号 控制码 08 回复信息: 0xFF(8B) 0x01(8B) 0x00000001(32B)
通道ID:所有通道 应答码:成功 应答信息:有符号 1,无符号0
4.数据传输
数据传输格式(CE---->PC)
通道数N(8B) 放大倍数 (N *32B) 偏置 (N *32B) 数据长度32B) 数据(n*8B)
下位机传输采集数据的格式,通道数N 表示这次传输中的通道个数,N 个通道ID 的表
示后面的数据,各个通道的排列顺序,放大倍数,表示这次数据 N 个通道的每个的放大倍
数是多少。数据长度表示后面有多少字节数据。
例如:
0x02 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x00
两个通道 通道 0x01 放大 1 倍 通道 0x02 放大2 倍 通道 0x01 偏置
0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00
通道 0x01 偏置 256 字节数据
0x11 0xA3 0x12 0x43………
通道 0x01 数据 通道0x02 数据 通道 0x01 数据 通道0x02 数据
- /*
- * Copyright (c) 2010 仪星电子
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- /*
- * 著作权所有(C) 2010 仪星电子
- *
- * 本程序为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,
- * 就本程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)
- * 任一日后发行的版本。
- * 本程序是基于使用目的而加以发布,然而不负任何担保责任;亦无对适售性或特定
- * 目的适用性所为的默示性担保。详情请参照GNU通用公共授权。
- * 您应已收到附随于本程序的GNU通用公共授权的副本;如果没有,请写信至自由软件
- * 基金会:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA。
- * Email yixingdianzi@126.com
- * Email/MSN yixingdianzi@hotmail.com
- * QQ 648887464
- */
- /******************** (C) COPYRIGHT 2009 STMicroelectronics ********************
- * File Name : main.c
- * Author : MCD Application Team
- * Version : V3.1.0
- * Date : 10/30/2009
- * Description : Virtual Com Port Demo main file
- ********************************************************************************
- * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
- * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
- * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
- * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
- * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
- * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
- *******************************************************************************/
- /* Includes ------------------------------------------------------------------*/
- #include "stm32f10x.h"
- #include "stm32f10x_gpio.h"
- #include "usb_lib.h"
- #include "usb_desc.h"
- #include "usb_pwr.h"
- #include "qdmx_usb.h"
- #include "qdmx_adc.h"
- #define SEND 32
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- /* Extern variables ----------------------------------------------------------*/
- extern __IO uint32_t count_in;
- extern uint8_t Controla_a;
- extern uint8_t Controla_b;
- /* Private function prototypes -----------------------------------------------*/
- /* Private functions ---------------------------------------------------------*/
- void Set_System(void);
- void Callback(uint8_t *p);
- void Delay(__IO uint32_t nCount);
- void GPIO_configure(void);
- /*******************************************************************************
- * Function Name : main.
- * Description : Main routine.
- * Input : None.
- * Output : None.
- * Return : None.
- *******************************************************************************/
- int main(void)
- {
- vu8 s;
- /*设置系统时钟*/
- Set_System();
-
- /*初始化USB模块*/
- Set_USBClock();
- USB_Interrupts_Config();
- USB_Init();
- /*初始化AD模块*/
- m_adc_clk_config();
- m_adc_gpio_config();
- m_adc_Interrupts_Config();
- m_adc_init();
- /*初始化GPIO引脚作为放大控制引脚*/
- GPIO_configure();
-
- count_in=0;
- /*默认初始值为放大1倍*/
- GPIO_ResetBits(GPIOA,GPIO_Pin_0);
- GPIO_ResetBits(GPIOA,GPIO_Pin_1);
- GPIO_ResetBits(GPIOA,GPIO_Pin_2);
- GPIO_ResetBits(GPIOB,GPIO_Pin_12);
- GPIO_ResetBits(GPIOB,GPIO_Pin_13);
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);
- while (1)
- {
- }
- }
- void GPIO_configure(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
-
- RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
- RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- void Delay(__IO uint32_t nCount)
- {
- for(; nCount != 0; nCount--);
- }
- void Callback(uint8_t *p)
- {
- if (GetENDPOINT(ENDP1) & EP_DTOG_RX)
- {
- FreeUserBuffer(ENDP1, EP_DBUF_IN);
- UserToPMABufferCopy((uint8_t*) p, ENDP1_TX1ADDR, SEND);
- SetEPDblBuf1Count(ENDP1,EP_DBUF_IN,SEND);
- }
- else
- {
- FreeUserBuffer(ENDP1, EP_DBUF_IN);
- UserToPMABufferCopy((uint8_t*) p, ENDP1_TX0ADDR, SEND);
- SetEPDblBuf0Count(ENDP1,EP_DBUF_IN,SEND);
- }
- }
- #ifdef USE_FULL_ASSERT
- /*******************************************************************************
- * Function Name : assert_failed
- * Description : Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * Input : - file: pointer to the source file name
- * - line: assert_param error line source number
- * Output : None
- * Return : None
- *******************************************************************************/
- void assert_failed(uint8_t* file, uint32_t line)
- {
- /* User can add his own implementation to report the file name and line number,
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- /* Infinite loop */
- while (1)
- {}
- }
- #endif
- /*******************************************************************************
- * Function Name : Set_System
- * Description : Configures Main system clocks & power
- * Input : None.
- * Return : None.
- *******************************************************************************/
- void Set_System(void)
- {
- ErrorStatus HSEStartUpStatus;
- /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
- /* RCC system reset(for debug purpose) */
- RCC_DeInit();
- /* Enable HSE */
- RCC_HSEConfig(RCC_HSE_ON);
- /* Wait till HSE is ready */
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if (HSEStartUpStatus == SUCCESS)
- {
- /* Enable Prefetch Buffer */
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
- /* Flash 2 wait state */
- FLASH_SetLatency(FLASH_Latency_2);
-
- /* HCLK = SYSCLK */
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
-
- /* PCLK2 = HCLK */
- RCC_PCLK2Config(RCC_HCLK_Div1);
- /* PCLK1 = HCLK/2 */
- RCC_PCLK1Config(RCC_HCLK_Div2);
- #ifdef STM32F10X_CL
- /* Configure PLLs *********************************************************/
- /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
- RCC_PREDIV2Config(RCC_PREDIV2_Div5);
- RCC_PLL2Config(RCC_PLL2Mul_8);
- /* Enable PLL2 */
- RCC_PLL2Cmd(ENABLE);
- /* Wait till PLL2 is ready */
- while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
- {}
- /* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */
- RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
- RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
- #else
- /* PLLCLK = 8MHz * 9 = 72 MHz */
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
- #endif
- /* Enable PLL */
- RCC_PLLCmd(ENABLE);
- /* Wait till PLL is ready */
- while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
- {
- }
- /* Select PLL as system clock source */
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- /* Wait till PLL is used as system clock source */
- while(RCC_GetSYSCLKSource() != 0x08)
- {
- }
- }
- else
- { /* If HSE fails to start-up, the application will have wrong clock configuration.
- User can add here some code to deal with this error */
- /* Go to infinite loop */
- while (1)
- {
- }
- }
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
资料下载:
|
-
-
STM32F103C8源工程.7z
236.57 KB, 下载次数: 316, 下载积分: 黑币 -5
-
-
多功能虚拟信号分析仪.rar
1.47 MB, 下载次数: 223, 下载积分: 黑币 -5
-
-
驱动.rar
2.26 KB, 下载次数: 186, 下载积分: 黑币 -5
-
-
使用说明书.rar
1.06 MB, 下载次数: 192, 下载积分: 黑币 -5
-
-
学习版协议.rar
113.39 KB, 下载次数: 176, 下载积分: 黑币 -5
-
-
原理图.rar
45.43 KB, 下载次数: 254, 下载积分: 黑币 -5
评分
-
查看全部评分
|