STM8S003F3は、タイマーを使用して方形波周期を計算します

stm8をスレーブとして使用し、線を使用して方形波を受信し、赤色ライトのオン、黄色ライトのオン、ブザーのオンなどのさまざまな機能を実現する必要があります。

そこで問題が発生します。以前は、一度にいくつの方形波を送信してさまざまな機能を実現しようとしましたが、結局、この方法が機能しないことがわかりました。後で、ホストから送信される方形波周波数によって実現できるさまざまな機能、つまり、毎回送信される方形波の周期を知ることについて考えました。

では、方形波の周期を計算する方法は?この機能を実現するためのアイデアをくれた同僚に感謝します。

1つ目はgpioの外部割り込みを行うことです。ここでは、メイン関数にgpio PD4を設定します。立ち下がりエッジがあると、割り込み処理関数に入ります。

GPIO_Init(GPIOD,GPIO_PIN_4, GPIO_MODE_IN_FL_IT );//接收方波初始化
EXTI_DeInit();
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD , EXTI_SENSITIVITY_FALL_ONLY);

main関数のタイマーtimer2の構成は次のとおりです。

//内部时钟为16M,因此这个设置时以10ms进入一次中断
TIM2_DeInit();  
TIM2_TimeBaseInit(TIM2_PRESCALER_16, 9999);       
TIM2_PrescalerConfig(TIM2_PRESCALER_16, TIM2_PSCRELOADMODE_UPDATE);  
TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);  
TIM2_SetCounter(0x0000);  
TIM2_Cmd(ENABLE);  
TIM2_ClearFlag(TIM2_FLAG_UPDATE);

TIM2_ITConfig( TIM2_IT_UPDATE, ENABLE);
TIM2_Cmd(ENABLE); 

gpioの外部割り込み機能で、次のように設定します。

INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  //GPIO_WriteReverse(GPIOD,GPIO_PIN_3);  
  flag ^= 0x01;
  if(flag == 0)
  	test_time = 0;
  else{
	tmp_count = test_time;
  }
}

timer2の外部割り込み処理機能で、次のように設定します。

 INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
 {
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
     
     TIM2_ClearFlag( TIM2_FLAG_UPDATE);//记得要清除标志位,否则会出问题
	 test_time++;
   
 }

このように、フラグが0の場合はクリアされ、1の場合はデータが送信されます。これは、サイクルの時間を知ることと同じです。

問題があります:この書き方で問題は解決しますが、タイマーが先に進み、メイン機能がタイマーよりも遅くなる可能性があるため、プログラムの開始時に問題が発生する可能性があります。最初は、問題が発生する可能性があります。失われますが、後で安定します。

おすすめ

転載: blog.csdn.net/smile_5me/article/details/105843646