1. 程式人生 > >STM32-(ADC,DMA,重對映)

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) 內部觸發輸入是使用一個定時器作為另一個定時器的預分頻器。硬體上高階控制定時器和通用定時器在內部連線在一起,可以實現定時器同步或級聯。主模式的定時器可以對從模式定時器執行復位,啟動,停止或提供時鐘。
  • 時基單元 在這裡插入圖片描述 高階控制暫存器的時基單元功能包括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));//等待校準完成
}

在這裡插入圖片描述

ADC觸發選擇: 在這裡插入圖片描述

ADC通道對應引腳: 在這裡插入圖片描述

  • 3.管腳對映

為了優化64和100腳的封裝的外設數目,可以把一些複用功能重對映到其他腳上。設定複用重對映的配置暫存器是AFIO_MAPR實現引腳的重新對映。這時的複用功能不再存在原來的引腳上面了。 在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述