[tr][/tr]
刚好有这个资料
- 第一部:
- 内部时钟 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //16M
- 第二步:
- 配置IO口 我用的是STM8S103k3t6
- GPIO_Init(GPIOB , GPIO_PIN_0 , GPIO_MODE_IN_PU_NO_IT);//TIM1_CH1 PB0端口
- 第三步:TIM1初始化,
- 注意:
- tim1 分频是16000000/1600 =10000
- 那计数一下的时间是!1/10000 S
- 向上计数 0到20000 的时间是2S
- void TIME1_INIT(void)
- {
- TIM1_DeInit();
- TIM1_TimeBaseInit(1600, TIM1_COUNTERMODE_UP, 20000, 0);
- TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI , TIM1_ICPSC_DIV8, 0x0);
- TIM1_ITConfig( TIM1_IT_CC1 , ENABLE);
- TIM1_ClearFlag(TIM1_FLAG_CC1);
- TIM1_Cmd(ENABLE);
- }
- 第四步: TIM4用来产生溢出中断用的!
- void TIME4_INIT(void)
- {
- TIM4_TimeBaseInit(TIM4_PRESCALER_32 ,250);
- TIM4_ARRPreloadConfig(ENABLE);
- TIM4_PrescalerConfig(TIM4_PRESCALER_32,TIM4_PSCRELOADMODE_IMMEDIATE);
- TIM4_SetAutoreload(250);
- TIM4_Cmd(ENABLE);
- TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);
- }
- 第五步: TIM1的中断程序 连续进入两次中断,两次计数的值 乘 第三步中计数一下的时间 就是脉宽
- // if(TIM1_GetFlagStatus(TIM1_FLAG_CC1))
- if(TIM1_GetITStatus(TIM1_FLAG_CC1) != RESET)
- {
- switch(temp)
- {
- case 0: ICValue1=TIM1_GetCapture1();
- temp=1;
- break;
- case 1: ICValue2=TIM1_GetCapture1();
- temp=2;
- break;
- default:
- TIM1_CCxCmd(TIM1_CHANNEL_1, DISABLE);
- TIM1_ITConfig(TIM1_IT_CC1, DISABLE);
- temp=3;
- break;
- }
- TIM1_ClearITPendingBit(TIM1_IT_CC1);
- TIM1_ClearFlag(TIM1_FLAG_CC1);
- }
- 第六步:
- TIM4的中断程序
- if(temp==3)
- {
- temp=0;
- if(ICValue2>ICValue1)
- {
- disvalue=ICValue2-ICValue1;
- }
- else if(ICValue2<ICValue1)
- {
- //disvalue=0xffff+ICValue2-ICValue1;
- disvalue=20000+ICValue2-ICValue1; //防止计数到末端的时候 重新计数
- }
- val[i0++] = disvalue;
- if(i0>10) i0=0;
- display();
- TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);
- TIM1_ITConfig(TIM1_IT_CC1, ENABLE);
- }
- else
- {
- display();
- }
- TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
[color=rgb(51, 102, 153) !important]复制代码
|
| |
|
|
|