日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀] 注:此STM32單片機為STM32F103系列的Stm32的ADC有DMA功能這都毋庸置疑,也是我們用的最多的!然而,如果我們要對一個信號(比如脈搏信號)進行定時采樣(也就是隔一段時間,比如說2ms),有三種方法:1、

 

注:此STM32單片機為STM32F103系列的
Stm32的ADC有DMA功能這都毋庸置疑,也是我們用的最多的!然而,如果我們要對一個信號(比如脈搏信號)進行定時采樣(也就是隔一段時間,比如說2ms),有三種方法:

1、使用定時器中斷每隔一定時間進行ADC轉(zhuǎn)換,這樣每次都必須讀ADC的數(shù)據(jù)寄存器,非常浪費時間!

2、把ADC設(shè)置成連續(xù)轉(zhuǎn)換模式,同時對應的DMA通道開啟循環(huán)模式,這樣ADC就一直在進行數(shù)據(jù)采集然后通過DMA把數(shù)據(jù)搬運至內(nèi)存。但是這樣做的話還得加一個定時中斷,用來定時讀取內(nèi)存中的數(shù)據(jù)!

3、使用ADC的定時器觸發(fā)ADC轉(zhuǎn)換的功能,然后使用DMA進行數(shù)據(jù)的搬運!這樣只要設(shè)置好定時器的觸發(fā)間隔,就能實現(xiàn)ADC定時采樣轉(zhuǎn)換的功能,然后可以在程序的死循環(huán)中一直檢測DMA轉(zhuǎn)換完成標志,然后進行數(shù)據(jù)的讀取,或者使能DMA轉(zhuǎn)換完成中斷,這樣每次轉(zhuǎn)換完成就會產(chǎn)生中斷,我是采用第二種方法。下面上代碼:我這里使用的單通道
//定時器初始化
voidTIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseStructure.TIM_Period=1999;//設(shè)置2ms一次TIM2比較的周期
TIM_TimeBaseStructure.TIM_Prescaler=71;//系統(tǒng)主頻72M,這里分頻71,相當于1000K的定時器2時鐘
TIM_TimeBaseStructure.TIM_ClockDivision=0x0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//下面詳細說明
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse=1000;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//如果是PWM1要為Low,PWM2則為High
TIM_OC2Init(TIM2,&TIM_OCInitStructure);
//TIM_InternalClockConfig(TIM2);
//TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
//TIM_UpdateDisableConfig(TIM2,DISABLE);
}
//ADC_DMA初始化配置
voidADC_DMA_Config(void)
{
DMA_InitTypeDefDMA_InitStructure;//注:ADC為12位模數(shù)轉(zhuǎn)換器,只有ADCConvertedValue的低12位有效
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA時鐘
DMA_DeInit(DMA1_Channel1);//開啟DMA1的第一通道
DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;//DMA對應的外設(shè)基地址
DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&ADCConvertedValue;//內(nèi)存存儲基地址
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//DMA的轉(zhuǎn)換模式為SRC模式,由外設(shè)搬移到內(nèi)存
DMA_InitStructure.DMA_BufferSize=1;//DMA緩存大小,1個
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//接收一次數(shù)據(jù)后,設(shè)備地址禁止后移
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;//關(guān)閉接收一次數(shù)據(jù)后,目標內(nèi)存地址后移
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//定義外設(shè)數(shù)據(jù)寬度為16位
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//DMA搬移數(shù)據(jù)尺寸,HalfWord就是為16位
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//循環(huán)轉(zhuǎn)換模式
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA優(yōu)先級高
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//M2M模式禁用
DMA_Init(DMA1_Channel1,&DMA_InitStructure);
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);//使能傳輸完成中斷
}
//ADC初始化
voidPulseSenosrInit(void)
{
//當外部觸發(fā)信號被選為ADC規(guī)則或注入轉(zhuǎn)換時,只有它的上升沿可以啟動轉(zhuǎn)換
ADC_InitTypeDefADC_InitStructure;
ADC_GPIO_Configuration();//IO口配置
TIM2_Configuration();//定時器配置
ADC_DMA_Config();//ADC_DMA配置
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//獨立的轉(zhuǎn)換模式ADC_DUALMOD[3:0]=0000;
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//關(guān)閉掃描模式因為只有一個通道
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//關(guān)閉連續(xù)轉(zhuǎn)換模式否則只要觸發(fā)一次,
//后續(xù)的轉(zhuǎn)換就會永不停歇(除非CONT清0),這樣第一次以后的ADC,就不是由TIM2_CC2來觸發(fā)了
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T2_CC2;//軟件轉(zhuǎn)換模式
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//對齊方式,ADC為12位中,右對齊方式ADC_ALIGN=0;
ADC_InitStructure.ADC_NbrOfChannel=1;//開啟通道數(shù),1個ADC_SQR1[23:20]=0000;
//ADC_SQR1[23:20]設(shè)置通道數(shù)目的選擇
ADC_Init(ADC1,&ADC_InitStructure);
//RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置時鐘(12MHz),在RCC里面還應配置APB2=AHB時鐘72MHz

ADC_RegularChannelConfig(ADC1,ADC_Channel_2,1,ADC_SampleTime_1Cycles5);
//ADC_SMPR2ADC_SMPR1設(shè)置每個通道的采樣時間
//ADC_SQR1[19:0]?DC_SQR1[29:0]?DC_SQR3[29:0]設(shè)置對應通道的轉(zhuǎn)換順序適用于多通道采樣
//ADC通道組,第3個通道采樣順序1,轉(zhuǎn)換時間
ADC_ExternalTrigConvCmd(ADC1,ENABLE);//設(shè)置外部觸發(fā)模式使能(這個“外部“其實僅僅是相//對于ADC模塊的外部,

ADC_DMACmd(ADC1,ENABLE);

ADC_Cmd(ADC1,ENABLE);//ADC命令,使能ADC_ADON=1

ADC_ResetCalibration(ADC1);//重新校準

while(ADC_GetResetCalibrationStatus(ADC1));//等待重新校準完成

ADC_StartCalibration(ADC1);//開始校準ADC_RSTCAL=1;初始化校準寄存器

while(ADC_GetCalibrationStatus(ADC1));//等待校準完成ADC_CAL=0;

//ADC_SoftwareStartConvCmd(ADC1,ENABLE);//連續(xù)轉(zhuǎn)換開始,ADC通過DMA方式不斷的更新RAM區(qū)。
//ADC_SWSTART=1開始規(guī)則轉(zhuǎn)換切記軟件觸發(fā)也屬于外部事件要設(shè)置ADC_EXTTRIG=1
//////實際上還是在STM32內(nèi)部)
TIM_Cmd(TIM2,ENABLE);//最后面打開定時器使能
DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA
}
//中斷處理函數(shù)
voidDMA1_Channel1_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC1)!=RESET){
//自己的中斷處理代碼但是記住程序不要太復雜最好不要超過中斷時間
DMA_ClearITPendingBit(DMA1_IT_TC1);
}
}
//中斷配置
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
voidADC_GPIO_Configuration(void)//ADC配置函數(shù)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);//使能ADC和GPIOA時鐘
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//管腳2
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入模式
GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIO組
}

 

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

單片機定時器通過晶振頻率來產(chǎn)生精準的計數(shù)脈沖,從而實現(xiàn)微秒級別的時間控制。 單片機定時器依托于一個穩(wěn)定的計數(shù)器,該計數(shù)器與單片機上的晶振部件相連。晶振經(jīng)過12分頻后,為單片機提供穩(wěn)定且精準的1MHZ脈沖。由于晶振的頻率極...

關(guān)鍵字: 單片機 定時器

編碼器?是一種傳感器,主要用于測量旋轉(zhuǎn)運動的角度、角速度和位移等參數(shù)。常見的編碼器類型包括增量式編碼器和絕對值編碼器,前者通過檢測脈沖的增加或減少來測量旋轉(zhuǎn)方向和距離,后者則直接輸出當前的絕對位置信息?。

關(guān)鍵字: 編碼器? 定時器

一款語音控制的番茄時間定時器,內(nèi)置Seeed Studio XIAO ESP32S3感測和圓形顯示。用免提時間管理保持高效!

關(guān)鍵字: 定時器 ESP32S3 語音控制

【2025年3月20日, 德國慕尼黑訊】全球功率系統(tǒng)和物聯(lián)網(wǎng)領(lǐng)域的半導體領(lǐng)導者英飛凌科技股份公司(FSE代碼:IFX / OTCQX代碼: IFNNY)近日宣布,其旗下ModusToolboxTM開發(fā)平臺中的AIROC?...

關(guān)鍵字: MCU 物聯(lián)網(wǎng) 定時器

眾所周知,說到延時,很多人都會想到用軟件件來實現(xiàn),比如定時器之類的。今天就來說說用硬件來實現(xiàn)定時的方式,雖說沒有那么準,但是有些場合還是用得到的。

關(guān)鍵字: CD4060 定時器

如果定時器的重裝值和分頻設(shè)置不正確,會導致PWM輸出的頻率和占空比不準確,從而產(chǎn)生誤差?1。

關(guān)鍵字: 定時器 分頻

SysTick定時器的工作原理主要基于一個遞減計數(shù)器的機制。以下是對SysTick定時器工作原理的詳細解釋:

關(guān)鍵字: SysTick 定時器

單片機定時器是一種用于計時和定時操作的功能模塊。它通常用于生成延時、計數(shù)事件以及產(chǎn)生精確的時間間隔信號。

關(guān)鍵字: 定時器 時鐘源

在現(xiàn)代嵌入式系統(tǒng)設(shè)計中,51單片機作為一種經(jīng)典的微控制器,憑借其豐富的功能和廣泛的應用領(lǐng)域,仍然受到工程師們的青睞。定時器中斷是51單片機中一個非常實用的功能,它可以在特定的時間間隔內(nèi)自動觸發(fā)中斷,執(zhí)行預設(shè)的操作,從而提...

關(guān)鍵字: 51單片機 定時器

Holtek新推出BS67F2432具備觸控按鍵、高精準度HIRC與LCD驅(qū)動器Flash MCU。主要特色為內(nèi)建高精準度4MHz HIRC振蕩電路、8路觸控按鍵及最大支持4COM×15SEG LCD驅(qū)動器。適用于觸控接...

關(guān)鍵字: MCU LCD驅(qū)動器 定時器
關(guān)閉