天天看點

STM32-(ADC,DMA,重映射)STM32的進階功能應用

STM32的進階功能應用

  • 進階定時器功能框圖
    STM32-(ADC,DMA,重映射)STM32的進階功能應用
  • 時鐘源

    進階定時器有四個時鐘源可以選擇:

    1.内部時鐘CK_INT

    内部時鐘源CK_INT主要來源于晶片内部,為72M,一般情況下我們都是使用内部時鐘。當從模式控制寄存器TIMx_SMCR的SMS位等于000時則使用内部時鐘。

    2.外部時鐘模式1:外部輸入引腳TIx(1,2,3,4)

    時鐘信号輸入引腳共有4個,分别是TI(1,2,3,4),及TIM_CH(1,2,3,4)具體使用那一路信号輸入引腳,由TIM_CCMRx的位CCxS[1:0]配置,其中CCMR1控制TI1/2,CCMR2控制TI3/4.

    3.外部時鐘模式2:外部觸發輸入ETR

    時鐘信号來自定時器的特定輸入通道TIMX_ETR,隻有一個。

    4.内部觸發輸入(ITRx)

    内部觸發輸入是使用一個定時器作為另一個定時器的預分頻器。硬體上進階控制定時器和通用定時器在内部連接配接在一起,可以實作定時器同步或級聯。主模式的定時器可以對從模式定時器執行複位,啟動,停止或提供時鐘。

  • 時基單元
    STM32-(ADC,DMA,重映射)STM32的進階功能應用

    進階控制寄存器的時基單元功能包括4個寄存器,分别是計數器寄存器(CNT),預分頻控制寄存器(PSC),自動重裝載寄存器(ARR)和重複計數器寄存器(RCR)。其中重複計數器RCR是進階定時器獨有,通用和基本定時器沒有。前面3個寄存器都是16位有效,TIMX_RCR寄存器是8位有效的。

    預分頻器:psc,有一個輸入時鐘CK_PSC和一個輸出時鐘CK_CNT。輸入時鐘CK_PSC就是上面時鐘源的輸出,輸出CK_CNT這用來驅動CNT計數。通過設定預分頻器PSC的值可以得到不同的CK_CNT,實際計算為:fck_cnt=fck_psc/(PSC[15:0]+1);可以實作1到65535分頻。

    通俗的了解就是:計數一次的時間。

typedef struct{
	uint16_t TIM_Prescaler;				//預分頻器
	uint16_t TIM_CounterMode;		//計數器模式
	uint16_t TIM_Period;					//定時器周期
	uint16_t TIM_ClockDivision;		//時鐘分頻
	uint8_t TIM_RepetitionCounter;	//重複電腦
}	TIM_TimeBaseInitTypeDef;

例如:
TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_Prescaler = 35;>>>t=36/(72M)=1/(2M)
TIM_TimeBaseInitStruct.TIM_Period = 1999;>>>T=1/(2M)*2000=1ms,周期1ms
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_up;>>>向上計數
TIM_TimeBaseInitStruct.TIM_ClockDivision=0;//時鐘分頻系數為0
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//重複計數器
           
  • 1.ADC采集:獨立多通道采集
  • 2.DMA存儲:外設(ADC)到存儲器
void ADC_Mode_Config(void)
{
	DMA_InitTypeDef  DMA_InitStructure;
	ADC_InitTypeDef  ADC_InitStructure;
	
		//根據DMA1的通道1的請求映像選擇通道模式與通道号
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
	DMA_DeInit(DMA1_Channel1);//采用DMA1中的通道1;
	DMA_InitStructure.DMA_PeripheralBaseAddr>>>外設位址
	DMA_InitStructure.DMA_Memory0BaseAddr>>>存儲器位址,對應的寄存器是:DMA_CMAR;
	DMA_InitStructure.DMA_DIR>>>傳輸方向選擇,外設存儲器,存儲器到外設,對應的寄存器DMA_CCR的DIR[1:0]位的值。
	DMA_InitStructure.DMA_BufferSize>>>設定待傳輸資料的數目,對應寄存器是DMA_CNDTR寄存器的值。
	DMA_InitStructure.DMA_PeripheralInc>>>是否使能外設位址自動遞增功能,對應寄存器是DMA_CCR中的PINC位的值,一般外設都是隻有一個資料寄存器,是以不使能。
	DMA_InitStructure.MemoryInc>>> 是否使能存儲器位址自動遞增功能,對應寄存器是DMA_CCR的MINC位的值,一般是使能的。
	DMA_InitStructure.DMA_PeripheralDataSize>>>外設資料寬度,8位,16位,32位,對應寄存器是DMA_CCR中的PSIZE[1:0]位的值。
	DMA_InitStructure.MemoryDataSize>>>存儲器資料寬帶,可選8位,16位,32位對應的寄存器是DMA_CCR中的MSIZE[1:0]位的值。當外設和存儲器之間傳輸資料時,兩邊的資料寬度應該一緻。
	DMA_InitStructure.DMA_Mode>>>選擇DMA傳輸模式是一次傳輸還是循環傳輸,對應的寄存器是DMA_CCR中的CIRC位的值,由于ADC采集是一個持續循環的狀态,是以選用循環模式。
	DMA_InitStructure.DMA_Priority>>>軟體設定通道的優先級,有4個可選優先級分别是非常高,高,中,低,對應寄存器是DMA_CCR中的PL[1:0]位的值。
	DMA_InitStructure.DMA_M2M>>>存儲器到存儲器模式,對應寄存器是DMA_CCR中的MEN2MEN位。
	ADC_DeInit(ADC1);
	ADC_InitStructure. ADC_Mode >>>ADC工作模式的選擇:獨立模式,雙模式對應寄存器是:ADC_CR1:DUALMOD位。
	ADC_InitStructure. ADC_ScanConvMode >>>是否選用掃描,單通道選擇DISABLE,多通道選擇ENABLE,對應寄存器是ADC_CR1:SCAN位
	ADC_InitStructure. ADC_ContinuousConvMode >>>配置是啟動自動連續轉換還是單次轉換。對應寄存器是ADC_CR2:CON位。
	ADC_InitStructure.  ADC_ExternalTrigConv >>>外部觸發選擇,一般選擇軟體觸發,也可以根據項目需求配置觸發來源。對應的寄存器是ADC_CR2中的17-20位,EXTTRIG EXTSEL[2:0];
		ADC_InitStructure.  ADC_DataAlign >>>資料對齊格式,左對齊還是右對齊,一般是右對齊,寄存器是ADC_CR2中的11位,ALIGN;
	ADC_InitStructure.  ADC_NbrofChannel = AD轉換通道的數目,看你需要幾個通道,對應寄存器是ADC_CR1中的AWDCH[4:0];
ADC_Init(ADC1,&ADC_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div8);

ADC_RegularChannelConfig(ADC1,ADC_Channel_12,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,3,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_13,4,ADC_SampleTime_239Cycles5);

ADC_DMACmd(ADC1,ENABLE);//使能ADC的DMA請求;
ADC_Cmd(ADC1,ENABLE);//開啟ADC,并開始轉換
ADC_ResetCalibration(ADC1);//初始化ADC校準寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等待校準初始化完成
ADC_StartCalibration(ADC1);//ADC開始校準
while(ADC_GetCalibrationStatus(ADC1));//等待校準完成
}
           
STM32-(ADC,DMA,重映射)STM32的進階功能應用

ADC觸發選擇:

STM32-(ADC,DMA,重映射)STM32的進階功能應用

ADC通道對應引腳:

STM32-(ADC,DMA,重映射)STM32的進階功能應用
  • 3.管腳映射

為了優化64和100腳的封裝的外設數目,可以把一些複用功能重映射到其他腳上。設定複用重映射的配置寄存器是AFIO_MAPR實作引腳的重新映射。這時的複用功能不再存在原來的引腳上面了。

STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用
STM32-(ADC,DMA,重映射)STM32的進階功能應用

繼續閱讀