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實作引腳的重新映射。這時的複用功能不再存在原來的引腳上面了。