STM32 定时器用于外部脉冲计数,修改版,解决3..4库对应的无响应外部脉冲的问题
2012-07-24 14:18
225 查看
这里先总结一下各个time对应的gpio
TIMER1 --> PA12
TIMER2 --> PA0
TIMER3 --> PD2
TIMER4 --> PE0
暂时够了,更多的建议参考数据手册
基于库3.4代码,网上参考了很多代码,一直有问题,估计是库版本的问题,引用下边的一片文章,红色文字为本人注释和修改。
STM32 定时器用于外部脉冲计数
2010-08-14 16:00
TIMER1 --> PA12
TIMER2 --> PA0
TIMER3 --> PD2
TIMER4 --> PE0
暂时够了,更多的建议参考数据手册
基于库3.4代码,网上参考了很多代码,一直有问题,估计是库版本的问题,引用下边的一片文章,红色文字为本人注释和修改。
STM32 定时器用于外部脉冲计数
2010-08-14 16:00
因为用stm32f103c8作主控制器,来控制小车,小车的转速由两路光电编码盘输入(左右各一路).因此想到外部时钟触发模式(TIM——ETRClockMode2Config)。 可以试好好久,发现TIM1不能计数,到网上查了很久,也没有找到相关的文章,开始怀疑TIM1是不是需要特殊设置。经过很久的纠结,终于找到了问题——其实是我自己在GPIO设置的时候,后面的不小心覆盖了前面的了——没想到自己也会犯这么SB的事情。 现总结程序如下: 第一步,设置GPIO GPIO_InitTypeDef GPIO_InitStructure; /* PA0,PA12-> 左右脉冲输入 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度 GPIO_Init(GPIOA, &GPIO_InitStructure); 注意:(1)stm32f103c8只有TIM1_ETR(PA12,Pin33),和TIM2_CH1_ETR(PA0,Pin10)两个可以用。其它更多管脚的芯片,有更多的可以输入(如100管脚的有4个可以输入的);(2)外部时钟输入与中断无关;(3)stm32f103c8的这个两个应用中,不需要重映射。 对于哪些需要重映射,参考数据手册。 第二步:设置RCC RCC_ClocksTypeDef RCC_ClockFreq; SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(&RCC_ClockFreq); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 第三步,设置定时器模式 void TIM1_Configuration(void) //只用一个外部脉冲端口 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //配置TIMER1作为计数器 TIM_DeInit(TIM1); TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0x00;//设置预分频可以将外部信号分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // Time base configuration TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ETRF); //我测试中一直不能用的原因是缺少这句话,缺少后,timer的驱动时钟源默认是RCC,需要更改为外部ETR输入才行。 TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); TIM_SetCounter(TIM1, 0); TIM_Cmd(TIM1, ENABLE); } void TIM2_Configuration(void) //只用一个外部脉冲端口 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //配置TIMER2作为计数器 TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0x00; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); TIM_SetCounter(TIM2, 0); TIM_Cmd(TIM2, ENABLE); } 第四步,可以在主函数中读取计数器的值,其它的应用,就看具体的情况了。 u16 COUN1=0; u16 COUN2=0; int main(void) { ChipHalInit(); ChipOutHalInit(); while(1) { COUN1=TIM1->CNT; COUN2=TIM2->CNT; } } 然后就可以用了 当然你可以使能中断,TIM_ARRPreloadConfig(TIM2, ENABLE); /*预先清除所有中断位*/ TIM_ClearITPendingBit(TIM2,TIM_IT_Update); /* 4个通道和溢出都配置中断*/ TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 并且在终端中重装填计数器数据,既可以在计数若干后产生一次中断 void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // TIM_Cmd(TIM2, DISABLE); TIM2->CNT=65530; } } 仁者见仁吧,以后有机会再深入研究。。不得不说,用了stm32 的api库后,很多寄存器都懒得看了。。。。悲剧啊 |
相关文章推荐
- STM32 定时器用于外部脉冲计数
- STM32 定时器用于外部脉冲计数
- STM32 定时器用于外部脉冲计数
- STM32 定时器用于外部脉冲计数(转)
- STM32 16位定时器对正交编码器计数的方法(附检测输入脉冲的方法)
- jmeter之Sampler响应结果编码修改(解决乱码问题)
- 使用STM32的定时器进行输入脉冲的计数
- 解决STM32开启定时器时立即进入一次中断程序问题
- 关于使用stm8单片机的“外部计数”TIMx_ETR测脉冲的软件配置问题!
- android Webview中注入js,用于解决第三方页中出现返回事件window.history.go(-1),无法响应问题
- Jmeter之Sampler响应结果编码修改(解决乱码问题)
- iOS开发之隐藏tabbar--解决隐藏后依然不能响应对应位置事件的问题 分类: ios技术 2015-04-21 11:24 261人阅读 评论(0) 收藏
- stm32的通用计数器用于编码器的脉冲计数
- Popuwindow点击外部控件切换popuwindow——解决点击外部事件不响应问题。
- iOS开发之隐藏tabbar--解决隐藏后依然不能响应对应位置事件的问题
- stm32定时器外部计数模式 最大频率计算。
- 解决JAVA中内部类所对应的外部类引用初始化的问题
- 自定义cell,添加uilable,并且给lable添加tap手势,不响应的问题,对应解决方法
- stm32定时器外部计数
- laravel 5中 新建的event对应的handler不能响应的问题 解决方法