花了两天时间终于把stm32f103的定时器输入捕获弄懂了,这里以TIM3的通道ch1为例,要实现输入捕获需要配置一下寄存器,TIMx_ARR,TIMx_PSC,TIMx_CCMR1,TIMx_CCER,TIMx_DIER,TIMx_CR1,TIMx_CCR1.这里抓取了一些收据手册中寄存器描述的图
下面一一介绍:
TIMx_ARR寄存器为自动重装载的值
TIMx_CR1这里了只要用到它的第0位即使能位。
TIMx_CCMR可以配置对应通道映射到那个IC,TI。
这里我们是第一通道故只需配置低8位,cc1s为配置ch1映射到那个TI,IC1PSC为配置是否分频,1c1f为配置是否滤波。
TIMx_psc寄存器
TIMx_DIER寄存器如下图:
第0位为更新中断使能位,即定时器值更新时产生的中断,第一1c通道发生捕获时间中断使能位。
下面附上程序:(注意下面程序用的是ch2)
void timer3init()
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PA7 清除之前设置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA7 输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_7); //PA7 上拉
TIM3->ARR=0XFFFF; //设定计数器自动重装值
TIM3->PSC=71; //预分频器
TIM3->CCMR1|=0X0100; //CC1S=01 选择输入端 IC2映射到TI2上
// TIM3->CCMR1|=0<<4; //IC1F=0000 配置输入滤波器 不滤波
// TIM3->CCMR1|=0<<10; //IC2PS=00 配置输入分频,不分频
TIM3->CCER|=0X0010; //CC1P=0 上升沿捕获
// TIM3->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM3->DIER|=0X005; //允许捕获中断
// TIM3->DIER|=1<<0; //允许更新中断
// TIM3->CR1|=0x01; //使能定时器2
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC2,ENABLE);//允许更新中断 ,允许CC1IE捕获中断
TIM_Cmd(TIM3,ENABLE ); //使能定时器3
}
void TIM3_IRQHandler(void)
{
if((TIM3CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
if(TIM_GetCapture1(TIM3)==0xffff)
TIM3CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
{
printf("icc2");
val2=TIM_GetCapture1(TIM3);
TIM3CH2_CAPTURE_STA=0; //清空
TIM3CH2_CAPTURE_VAL=0;
TIM_SetCounter(TIM3,0);
TIM3CH2_CAPTURE_STA|=0X80; //标记捕获到了上升沿
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2|TIM_IT_Update); //清除中断标志
}
}
关键字:stm32 定时器 输入捕获 pwm
引用地址:
stm32定时器输入捕获pwm
推荐阅读最新更新时间:2024-03-16 16:07
STM32库函数详解----(通用输入/输出GPIO)
初始化和配置相关函数 1.void GPIO_DeInit (GPIO_TypeDef* GPIOx) 函数解释:gpio的反初始化函数,该函数的作用是把GPIO相关的寄存器配置成上电复位后的默认状态,在第一次初始化前或者不在使用某一接口后,可以调用该函数。 参数:GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。 2.void GPIO_Init (GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct) 函数解释:GPIO的初始化函数,该函数的作用是对io进行初始化。 参数:(1)GPIOx,GPIO的分组,如 GPI
[单片机]
【菜鸟入门】stm32 之 USART
这是学习stm32的第四天了,怎么说呢?感触最大的是,细心最重要,为什么呢?昨天,一个二进制到十六进制换算出来问题,导致一个问题纠结了一下午,今天,在初始化时钟的时候,把9写成10,导致,串口到下午才调试好。 好吧,现在开始说串口。 在我的板子上,USART1对应的PIN是 PA10 --- RX INPUT Mode:0x8 PA9 ---TX OUTPUT Mode:0xb 其实串口初始化也就分下面几步: (1)PIN管脚时钟使能,特殊功能寄存器使能,即GPIOA和USART1时钟使能; (2)USART管脚配置,PA10配置成输入模式:0x8;PA9配置成输出模式;【前面讲过怎么配置】 (3)U
[单片机]
STM32:外部晶振时钟配置
void SystemClock_Config(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); //INPUT HSE = 24M ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(ENABLE); //M0 defined FLASH_SetLatency(FLASH_Latency_1); //M0 defined RCC_PR
[单片机]
STM32开发 -- YModem详解
对 YModem 的接触,只是在无网络的情况下,使用SecureCRT软件输入loady命令进行串口传输,烧写内核和文件系统。 参看:Hi3516A开发-- 板卡串口烧写 但你要问我 YModem 是个什么东西,我还真说不上来。 接下来,就开始对YModem的一步步剖析详解!! 一、YModem简介 参看:XMODEM/YMODEM PROTOCOL REFERENCE 。。。。 网上查了老半天,怎么感觉没有一篇讲的特别清楚的。 1、YMODEM最低要求 声称支持YMODEM的所有程序必须满足以下最低要求 1) 发送程序应在块0中发送路径名(文件名)。 2) 路径名应为空终止的ASCII字符串,如下所述。 对于那些懒得
[单片机]
PLC定时器使用注意事项
PLC中的定时器相当于继电器系统中的时间继电器。它有一个设定值寄存器(一个字长)、一个当前值寄存器(一个字长)和一个用来储存其输出触点状态的映像寄存器(占二进制的一位),这三个存储单元使用同一个元件号。FX系列PLC的定时器分为通用定时器和积算定时器。 常数K可以作为定时器的设定值,也可以用数据寄存器(D)的内容来设置定时器。例如外部数字开关输入的数据可以存入数据寄存器,作为定时器的设定值。通常使用有电池后备的数据寄存器,这样在断电时不会丢失数据。 1 通用定时器 各系列的定时器个数和元件编号如表3–5所示。100ms定时器的定时范围为0.1~3276.7s,10ms定时器的定时范围为0.01~327.67s。FX1S的特
[嵌入式]
9.STM32中对SysTick_Init()函数和Delay_us()的理解
STM32中对SysTick_Init()函数(sysTick_Config()、TimingDelay_Decrement()自定义)和Delay_us()的理解: 实验:3个LED灯以500ms的频率闪烁。
[单片机]
STM32系列第7篇--串口通信基本原理
两种通信方式: 1、串行通信 传输原理:数据按位顺序传输。 优点:占用引脚资源少 缺点:速度相对较慢 2、并行通信 传输原理:数据各个位同时传输。 优点:速度快 缺点:占用引脚资源多 串口通信按数据传输方向可以分为单工、半双工、全双工。 串行通信的通信方式 同步通信:带时钟同步信号传输。 SPI,IIC通信接口,一个时钟周期只传1bit信号 异步通信:不带时钟同步信号。 UART(通用异步收发器),单总线,要求波特率匹配 常见的串行通信接口 通信接口 引脚说明 通信方式 通信方向 UART通用异步收发器 TXD、RXD、GND 异步 全双工 单总线 DQ 异步 半双工 SPI SCK、MISO、
[单片机]
一种基于CPLD的PWM控制电路设计
摘要:介绍了利用硬件描述语言VHDL设计的一种基于CPLD的PWM控制电路,该PWM控制电路具有PWM开关频率可调,同侧2路信号互锁、延时时间可调、接口简单等特点,可应用于现代直流伺服系统。
关键词:PWM控制电路 CPLD VHDL
在直流伺服控制系统中,通过专用集成芯片或中小规模的数字集成电路构成的传统PWM控制电路往往存在电路设计复杂,体积大,抗干扰能力差以及设计困难、设计周期长等缺点因此PWM控制电路的模块化、集成化已成为发展趋势。它不仅可以使系统体积减小、重量减轻且功耗降低,同时可使系统的可靠性大大提高。随着电子技术的发展,特别是专用集成电路(ASIC)设计技术的日趋完善,数字化的电子自动化设计(EDA)工具给电子
[电源管理]