完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F4xx 通用定时器相关知识
STM32F4定时器系统包括,高级控制定时器 TIM1和 TIM8、通用定时器TIM2~TIM5、通用定时器TIM9 ~TIM14、基本定时器TIM6和TIM7。我们重点关注通用定时器的相关配置。 通用定时器TIM2~TIM5包含一个 16 位或 32 位自动重载计数器,该计数器由可编程预分频器驱动。它们可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获)或生成输出波形(输出比较和 PWM)。使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制 到几毫秒。这些定时器彼此完全独立,不共享任何资源。 TIM3配置函数如下,注意GPIO复用,自动重装载值和分频系数的设置。定时器溢出时间Tout和重装载值arr以及预分频系数psc的关系如下:
//初始化定时器 void ADC12_TIM3_Mode_Config(void) { 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); //使能PORTC时钟 GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM3); //GPIOC6(USART)复用为定时器3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //GPIOC6 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉 GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PC6 TIM_TimeBaseStructure.TIM_Prescaler = 83;//psc=83 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period =49;//arr=49 TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse=25;//自动重装载值为49,占空比设置为50%,则这里应赋值25 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR1上的预装载寄存器 TIM_ARRPreloadConfig(TIM3,ENABLE);//ARPE使能 TIM_Cmd(TIM3, ENABLE); } DMA相关配置 在配置DMA时要注意以下几点
//初始化DMA2 void ADC12_DMA2_Mode_Config(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); //使能DMA2时钟 //DMA是一种快速的数据传送方式 while(DMA_GetCmdStatus(DMA2_Stream0)!=DISABLE); DMA_InitStructure.DMA_BufferSize=NUM; DMA_InitStructure.DMA_Channel=DMA_Channel_0; DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_Memory0BaseAddr=(u32)ADC_ConvertedValue; DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single; DMA_InitStructure.DMA_MemoryDataSize=DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&(ADC->CDR); DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single; DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_Priority=DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable; DMA_Init(DMA2_Stream0, &DMA_InitStructure); //使能DMA通道2 DMA_Cmd(DMA2_Stream0, ENABLE); } ADC1和ADC2的配置
/******************************** 配置ADC1,ADC2和DMA,利用DMA来读取ADC采 集到的数据 ********************************/ void ADC12_Mode_Config(void) { ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); //使能ADC2时钟 ADC12_GPIO_Config(); ADC12_DMA2_Mode_Config(); ADC12_TIM3_Mode_Config(); //ADC通用配置 ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;//双重模式 ADC_CommonInitStructure.ADC_TwoSamplingDelay =ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟 5 个时钟,影响不大 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2; //DMA 模式选择 ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频 4 分频。 //ADCCLK=PCLK2/4=84/4=21Mhz,ADC 时钟最好不要超过 36Mhz ADC_CommonInit(&ADC_CommonInitStructure);//初始化 //配置ADC1 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //使用12 位分辨率 ADC_InitStructure.ADC_ScanConvMode =DISABLE; //非扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //只采集一次,等待下次触发 ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_Rising;//上升沿触发 ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T3_CC1; //定时器触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐方式 ADC_InitStructure.ADC_NbrOfConversion = 1; // 用来设置规则序列的长度,我们只对一个ADC通道进行转换 ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); //使能ADC1 ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_84Cycles); // // ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE); //ADC_DMACmd(ADC1, ENABLE); //使能ADC1的DMA //配置ADC2 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //使用12 位分辨率 ADC_InitStructure.ADC_ScanConvMode =DISABLE; //非扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //只采集一次,等待下次触发 //ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_Rising;//上升沿触发 ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConvEdge_None; //从ADC不设置外部触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐方式 ADC_InitStructure.ADC_NbrOfConversion = 1; // 用来设置规则序列的长度,我们只对一个ADC通道进行转换 ADC_Init(ADC2, &ADC_InitStructure); ADC_Cmd(ADC2, ENABLE); //使能ADC2 ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 1, ADC_SampleTime_84Cycles); // // ADC_DMARequestAfterLastTransferCmd(ADC2,ENABLE); //ADC_DMACmd(ADC2, ENABLE); //使能ADC1的DMA ADC_SoftwareStartConv(ADC2); ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE); } 数据转换 将采集到的数据转化为两组数据,输入波形数据和输出波形数据 /****************************************************************** 将采集到的数据转化为两组数据,输入数据和输出数据 *******************************************************************/ void zhuanhua(void) {int i=0; for(i=0;i<2000;i++) { ADC2_ConvertedValue=(u16)((ADC_ConvertedValue&0xFFFF0000)>>16); ADC1_ConvertedValue=(u16)(ADC_ConvertedValue&0xFFFF); } } |
|
|
|
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1182浏览 3评论
608浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
600浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 20:44 , Processed in 1.250981 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号