关注+星标公众,及时获取更多技术分享~ 

作者 | 冰茶奥利奥

微信公众号 | 嵌入式电子创客街

因为我们公司的软件和硬件是分开的,硬件人员在设计电路板的时候,为了布线方便,往往会使用一些引脚的重映射功能。

这次使用的单片机是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 的重映射引脚 捕获正交编码器数据的一些积累相关推荐

  1. STM32 端口复用与重映射及低功耗引脚配置

    STM32 端口复用与重映射及低功耗引脚配置 什么是复用? 在TSM32里面,大部分的引脚都是有GPIO复用功能,也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内 ...

  2. STM32 CUBEMX 设置GPIO重映射

    STM32 外设默认引脚不合适,所以我研究了一下重映射功能. 1. 中文参考手册 ## 2. CUBE 设置 在右侧红框处,搜索 外设默认引脚位置 鼠标悬停在引脚上,根据提示 Ctrl单击默认引脚 然 ...

  3. STM32——端口复用与重映射

    目录 端口复用的概念 内置外设的概念 端口复用的概念 端口复用的配置 配置示例(串口1) 复用GPIO的配置 STM32中文参考手册 110页 端口重映射概念 端口重映射概念 部分重映射 完全重映射 ...

  4. stm32端口复用和重映射

    相关描述在参考手册 通用和复用功能I/O  General-purpose and alternate-function I/Os(GPIOs and AFIOs)里有详细介绍 端口复用或许没听过详细 ...

  5. 关于STM32的中断向量表的重映射的问题

    1 为什么要对中断向量表进行重新映射? COREM3权威指南上讲"然而,为了动态重分发中断, CM3 允许向量表重定位--从其它地址处开始定位各异常向量. 这些地址对应的区域可以是代码区,但 ...

  6. STM32 UART2程序--端口重映射

    STM32 UART2程序 2012-12-04 16:26:05 分类: LINUX USART1程序很多,看看USART2程序.注意红色部分,首先要使能相关端口的时钟. 因为USART2可以映射成 ...

  7. Stm32端口复用与重映射

    概述 微控制器 I/O 引脚通过一个复用器连接到板载外设/模块,该复用器一次仅允许一个外设的复 用功能 (AF) 连接到 I/O 引脚.这可以确保共用同一个 I/O 引脚的外设之间不会发生冲突.    ...

  8. STM32学习日记3---定时器TIM3重映射PWM波呼吸灯实验

    文章目录 1. 代码 关于PWM波的输出,我们需要用到定时器的4个通道(通用定时器和高级定时器有,基本定时器没有这4个通道)里面的PWM生成.然后查看数据手册,了解定时器的重映射引脚情况.所以配置时, ...

  9. 【STM32】谈谈STM32F10XX的定时器通道复用功能重映射

    写这篇的动机是我每次配置定时器硬件PWM的时候都要翻一遍手册,对着目录找内容实在麻烦,干脆写一篇博文直接pick出这一段. 本文参考:正点原子提供的STM32中文参考手册 关键词:STM32 定时器 ...

最新文章

  1. Vivado 随笔(2) 综合属性之use_dsp48?
  2. 让计算机时间和网络时间同步,如何让电脑时间与北京时间同步?
  3. 【Java小游戏】小球躲避游戏 图片轮播爆炸效果、边缘反弹、计时功能
  4. 在html中引用分享的链接
  5. 如何解决struts2没有提示问题
  6. docsify,文档生成利器!
  7. 【工具】获取窗口与控件信息
  8. 不断突破道,用道来挣钱才能长稳,才能心安!
  9. 仿 trello php,使用jQuery-ui实现仿Trello风格的任务卡拖拉动画
  10. 论文笔记-Understanding Convolution for Semantic Segmentation
  11. Redis解决商品秒杀与超卖
  12. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.3 模型在设计中的作用...
  13. PHP多人聊天系统,ttltCha​tPHP多人在线聊天系统软件源码 v0.0.12
  14. 我用Python抓取了自如上所有的租房信息,随心所欲的选房
  15. SAP FI系统配置-应收应付
  16. ppt打印铺满纸张时的设置方法
  17. linux smit工具,linux安全基础 SMIT入门(4)
  18. Cannot run program “mvn“ (in directory “/var/lib/jenkins/workspace)
  19. 关于xml实体攻击的讨论
  20. 通过tasker上传手机电量到domoticz中,电量过低时,自动充电

热门文章

  1. ARM Mali GPU 四大微架构概述
  2. 蔬菜处理生产系统(PLC课程设计)【本文为原创,全部源文件可供下载,谢绝转载】
  3. 奈奎斯特-香农定理(1):了解采样系统
  4. 面向对象——访问器、修改器、构造函数、对象的创建流程
  5. AOL邮箱(@aol.com):app密码登录
  6. python实现简单的模拟发送短信验证码
  7. 关于《做最好的中层》的体会与感悟
  8. 音乐外链生成源码php,百度网盘音乐外链源码 | 小楼昨夜又东风
  9. php跳转外链,分享两种外链跳转方法,可避免权重流失。
  10. Oracle存储过程详细教程