在STM32F105和STM32F107互連型系列微控制器之前,意法半導體已經推出STM32基本型系列、增強型系列、USB基本型系列、互補型系列;新系列產品沿用增強型系列的72MHz處理頻率。內存包括64KB到256KB閃存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三種封裝,不同的封裝保持引腳排列一致性,結合STM32平臺的設計理念,開發人員通過選擇產品可重新優化功能、存儲器、性能和引腳數量,以最小的硬件變化來滿足個性化的應用需求。
市面流通的型號有:
基本型:STM32F101R6、STM32F101C8、STM32F101R8、STM32F101V8、STM32F101RB、STM32F101VB
增強型:STM32F103C8、STM32F103R8、STM32F103V8、STM32F103RB、STM32F103VB、 STM32F103VE、STM32F103ZE
STM32型號的說明:以STM32F103RBT6這個型號的芯片為例,該型號的組成為7個部分,其命名規則如下:
1STM32STM32代表ARM Cortex-M內核的32位微控制器。
2FF代表芯片子系列。
3103103代表增強型系列。
4RR這一項代表引腳數,其中T代表36腳,C代表48腳,R代表64腳,V代表100腳,Z代表144腳,I代表176腳。
5BB這一項代表內嵌Flash容量,其中6代表32K字節Flash,8代表64K字節Flash,B代表128K字節Flash,C代表256K字節Flash,D代表384K字節Flash,E代表512K字節Flash,G代表1M字節Flash。
6TT這一項代表封裝,其中H代表BGA封裝,T代表LQFP封裝,U代表VFQFPN封裝。
766這一項代表工作溫度范圍,其中6代表-40——85℃,7代表-40——105℃。
確定PWM頻率。
這里配置的這兩個定時器確定了PWM的頻率,我的理解是:PWM的周期(頻率)就是ARR寄存器值與PSC寄存器值相乘得來,但不是簡單意義上的相乘,例如要設置PWM的頻率參考上次通用定時器中設置溢出時間的算法,例如輸出100HZ頻率的PWM,首先,確定TIMx的時鐘,除非APB1的時鐘分頻數設置為1,否則通用定時器TIMx的時鐘是APB1時鐘的2倍,這時的TIMx時鐘為72MHz,用這個TIMx時鐘72MHz除以(PSC+1),得到定時器每隔多少秒漲一次,這里給PSC賦7199,計算得定時器每隔0.0001秒漲一次,即此時頻率為10KHz,再把這個值乘以(ARR+1)得出PWM頻率,假如ARR值為0,即0.0001*(0+1),則輸出PWM頻率為10KHz,再假如輸出頻率為100Hz的PWM,則將ARR寄存器設置為99即可。如果想調整PWM占空比精度,則只需降低PSC寄存器的值即可。
TIMx_CCRx寄存器,
確定PWM的占空比。
TIMx_CCR1—TIMx_CCR4確定定時器的CH1—CH4四路PWM的占空比。直接給該寄存器賦0—65535值即可確定占空比。占空比計算方法:TIMx_CCRx的值除以ARR寄存器的值即為占空比,因為占空比在0—100%之間,所以一般TIMx_CCRx寄存器值不能超過ARR寄存器的值,否則可能會引起PWM的頻率或占空比的準確性。
//
void TIM4_GPIOB_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure the LED_pin as output push-pull for LD3 & LD4 usage*/
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB,ENABLE);
//
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4); //GPIO口引腳復用到TIM4的1通道 .PB6
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void TIM4_PwmConfig(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_DeInit(TIM4);
//
TIM_BaseInitStructure.TIM_Period = 10000; //自動重裝載寄存器周期的值(計數值) 單位US ,那這里就是10000uS =10mS中斷一次
TIM_BaseInitStructure.TIM_Prescaler = 3599; // 原來83預分頻數,定時器主頻位84M,預分頻設置為83,分頻84倍,84/84=1m, 一個時鐘脈沖位1uS
TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //時鐘分割 采樣分頻
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數器向上計數
TIM_TimeBaseInit(TIM4, &TIM_BaseInitStructure); //執行初始化函數
//
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //PWM1 為正常占空比模式,PWM2 為反極性模式
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //使能輸出
// TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Disable; //互補輸出禁止
// TIM_OCInitStruct.TIM_Pulse = PWM_Value; //改變占空比
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High ; //High 為占空比高極性,此時占空比為20%;Low 則為反極性,占空比為80%
// TIM_OutputState_Disable
TIM_OC1Init(TIM4,&TIM_OCInitStruct); //使能timer4的通道1
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); //CCR 自動裝載默認也是打開的
TIM_ARRPreloadConfig(TIM4, ENABLE); //ARR 自動裝載默認是打開的,可以不設置 啟用ARR的影子寄存器(直到產生更新事件才更改設置)
//
TIM_Cmd(TIM4, ENABLE); //使能定時器2
//
}
//
void TIM4_PWM_Init(void)
{
TIM4_PwmConfig();
TIM4_GPIOB_Init();
}
評論
查看更多