STM32的计数器的使用

发布者:EnchantedHeart最新更新时间:2018-09-16 来源: eefocus关键字:STM32  计数器  使用 手机看文章 扫描二维码
随时随地手机看文章

因为用stm32f103c8作主控制器,来控制小车,小车的转速由两路光电编码盘输入(左右各一路).因此想到外部时钟触发模式(TIM——ETRClockMode2Config)。

    可以试好好久,发现TIM1不能计数,到网上查了很久,也没有找到相关的文章,开始怀疑TIM1是不是需要特殊设置。经过很久的纠结,终于找到了问题——其实是我自己在GPIO设置的时候,后面的不小心覆盖了前面的了——没想到自己也会犯这么SB的事情。

    现总结程序如下:

第一步,设置GPIO

GPIO_InitTypeDefGPIO_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);

第三步,设置定时器模式

voidTIM1_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_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);
}

第四步,可以在主函数中读取计数器的值,其它的应用,就看具体的情况了。

u16COUN1=0;
u16 COUN2=0;

intmain(void)
{
ChipHalInit();
ChipOutHalInit();

while(1)
{
   COUN1=TIM1->CNT;
   COUN2=TIM2->CNT;
}

}


关键字:STM32  计数器  使用 引用地址:STM32的计数器的使用

上一篇:stm32f432的位计数器计数
下一篇:STM32之通用定时器计数器模式

推荐阅读最新更新时间:2024-03-16 16:14

关于STM32的BOOT0和BOOT1
STM32一共有三种启动模式,在ST官网上下载的RM0008中,可找到启动相关的配置说明: 翻译为中文: STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区 域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执 行程序,见下表: BOOT1=x BOOT
[单片机]
在多节电池组应用中使用DS2755电池电量计
DS2755锂离子/镍氢电池电量计IC设计用于监视单节锂离子(Li+)电池或3节镍氢(NiMH)电池组。只要对电路进行适当的更改,DS2755还可用来监测2节Li+电池组。本应用笔记描述了这样一个参考电路,可用DS2755监视多节电池组的电压、电流、剩余容量和温度等。详细讨论了重要元件的设计,以及DS2755自身的配置问题。 介绍DS2755高精度电池电量计的工作电压范围适合于单节锂离子/聚合物电池,或2到3节镍氢电池组。但是,还有很多应用需要更多节的串连电池组。只要将多节电池的电压降到一个适当的水平,DS2755仍能在这些应用中用作电量计IC。采用这种方法后,DS2755的所有功能仍然有效,包括快照模式、可编程中断、温度/电
[应用]
STM32串口通信(基于缓冲区)编程及遇到的问题总结
在写串口通信前阅读了STM32中文参考手册,然后满心澎湃地写代码。在这个过程中遇一些让人郁闷的事情,目前这些问题目前已经解决了(嘿嘿嘿),特此来总结一番。串口的使用步骤大概如下(51单片机、STM32、QT或VS编写PC串口上位机都是如此) 1、初始化串口参数(波特率、数据位、停止位、校验位、流控制、开启接收/发送) 2、配置串口中断 3、数据传输 那么STM32怎么使用串口呢?上面已经说了嘛,所以按照以上步骤即可。可是由于STM32的引脚是可以复用的,我们还需要设置串口通信引脚(GPIO)的工作方式,然后再设置串口参数、串口中断。 下文函数基于STM32固件库V3.5,以STM32F103RC的串口1的使
[单片机]
Ubuntu环境下使用stlink调试和下载stm32f4-discovery程序
首先下载stlink的Linux版本。 然后解压到你所指定的路径下,参照其中的README文件进行编译配置。如下:(笔者在此将对关键点进行标注) HOWTO ===== First, you have to know there are several boards supported by the software. Those boards use a chip to translate from USB to JTAG commands. The chip is called stlink and there are 2 versions: . STLINKv1, present on STM32VL disco
[单片机]
示波器电流探头在使用过程中需注意的点点滴滴
  示波器电流探头是连接被测电路与示波器输入端的电子部件,没有探头,示波器就成了个摆件。一般可分为交流电流探头和交直流电流探头,交流电流探头通常是无源探头,无需外接供电,而交直流电流探头通常是有源探头。电流探头领域准确测得电流波形,方法是采用电流互感器输入,信号电流磁通经互感变压器变换成电压,再由探头内的放大器放大后送到示波器。   作为这么关键的设备,示波器电流探头在使用过程中更要小心谨慎   对探头进行正确的补偿:不同的示波器输入电容可能不同,甚至同一台示波器不同通道也会有略微差别。为了解决这个问题,学会给探头补偿调节是工程师应该掌握的基本的技能。   探头与被测电路连接时,探头的接地端务必与被测电路的地线相联。否则在
[测试测量]
示波器电流探头在<font color='red'>使用</font>过程中需注意的点点滴滴
STM32 FSMC学习笔记+补充(LCD的FSMC配置)
FSMC全称 静态存储器控制器 。 使用FSMC控制器后,可以把FSMC提供的FSMC_A 作为地址线,而把FSMC提供的FSMC_D 作为数据总线。 (1)当存储数据设为8位时,(FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b) 地址各位对应FSMC_A ,数据位对应FSMC_D (2)当存储数据设为16位时,(FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b) 地址各位对应FSMC_A ,数据位对应FSMC_D FSMC 包括4个
[单片机]
<font color='red'>STM32</font> FSMC学习笔记+补充(LCD的FSMC配置)
DOCK之快换的Profinet对接使用方式
快换的Profinet对接使用方式 同一个设备可以在不同的上交替运行。为此必须使用其他的 IOCTL 功能进行解耦和。如果一个设备仅在一个机器人上运行,则也可以使用这些 IOCTL 功能。其他 IOCTL 功能只能为了兼容的原因而使用。 l 在带有工具更换系统的应用中,绝不能将总线用户持久地耦合在上。 l 在冷启动或在一个输入 / 输出端配置时,在该情况下这将直接导致工业以太网故障。 l 关闭始终可用这一功能可以防止这些设备在冷启动后或者重新配置输入 /输出端后被逻辑耦合进工业以太网。 l 这些已被停用的设备可以在以后程序运行时毫无问题地重新耦合进来。 l 但是在项目设
[机器人]
stm32串口接收中断触发原理
如果在STM32微控制器的串口通信中,接收中断无法触发,可能有以下几个可能的原因: 1. 串口接收中断未使能:在初始化串口时,可能未正确使能接收中断。请确保在初始化代码中设置了正确的控制寄存器位来使能串口接收中断。例如,使用`USART_ITConfig()`函数或设置相应的寄存器位。 2. 中断优先级设置错误:如果其他中断具有更高的优先级,可能会导致串口接收中断无法触发。请确保正确配置了中断优先级,并确保串口接收中断的优先级高于其他中断。 3. 接收缓冲区溢出:如果接收缓冲区溢出,可能会导致串口接收中断无法触发。确保在接收中断处理函数中及时读取接收数据寄存器,以避免缓冲区溢出。 4. 硬件连接错误:检查串口接收引脚是否正确连接,
[单片机]
<font color='red'>stm32</font>串口接收中断触发原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved