使用stm32 定时器TIM3 的重映射引脚 捕获正交编码器数据的一些积累
关注+星标公众号,及时获取更多技术分享~
作者 | 冰茶奥利奥
微信公众号 | 嵌入式电子创客街
因为我们公司的软件和硬件是分开的,硬件人员在设计电路板的时候,为了布线方便,往往会使用一些引脚的重映射功能。
这次使用的单片机是stm32F103ZGT6,使用PB4和PB5捕获正交编码器的数据。
因为这两个引脚本身没有定时器,只有在重映射时候才能使用TIM3的ch1和ch2。
因此,我使用重映射配置,将这两个引脚配置了以下,这是一开始的代码:
GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);GPIO_PinRemapConfig(GPIO_FullRemap_TIM3 ,ENABLE ); //重映射相应的外设GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);TIM_TimeBaseStructInit(&TIM_TimBaseStructure);TIM_TimBaseStructure.TIM_Prescaler = 0x0;TIM_TimBaseStructure.TIM_Period = 2400;TIM_TimBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_TimBaseStructure);TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 0;TIM_ICInit(TIM3,&TIM_ICInitStructure);TIM_ClearFlag(TIM3,TIM_FLAG_Update);TIM_SetCounter(TIM3,0);TIM_Cmd(TIM3,ENABLE);
通过读取TIM3的CNT寄存器获取当前数值。
然而无论怎样旋转编码器,都无法得到计数,计数始终为0。因此开始进行排查:
猜测1:引脚是否能够捕获到高低电平
试验:将两个引脚设置为开入,然后旋转编码器,可以正确的读到两个引脚高低电平的变换,证明是配置的问题
猜测2:是否和未开启AFIO时钟有关?
试验:开启AFIO时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
还是不能捕获电平,证明不是由这个引起的。
猜测3:是否其他地方使用了TIM3,导致重映射功能没有正确开启?
试验:屏蔽其他程序,在重映射之前添加一行程序
TIM_DeInit(TIM3);
问题仍然没有解决。
猜测4:该引脚复用后是否具备捕获编码器脉冲的功能?
试验:百度上搜索,然后获取到了部分重映射和全部重映射的概念。在我的认知当中,部分重映射应该是只映射部分功能,我这里配置的是全部重映射,认为应该是可以实现捕获编码器功能的。
然而问题没有办法解决。只能寻求参考手册的帮助。
在AFIO寄存器这一章看到了这个概念:
看到这里,我瞬间明白了,stm32中的重映射,也是针对端口的,并不是说每个端口都具备映射的全部功能。在开启这个端口重映射的时候,不能够配置成FullRemap,否则是配置失败的。
因此改成了以下样子:
GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 ,ENABLE ); //重映射相应的外设GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);TIM_TimeBaseStructInit(&TIM_TimBaseStructure);TIM_TimBaseStructure.TIM_Prescaler = 0x0;TIM_TimBaseStructure.TIM_Period = 2400;TIM_TimBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_TimBaseStructure);TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 0;TIM_ICInit(TIM3,&TIM_ICInitStructure);TIM_ClearFlag(TIM3,TIM_FLAG_Update);TIM_SetCounter(TIM3,0);TIM_Cmd(TIM3,ENABLE);
stm32由于由库函数的支持,导致我们在使用的过程中越来越忽略掉了底层的一些运作方式。知其然而不知其所以然,在技术道路上,所有忽略掉的小细节以后都会成倍的返还给你。
如果您觉得这篇文章帮到了你,请点赞或者留下您的评论,您的鼓励是我前进的动力~
关注博主公众号 “嵌入式电子创客街” 获取更多及时技术分享~
使用stm32 定时器TIM3 的重映射引脚 捕获正交编码器数据的一些积累相关推荐
- STM32 端口复用与重映射及低功耗引脚配置
STM32 端口复用与重映射及低功耗引脚配置 什么是复用? 在TSM32里面,大部分的引脚都是有GPIO复用功能,也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内 ...
- STM32 CUBEMX 设置GPIO重映射
STM32 外设默认引脚不合适,所以我研究了一下重映射功能. 1. 中文参考手册 ## 2. CUBE 设置 在右侧红框处,搜索 外设默认引脚位置 鼠标悬停在引脚上,根据提示 Ctrl单击默认引脚 然 ...
- STM32——端口复用与重映射
目录 端口复用的概念 内置外设的概念 端口复用的概念 端口复用的配置 配置示例(串口1) 复用GPIO的配置 STM32中文参考手册 110页 端口重映射概念 端口重映射概念 部分重映射 完全重映射 ...
- stm32端口复用和重映射
相关描述在参考手册 通用和复用功能I/O General-purpose and alternate-function I/Os(GPIOs and AFIOs)里有详细介绍 端口复用或许没听过详细 ...
- 关于STM32的中断向量表的重映射的问题
1 为什么要对中断向量表进行重新映射? COREM3权威指南上讲"然而,为了动态重分发中断, CM3 允许向量表重定位--从其它地址处开始定位各异常向量. 这些地址对应的区域可以是代码区,但 ...
- STM32 UART2程序--端口重映射
STM32 UART2程序 2012-12-04 16:26:05 分类: LINUX USART1程序很多,看看USART2程序.注意红色部分,首先要使能相关端口的时钟. 因为USART2可以映射成 ...
- Stm32端口复用与重映射
概述 微控制器 I/O 引脚通过一个复用器连接到板载外设/模块,该复用器一次仅允许一个外设的复 用功能 (AF) 连接到 I/O 引脚.这可以确保共用同一个 I/O 引脚的外设之间不会发生冲突. ...
- STM32学习日记3---定时器TIM3重映射PWM波呼吸灯实验
文章目录 1. 代码 关于PWM波的输出,我们需要用到定时器的4个通道(通用定时器和高级定时器有,基本定时器没有这4个通道)里面的PWM生成.然后查看数据手册,了解定时器的重映射引脚情况.所以配置时, ...
- 【STM32】谈谈STM32F10XX的定时器通道复用功能重映射
写这篇的动机是我每次配置定时器硬件PWM的时候都要翻一遍手册,对着目录找内容实在麻烦,干脆写一篇博文直接pick出这一段. 本文参考:正点原子提供的STM32中文参考手册 关键词:STM32 定时器 ...
最新文章
- Vivado 随笔(2) 综合属性之use_dsp48?
- 让计算机时间和网络时间同步,如何让电脑时间与北京时间同步?
- 【Java小游戏】小球躲避游戏 图片轮播爆炸效果、边缘反弹、计时功能
- 在html中引用分享的链接
- 如何解决struts2没有提示问题
- docsify,文档生成利器!
- 【工具】获取窗口与控件信息
- 不断突破道,用道来挣钱才能长稳,才能心安!
- 仿 trello php,使用jQuery-ui实现仿Trello风格的任务卡拖拉动画
- 论文笔记-Understanding Convolution for Semantic Segmentation
- Redis解决商品秒杀与超卖
- 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.3 模型在设计中的作用...
- PHP多人聊天系统,ttltCha​tPHP多人在线聊天系统软件源码 v0.0.12
- 我用Python抓取了自如上所有的租房信息,随心所欲的选房
- SAP FI系统配置-应收应付
- ppt打印铺满纸张时的设置方法
- linux smit工具,linux安全基础 SMIT入门(4)
- Cannot run program “mvn“ (in directory “/var/lib/jenkins/workspace)
- 关于xml实体攻击的讨论
- 通过tasker上传手机电量到domoticz中,电量过低时,自动充电