STM32F407 通过定时器实现外部时钟控制AD采集频率

一、基础知识

stm32f107定时器3使用时钟源使用外部时钟源模式2进行定时_一吱乖怂鼠的博客-CSDN博客_stm32定时器外部时钟模式

 STM32F407 通过定时器实现外部时钟控制AD采集频率_第1张图片

二、基本思想

使用定时器的外部时钟ETR的方式实现,从ETR输入方波作为外部时钟,输出PWM波触发ADC采集。

定时时间计算与内部时钟时一样计算,只是总时钟频率变化了,在检测验证时要注意计算输出的频率,避免乱设置导致频率太小,示波器检测不到看不到现象。

三、定时器部分配置

(1)注意事项 

1、

注意:STM32F4是需要引脚GPIO复用才能使用的,而stm32f1不需要复用,这里易错。

2、

3、 

STM32F407 通过定时器实现外部时钟控制AD采集频率_第2张图片 注意因为要用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); 				  
}

(4)Keil5中复制出来中文不会乱码的方法

STM32F407 通过定时器实现外部时钟控制AD采集频率_第3张图片 STM32F407 通过定时器实现外部时钟控制AD采集频率_第4张图片

你可能感兴趣的:(STM32学习笔记,电赛学习笔记,stm32,单片机)