初级会员

- 积分
- 57
- 金钱
- 57
- 注册时间
- 2017-9-12
- 在线时间
- 4 小时
|
8金钱
F103 战舰的输入捕获实验中
我按照实例的程序写了一遍,发现PWM的灯不亮了,串口里也没有任何数据打印出来,我弄了两天,发现把这一行屏蔽了
TIM5_ICInit(0XFFFF,72-1);
PWM灯部分就可以正常运行,可是那个TIM5_ICInit()函数我改了几遍,最后都复制了范例中写源程序,但是把这一句代码加上去之后总是老样子,PWM等不亮,串口也无输出,但是用光盘里示例的程序烧进去,就一切正常。应该是在TIM5_ICInit()这里卡住了,可我看了好几遍也没什么不一样,今天搞这一个第三天了,一直弄不出来,心累。
PS.Timer.c 和头文件是照着写的,函数名稍微改动了一点
真心感谢大神们的解答
main.c文件:
[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "Timer.h"
extern u8 TIM5CH1_CAPTURE_STA; //êäèë2¶»ñ×′ì¬
extern u16 TIM5CH1_CAPTURE_VAL; //êäèë2¶»ñÖμ
int main(void)
{
u32 temp=0;
delay_init(); //Ñóê±oˉêy3õê¼»ˉ
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
uart_init(115200); //′®¿ú3õê¼»ˉÎa115200
LED_Init(); //LED¶Ë¿ú3õê¼»ˉ
TIM3_PWMInit(899,0); //2»·ÖÆμ¡£PWMÆμÂê=72000/(899+1)=80Khz
TIM5_ICInit(0XFFFF,72-1); //òÔ1MhzμÄÆμÂê¼Æêy
while(1)
{
delay_ms(10);
TIM_SetCompare2(TIM3,TIM_GetCapture2(TIM3)+1);
if(TIM_GetCapture2(TIM3)==300)TIM_SetCompare2(TIM3,0);
if(TIM5CH1_CAPTURE_STA&0X80)//3é1|2¶»ñμ½áËò»′ÎéÏéyÑØ
{
temp=TIM5CH1_CAPTURE_STA&0X3F;
temp*=65536;//òç3öê±¼ä×üoí
temp+=TIM5CH1_CAPTURE_VAL;//μÃμ½×üμĸßμçÆ½ê±¼ä
printf("HIGH:%d us\r\n",temp);//′òó¡×üμĸßμãÆ½ê±¼ä
TIM5CH1_CAPTURE_STA=0;//¿aÆôÏÂò»′Î2¶»ñ
}
}
}[/mw_shl_code]
Timer.h文件:
[mw_shl_code=c,true]#ifndef __TIMER_H__
#define __TIMER_H__
#include "stm32f10x.h"
//extern u8 TIM5CH1_CAPTURE_STA; //êäèë2¶»ñ×′ì¬×Ö
//extern u16 TIM5CH1_CAPTURE_VAL; //êäèë2¶»ñÖμ
void TIM3_Init(u16 arr,u16 psc);
void TIM3_PWMInit(u16 arr,u16 psc);
//DT¸ÄÕ¼¿Õ±è void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM5_ICInit(u16 arr,u16 psc);
void TIM5_Cap_Init(u16 arr,u16 psc);
#endif
[/mw_shl_code]
Timer.c 文件:
[mw_shl_code=c,true]#include "Timer.h"
#include "led.h"
u8 TIM5CH1_CAPTURE_STA=0; //êäèë2¶»ñ×′ì¬×Ö
u16 TIM5CH1_CAPTURE_VAL ; //êäèë2¶»ñÖμ
void TIM3_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitInstrucure;
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
TIM_TimeBaseInitInstrucure.TIM_ClockDivision=TIM_CKD_DIV1; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseInitInstrucure.TIM_CounterMode=TIM_CounterMode_Up; //TIMÏòéϼÆêyÄ£ê½
TIM_TimeBaseInitInstrucure.TIM_Period=arr; //éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ ¼Æêyμ½5000Îa500ms
TIM_TimeBaseInitInstrucure.TIM_Prescaler=psc; ////éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ 10KhzμļÆêyÆμÂê
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitInstrucure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ
NVIC_Init(&NVIC_InitStructure); //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //ê1ÄüÖ¸¶¨μÄTIM3ÖD¶Ï,ÔêDí¸üDÂÖD¶Ï
TIM_Cmd(TIM3,ENABLE); //ê1ÄüTIMxíaéè
}
void TIM3_IRQHandler() //TIM3ÖD¶Ï
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)) //¼ì2éÖ¸¶¨μÄTIMÖD¶Ï·¢éúóë·ñ:TIM ÖD¶ÏÔ′
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //Çå3yTIMxμÄÖD¶Ï′y′|àíλ:TIM ÖD¶ÏÔ′
LED1=!LED1;
}
}
void TIM3_PWMInit(u16 arr,u16 psc)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitInstrucure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
TIM_TimeBaseInitInstrucure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitInstrucure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitInstrucure.TIM_Period=arr;
TIM_TimeBaseInitInstrucure.TIM_Prescaler=psc;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitInstrucure); //2
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC2Init(TIM3,&TIM_OCInitStructure); //3
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //4
TIM_Cmd(TIM3,ENABLE); //5
}
void TIM5_ICInit(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0ÏÂà-
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //2»·ÖÆμ
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=arr;
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; //2¶»ñí¨μàÑ¡Ôñ
TIM_ICInitStructure.TIM_ICFilter=0; //ÂË2¨Æ÷3¤¶è£¬0Îa2»ÂË2¨
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; //éÏéyÑØ»1êÇϽμÑØ2¶»ñ
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //Ô¤·ÖÆμÏμêy
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//Ö±½óó3é䣨¿éòÔó3éäμ½±eμÄμØ·½£©
TIM_ICInit(TIM5,&TIM_ICInitStructure);
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //óëTIM3óÅÏè¼¶1ØÏμòa2»3åí»
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //óëTIM3óÅÏè¼¶1ØÏμòa2»3åí»
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE); //ÔêDí¸üDÂÖD¶Ï ,ÔêDíCC1IE2¶»ñÖD¶Ï
TIM_Cmd(TIM5,ENABLE);
}
void TIM5_IRQHandler(void)
{
if((TIM5CH1_CAPTURE_STA & 0x80)==0) //2¶»ñÎ′íê3é
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=0)
{
if((TIM5CH1_CAPTURE_STA&0x40)!=0) //òѾ-2¶»ñμ½¸ßμçÆ½
{
if((TIM5CH1_CAPTURE_STA&0x3f)==0x3f) //¸ßμçÆ½ì«3¤áË
{
TIM5CH1_CAPTURE_STA|=0x80;
TIM5CH1_CAPTURE_VAL=0xffff; //2¶»ñμÄÂö3åì«3¤£¬′ïμ½×î′óÖ죬£¨òÑòç3ö£©
}else TIM5CH1_CAPTURE_STA++; //Õy3£Çé¿ö
}
}
if(TIM_GetITStatus(TIM5,TIM_IT_CC1)!=0)
{
if(TIM5CH1_CAPTURE_STA&0x40)
{
TIM5CH1_CAPTURE_STA|=0x80;
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);
}
else //»1Î′¿aê¼£¬μúò»′Î2¶»ñéÏéyÑØ
{
TIM5CH1_CAPTURE_STA=0;
TIM5CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM5,0); //éèÖÃμ±Ç°ÖμÎa0£»
TIM5CH1_CAPTURE_STA|=0x40;
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);
}
}
} //ÕaàïμÄà¨oÅ3öáËÎêìaÔ-à′D′ÔúáËéÏÃæ
TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC1);
}[/mw_shl_code]
|
|