完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
实现简述:
定时器有如下几种功能用法: 1》定时。使用内部时钟源 2》PWM调制输出。使用内部时钟源 3》脉冲宽度(频率)测量。使用内部时钟源,外部边沿触发 4》脉冲数计数。使用外部时钟输入 我们这里使用了TIM5定时器做“脉冲数计数”,定时器做外部脉冲计数,首先要确定外部时钟信号输入的引脚,我们这里选择的是TIM5(也可以选择其它定时器STM32有多个定时器),再根据TIM5定时器找引脚,数据手册上可知每个TIM定时器都有4个外部输入通道,我们这里选择第一通道(TIM5_CH1), 又由数据芯片手册中可知TIM5的CH1通道对应PA0引脚。 现在确定了定时器和输入通道及引脚。我们将TIM5初始化配置成外部脉冲计数器使用,接下来就是上代码: 初始化函数代码: void TIM5_EtrModeOne_Init(u16 arr){ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//打开PB端口时钟 GPIO_InitTypeDef GPIO_InitStructure;//设置GPIO为TIM的时钟输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//gpio模式设置为复用模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//设置为推挽 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不上下拉 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);//设置GPIO复用为中断定时器输入 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);//使能TIM时钟 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//设置定时器参数 TIM_TimeBaseStructure.TIM_Period = arr;//自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 0; //定时器分频 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式 TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); TIM_ClearITPendingBit(TIM5,TIM_IT_Update);//清除溢出中断标志位 TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE );//使能定时器更新中断 NVIC_InitTypeDef NVIC_InitStructure;//设置中断优先级 NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_TIxExternalClockConfig(TIM5,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Falling,15);//设置输入滤波和边沿检测 TIM_SetCounter(TIM5,0);//计数器清零 TIM_Cmd(TIM5, ENABLE);//使能TIMx外设 } 初始化设置解读: 1》设置GPIO引脚为TIM5的时钟输入: 》打开GPIOA外设的时钟: RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//打开PA端口时钟 》引脚可以设置成输入、输出、复用、模拟、四种模式 GPIO_Modetypedef enum { GPIO_Mode_IN = 0x00, /*!《 GPIO Input Mode */ GPIO_Mode_OUT = 0x01, /*!《 GPIO Output Mode */ GPIO_Mode_AF = 0x02, /*!《 GPIO Alternate function Mode */ GPIO_Mode_AN = 0x03 /*!《 GPIO Analog Mode */ }GPIOMode_TypeDef; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //gpio模式设置为复用模式 》引脚设置成推挽: typedef enum { GPIO_OType_PP = 0x00, GPIO_OType_OD = 0x01 }GPIOOType_TypeDef; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//设置为推挽 》设置不上下拉: typedef enum { GPIO_PuPd_NOPULL = 0x00, GPIO_PuPd_UP = 0x01, GPIO_PuPd_DOWN = 0x02 }GPIOPuPd_TypeDef; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不上下拉 》设置GPIO复用为中断定时器输入 GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);//设置GPIO复用为中断定时器输入 2》定时器设置: 》打开TIM5定时器外设时钟: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); 》定时器到arr值时自动重装载为0: TIM_TimeBaseStructure.TIM_Period = arr; 》定时器分频,由于我们是计外部脉冲数所以不分频: TIM_TimeBaseStructure.TIM_Prescaler = 0; 》向上(加)计数模式: TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 》清除溢出中断标志位 TIM_ClearITPendingBit(TIM5,TIM_IT_Update); 》使能溢出中断 TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE ); 》TIM_TIxExternalCLK1Source_TI1:设置外部时钟输入1通道,TIM_ICPolarity_Falling检测下降沿计数,设置输入滤波15 (0-15), TIM_TIxExternalClockConfig(TIM5,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Falling,15); 3》中断优先级设置: 》抢占优先级设置为一: NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 》响应优先级为3: NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 4》开启TIM定时器: 将TIM5配置完成后,先将定时器清零,然后就可以打开定时器工作了。 TIM_SetCounter(TIM5,0);//计数器清零 TIM_Cmd(TIM5, ENABLE);//使能TIMx外设 中断函数: 当定时器计数器中的值达到设定的溢出值时触发中断,定时器自动重装。如果只需要中断触发一次,可以在中断函数里关闭定时器使能。 void TIM5_IRQHandler(){ if (TIM_GetITStatus(TIM5, TIM_IT_Update)!=RESET){//判断是否是溢出中断 TIM_ClearITPendingBit(TIM5,TIM_IT_Update);//清除溢出中断标志位 //中断执行语句 //TIM_Cmd(TIM5, !ENABLE);//关闭定时器使能 } } 主函数: 每隔500ms打印一次计数值 void main(){ usrat_int(9600); TIM5_EtrModeOne_Init(10000);//定时器计数到10000时重装为0 while(1){ printf(“计数值:%d rn”,TIM_GetCounter(TIM5)); delay_ms(500); } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1996 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1781 浏览 1 评论
1245 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
824 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1799 浏览 2 评论
2030浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
938浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
337浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
682浏览 3评论
668浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-3-6 03:11 , Processed in 0.481184 second(s), Total 41, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191