一、基础知识
stm32f107定时器3使用时钟源使用外部时钟源模式2进行定时_一吱乖怂鼠的博客-CSDN博客_stm32定时器外部时钟模式
二、基本思想
使用定时器的外部时钟ETR的方式实现,从ETR输入方波作为外部时钟,输出PWM波触发ADC采集。
定时时间计算与内部时钟时一样计算,只是总时钟频率变化了,在检测验证时要注意计算输出的频率,避免乱设置导致频率太小,示波器检测不到看不到现象。
三、定时器部分配置
(1)注意事项
1、
注意:STM32F4是需要引脚GPIO复用才能使用的,而stm32f1不需要复用,这里易错。
2、
3、
注意因为要用FFT需要在工程中添加:(中间是逗号隔开)STM32F40_41xxx,USE_STDPERIPH_DRIVER,ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING
(2)关于GPIO的输入输出配置
深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例)_没有余地没有余地的博客-CSDN博客_上拉输入
(3)代码
//
//定时器3外部时钟触发模式配置 ETR
//外部触发输入:PD2
//使用定时器3第一通道PC6输出PWM波
//可以引出PWM看波形,通过PWM触发ADC采集
//注意ADC需要设置触发为ADC_ExternalTrigConv_T3_CC1
//注意这里不需要TIM3中断,不需要时就不用,之前因为TIM3程序卡在中断服务函数中了,所以需要注意
//
void TIM3_PWMInit(u32 arr,u32 psc,u32 pulse)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //TIM3时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //PORT C使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); //PORT D使能
GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM3); //将C6复用给TIM3
GPIO_PinAFConfig(GPIOD,GPIO_PinSource2,GPIO_AF_TIM3); //将D2复用给TIM3,此处对应TIM3_ETR
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //C6是复用模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//配置ETR外部输入触发模式,外部输入模式2
TIM_ETRClockMode2Config(TIM3,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0);
TIM_TimeBaseStructure.TIM_Prescaler=psc; //预分频值
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_Period=arr; //重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //输出PWM
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性为低
TIM_OCInitStructure.TIM_Pulse=pulse; //设置输出占空比
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能输出比较1通道自动重装载值
TIM_ARRPreloadConfig(TIM3,ENABLE);
TIM_SetCounter(TIM3,0);
TIM_Cmd(TIM3, ENABLE);
}