本例程在 奮斗版STM32開發板V2,V2.1,V3,V5及MINI上調試通過
演示的是3個藍色LED(LED1-LED3) 輪流閃爍
定義:
LED1-LED3 ---V6——V8
V6----- PB5-LED1
V7----- PD6-LED2(僅V2,V2.1 V3 V5板)
V8----- PD3-LED3(僅V2,V2.1 V3 V5板)
下面是STM32 數字示波器的設計(pcb sch)含仿真,及源碼
硬件設計.zip
(2.65 MB, 售價: 2 E幣)
2021-8-17 11:31 上傳
點擊文件名下載附件
售價: 2 E幣 [記錄]
[ 購買]
源代碼.zip
(9.86 MB, 售價: 2 E幣)
2021-8-17 11:31 上傳
點擊文件名下載附件
售價: 2 E幣 [記錄]
[ 購買]
1.jpg (13.7 KB)
下載附件
2021-8-17 11:31 上傳
STM32 數字示波器的設計示波器AD板
1.png (108.87 KB)
下載附件
2021-8-17 11:28 上傳
示波器上層板
2.png (126.85 KB)
下載附件
2021-8-17 11:28 上傳
3.png (68.09 KB)
下載附件
2021-8-17 11:28 上傳
adc.c文件源碼:- /*---------------------------------------------------------
- ADC配置驅動程序
- 說明: 示波器AD采樣配置,經過初步測試,AD采樣速率為1.286M
- 正弦波最大不失真測量頻率300kHz
- 三角波最大不失真測量頻率150kHz
- 矩形波最大不失真測量頻率100kHz
- ---------------------------------------------------------*/
- #include "stm32f10x.h"
- #include "adc.h"
- #include "oscilloscope.h"
- #include "ucos_ii.h"
- #include "tft_api.h"
- /*-----------------------------------------
- 聲明變量
- ------------------------------------------*/
- extern WaveType WaveInfo;
- extern WaveMode WaveCtrl;
- volatile u16 ADCConvertedValue[SAMPDEPTH];//AD轉換緩沖區,占用RAM 0.8KB
- /*-----------------------------------------
- ADC1端口初始化
- ------------------------------------------*/
- void ADC1_GPIO_Init(void)
- {
- GPIO_InitTypeDef IO_Init;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC,ENABLE);
- //C1模擬輸入
- IO_Init.GPIO_Pin = GPIO_Pin_1;
- IO_Init.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOC,&IO_Init);
- }
- /* #define ADC1_DR_Address ((unsigned int)0x40012400+0x4c) */
- /* unsigned short int ADC1_DMA_Value; */
- /*--------------------------------------------------
- 函數說明:配置ADC1完成AD采集,是本示波器最核心的部分.
- 配置方案:ADC1由TIM3提供的觸發事件進行觸發AD轉換,控
- 制TIM3的速率就可以完成采樣率的改變.同時采
- 用DMA完成數據傳輸,注入通道1完成內部溫度傳
- 感器AD采集.
- --------------------------------------------------*/
- void ADC1_Mode_Config(void)
- {
- //配置DMA
- DMA_InitTypeDef DMA_csh;
- ADC_InitTypeDef ADC_csh;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- DMA_DeInit(DMA1_Channel1); //DMA復位,通道1
- DMA_csh.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC1地址
- DMA_csh.DMA_MemoryBaseAddr = (unsigned int)ADCConvertedValue; //內存地址
- DMA_csh.DMA_DIR = DMA_DIR_PeripheralSRC;
- DMA_csh.DMA_BufferSize = SAMPDEPTH; //緩沖大小為采樣深度
- DMA_csh.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設地址固定
- DMA_csh.DMA_MemoryInc = DMA_MemoryInc_Enable; //內存地址自增
- DMA_csh.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
- DMA_csh.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
- DMA_csh.DMA_Mode = DMA_Mode_Circular; //循環傳輸
- DMA_csh.DMA_Priority = DMA_Priority_High; //DMA優先級高
- DMA_csh.DMA_M2M = DMA_M2M_Disable;
- DMA_Init(DMA1_Channel1,&DMA_csh); //寫入DMA1配置參數
- DMA_Cmd(DMA1_Channel1,ENABLE); //使能DMA1通道1
- DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //使能DMA CH1中斷
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- //配置TIM3工作在18MHz,為AD提供觸發
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
- TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
- TIM_TimeBaseStructure.TIM_Period = 1;
- TIM_TimeBaseStructure.TIM_Prescaler = 99; //工作在18M,每格最大值時,不至于溢出
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
- TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update); //使用TIM3事件更新作為ADC觸發
-
- //配置ADC
- ADC_csh.ADC_Mode = ADC_Mode_Independent; //獨立ADC模式
- ADC_csh.ADC_ScanConvMode = DISABLE; //關閉掃描模式
- ADC_csh.ADC_ContinuousConvMode = DISABLE; //連續AD轉換開啟
- ADC_csh.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO; //由TIM3提供的觸發事件進行觸發AD轉換
- ADC_csh.ADC_DataAlign = ADC_DataAlign_Right; //數據右對齊
- ADC_csh.ADC_NbrOfChannel = 1; //要轉換的通道數目1
- ADC_Init(ADC1,&ADC_csh); //寫入ADC1配置參數
- ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_1Cycles5);//采樣速率1M
- ADC_DMACmd(ADC1,ENABLE); //使能ADC1 DMA
- ADC_ExternalTrigConvCmd(ADC1,ENABLE); //打開ADC1外部觸發
-
- ADC_InjectedChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5); //配置ADC1通道16為注入通道1
- ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None); //軟件觸發注入通道的轉換
- ADC_TempSensorVrefintCmd(ENABLE); //使能溫度傳感器
- ADC_Cmd(ADC1,ENABLE); //使能ADC1
- ADC_ResetCalibration(ADC1); //復位校準寄存器
- while(ADC_GetResetCalibrationStatus(ADC1)); //等待校準寄存器復位完成
- ADC_StartCalibration(ADC1); //開始校準
- while(ADC_GetCalibrationStatus(ADC1)); //等待校準完成
- TIM_Cmd(TIM3,ENABLE);
- }
- /*-----------------------------------------
- 函數說明:通過注入通道1轉換內部溫度傳感器
- AD值,讀取10次有效數據取平均返回
- ------------------------------------------*/
- u16 GetTempSensor(void)
- {
- u16 temp=0,i,k=0;
- for(i=0; i<10; )
- {
- ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE); //軟件觸發注入通道的轉換
- k = (0x6EE - ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1)) / 0x05 + 25;
- if(k>0 && k<100)
- {
- temp += k;
- i++;
- }
- }
- temp /= 10;
- return temp;
- }
- /*-----------------------------------------
- 函數說明:ADC1初始化
- ------------------------------------------*/
- void ADC1_Init(void)
- {
- ADC1_GPIO_Init();
- ADC1_Mode_Config();
- }
- /*-----------------------------------------
- 函數說明:ADC傳輸DMA通道1中斷服務程序
- DMA把AD值傳輸到緩沖區完成后關閉定
- 時器3(作為觸發AD轉換的定時器)同時
- 置更新完成標志位為1,開定時器3在應
- 用中開啟.
- ------------------------------------------*/
- void DMA1_Channel1_IRQHandler()
- {
- OSIntNesting++;
- DMA_ClearFlag(DMA1_FLAG_TC1); //清除DMA傳輸完成中斷
- TIM_Cmd(TIM3,DISABLE); //關閉TIM3
- WaveCtrl.UpdatTrue = 1; //已經完成一次波形FIFO,可以批量讀出數據
- OSIntExit();
- }
- /*-----------------------------------------
- 函數說明:擦除AD緩沖區
- ------------------------------------------*/
- void Earse_AD_FIFO(void)
- {
- uint32_t i;
- for(i=0; i<SAMPDEPTH; i++)
- {
- ADCConvertedValue[i] = 0;
- }
- }
復制代碼
主程序:- /*------------------------------------------------------------------------------------
- STM32示波器
- 硬件平臺:
- 主控器: STM32F103ZET6 64K RAM 512K ROM
- 屏幕器: SSD1963
- 分辨率: 480x272 16位色
- 觸摸屏: TSC2046
- 模擬電路: OP - TL084
- OP - u741
- SW - CD4051
- CMP - LM311
- PWR - LM7805
- - LM7905
- - MC34063
- - AMS1117-3.3
- DRI - ULN2003
- 繼電器:信號繼電器
- 電源: DC +12V
- 軟件平臺:
- 開發環境: RealView MDK-ARM uVision4.10
- C編譯器 : ARMCC
- ASM編譯器:ARMASM
- 連接器: ARMLINK
- 實時內核: uC/OS-II 2.90實時操作系統
- GUI內核 : uC/GUI 3.90圖形用戶接口
- 底層驅動: 各個外設驅動程序
-
- ROM Size = Code + RO-data +RW-data
- RAM Size = RW-data + ZI-data
- Program Size: Code=56024 RO-data=8272 RW-data=256 ZI-data=29912
- 版本: V1.0 - 2013/11/9
- V1.1 - 2014/2/8
- V3.0 - 2014/2/19
- -------------------------------------------------------------------------------------*/
- #include "stm32f10x.h"
- #include "ucos_ii.h"
- #include "app.h"
- #include "GUI.h"
- #include "usart1.h"
- #include "pincfg.h"
- #include "delay.h"
- #include "tft_api.h"
- #include "dac.h"
- #include "adc.h"
- #include "iwdg.h"
- #include "timer.h"
- #include "EXTI.H"
- #include "oscilloscope.h"
- #include "indkey.h"
- #include "tsc2046.h"
- #include "task_rtc.h"
- #include "task_gui.h"
- #include "task_sd.h"
- /*-----------------------------------------
- 聲明起始任務棧
- ------------------------------------------*/
- OS_STK Task_Start_Stk[TASK_START_STK_SIZE];
- /*-----------------------------------------
- 因為涉及到對共享資源的訪問,創建互斥信號量
- ------------------------------------------*/
- OS_EVENT *LCD_Buffer_MUTEX;
- OS_EVENT *USART_Buffer_MUTEX;
- OS_EVENT *SDtoRAM_Buffer_MUTEX;
- /*-----------------------------------------
- 主 函 數
- ------------------------------------------*/
- int main(void)
- {
- INT8U err;
- SystemInit(); //初始化RCC時鐘
- OSInit();
-
- LCD_Buffer_MUTEX = OSMutexCreate(4,&err); //創建3個共享資源互斥信號量
- USART_Buffer_MUTEX = OSMutexCreate(4,&err);
- SDtoRAM_Buffer_MUTEX = OSMutexCreate(4,&err);
-
- OSTaskCreate(Task_Start,(void *)0,&Task_Start_Stk[TASK_START_STK_SIZE-1],TASK_START_PRIO); //起始任務
-
- OSStart();
- }
- /*-------------------------------------------------------------------------------
- 函數功能:初始化各種外設
- 說 明:因為跑操作系統,所以外設的初始化應該放在操作系統的初始任務中完成,不能
- 在while(1)循環外部完成外設的初始化工作,否則操作系統可能無法啟動.
- 本函數在app.c中被調用
- -------------------------------------------------------------------------------*/
- void BSP_Init(void)
- {
- OS_CPU_SR cpu_sr = 0u;
- OS_ENTER_CRITICAL();
- DelayInit(); //初始化延時
- PinCfg(); //外部器件控制配置
- FSMC_LCD_Init(); //FSMC總線配置
- GUI_Init(); //初始化UCGUI界面
- TSC2046_Config(); //初始化觸摸控制器
- USART1_Config(); //初始化串口
- DAC_Config(); //初始化DAC1
- ADC1_Init(); //初始化ADC1
- EXTI_Config(); //初始化外部中斷
- Key_EXTI_Config(); //初始化按鍵中斷
- TIM5_Config(1999,71); //TIM5以1MHz頻率計數,每2ms溢出中斷
- // TIM4_Config(59999,71); //TIM4以1MHz頻率計數,每60ms溢出中斷
- RTC_Init(); //初始化RTC
- // SD_Init();
- JDQ_ACDC = 1; //交流耦合
- ManualGainScan(3); //調試用
- IWDG_Init(4,625); //喂狗時間為1000ms
- OS_EXIT_CRITICAL();
- }
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|