完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用tiM2输入捕获,TIM3进行pwm输出,但是进入中断后TIM_GetCapture1接受到的数据为零
贴上我的驱动代码,希望有其他调试的方法可以推荐 #include "time.h" #include "STM32f10x_tim.h" #include "usart.h" #include "delay.h" TIM_ICInitTypeDef TIM_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; u8 DutyCycle = 0; u8 Frequency = 0; u8 IC2Value=0; //定时器2GPIO配置 void TIM2_GPIO_INIT(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //GPIO_InitTypeDef GPIO_InitStructure; //GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,DISABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//ÉèÖÃΪ¸¡¿ÕÊäÈ룬ÒÔÃâ¸ÉÈÅ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); } //定时器2输入捕获配置 void TIM2_ICMODE_INIT(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); TIM_TimeBaseStructure.TIM_Period=65535; TIM_TimeBaseStructure.TIM_Prescaler=3; TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure); //TIM_InitStructure.TIM_ICMode=TIM_ICMode_PWMI;// //TIM2->CCER|=0x1; //TIM2->CCMR1|=0X0011; TIM_ICStructInit( TIM_InitStructure); TIM_InitStructure.TIM_Channel=TIM_Channel_1; TIM_InitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;// TIM_InitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;// TIM_InitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV4;// TIM_InitStructure.TIM_ICFilter = 0x0; //½á¹¹³õʼ»¯ TIM_ICInit(TIM2, TIM_InitStructure); TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2);// TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //¸´Î»Ä£Ê½£¬Ñ¡ÖеĴ¥·¢ÊäÈëÉÏÉýÑسõʼ»¯¼ÆÊýÆ÷ //TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2); // // TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //ʹÄÜ´Óģʽ TIM_Cmd(TIM2, ENABLE); //定时器2中断使能 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //NVIC NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( NVIC_InitStructure); //??TIM2 /* Enable the CC2 Interrupt Request */ TIM_ITConfig(TIM2,TIM_IT_CC2|TIM_IT_Update,ENABLE);// } //定时器2中断函数,占空比,频率计数 void TIM2_IRQHandler(void) { TIM_ClearFlag(TIM2,TIM_FLAG_CC2); TIM_ClearITPendingBit(TIM2,TIM_IT_CC2|TIM_IT_Update); //|TIM_IT_Update //TIM_ClearFlag(TIM2,TIM_FLAG_Update); delay_ms(2); IC2Value = TIM_GetCapture2(TIM2); if (IC2Value != 0) { //DutyCycle = (TIM_GetCapture2(TIM2))*100 / IC2Value; //printf("tim2:%d",TIM_GetCapture2(TIM2)); Frequency = 72000000 / IC2Value; DutyCycle = (TIM_GetCapture1(TIM2))*100 / IC2Value; delay_ms(2); } else { DutyCycle = 0; Frequency = 0; } } //定时器3GPIO配置 void TIM3_GPIO_Config(void) { // //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//| RCC_APB2Periph_GPIOB GPIO_InitStructure.GPIO_Pin= GPIO_Pin_7 ;//|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure);// } //定时器3PWM输出配置 void TIM3_OCMODE_INIT(void) { u16 CCR1_Val= 200; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period= 1000-1; TIM_TimeBaseStructure.TIM_Prescaler=7199;// TIM_TimeBaseStructure.TIM_ClockDivision=0;// TIM_CKD_DIV1 TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); //FREQRENCY=int_CLK/((TIM_Period+1)*(TIM_Prescaler+1)) TIM_OCStructInit( TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1; //TIM_OCInitStructure.TIM_Channel= TIM_Channel_1; TIM_OCInitStructure.TIM_Pulse=CCR1_Val;// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity_High TIM_OC2Init(TIM3, TIM_OCInitStructure); //TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_Cmd(TIM3,ENABLE); } |
|
相关推荐
1个回答
|
|
首先,我们需要确保您的代码中没有语法错误。在您提供的代码片段中,有一些拼写错误和不完整的类型定义。以下是修正后的代码:
```c #include "time.h" #include "stm32f10x_tim.h" #include "usart.h" #include "delay.h" TIM_ICInitTypeDef TIM_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; ``` 接下来,我们需要检查以下几个方面以确保PWM捕获功能正常工作: 1. 确保TIM2和TIM3的时钟已经启用。您可以通过以下代码启用时钟: ```c RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); ``` 2. 确保GPIO引脚已正确初始化。以下是初始化TIM2输入捕获和TIM3 PWM输出的示例代码: ```c GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` 3. 初始化TIM2和TIM3。以下是初始化TIM2为输入捕获模式和TIM3为PWM输出模式的示例代码: ```c TIM_TimeBaseStructure.TIM_Period = 10000 - 1; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_PWMIConfig(TIM2, &TIM_ICInitStructure); TIM_TimeBaseStructure.TIM_Period = 10000 - 1; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); ``` 4. 启用TIM2输入捕获中断和TIM3 PWM输出: ```c TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_Init(&NVIC_InitStructure); ``` 5. 启动TIM2和TIM3: ```c TIM_Cmd(TIM2, ENABLE); TIM_Cmd(TIM3, ENABLE); ``` 6. 在中断服务例程中,检查TIM_GetCapture1()的返回值: ```c void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { uint32_t capture_value = TIM_GetCapture1(TIM2); // 处理捕获值 TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); } } ``` 如果以上步骤都正确执行,但仍然没有捕获到数据,建议您检查硬件连接,确保TIM2的输入捕获引脚和TIM3的PWM输出引脚已正确连接。此外,您还可以使用示波器或逻辑分析仪来监视PWM信号,以确保信号质量和时序。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1934 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1710 浏览 1 评论
1187 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
785 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1752 浏览 2 评论
1992浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
827浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
281浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
638浏览 3评论
645浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-3 10:20 , Processed in 0.806542 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号