UP

割り込みを使う

外部割り込みの使用例としてUSERボタン(青ボタン)が押されると LCDに表示される数値が1ずつ増えていくというプログラムを書く。 前回のプロジェクトmlcdからスタートしこれに手を入れていく。

表示例

プログラム概要

変数itmp、bpを用意し割り込みが発生するとitmp++、bp=1とし、 main.cのwhile(1)ループではbpを監視しておきbpがセットされて いればitmpの値を表示しbpを0にリセットする。

使用ライブラリ

外部割り込みのルーチンのライブラリstm8l15x_exti.h/cを使うのでstm8l15x_conf.hの stm8l15x_exti.hをインクルードする行のコメントを外す。従って
#include "stm8l15x_clk.h"
#include "stm8l15x_exti.h"
#include "stm8l15x_gpio.h"
#include "stm8l15x_lcd.h"
となる。stm8l15x_exti.h/cをプロジェクトに加える。

stm8l15x_it.h/c

割り込みルーチンを宣言し書くstm8l15x_it.h/cをプロジェクトProject_template からコピーしてきてプロジェクトに加える。 stm8l15x_it.cは空の割り込みルーチンを集めたものなので、そのうち Pin1(USERボタンはPC1つまりGPIOCのPin1につながっている)の割り込みルーチン INTERRUPT_HANDLER(EXTI1_IRQHandler, 9)に処理を書き加える:
/**
  * @brief  External IT PIN1 Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(EXTI1_IRQHandler, 9)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  itmp++; bp=1;
  EXTI_ClearITPendingBit(EXTI_IT_Pin1);
}
また外部変数宣言もしておく:
extern uint16_t itmp;
extern uint8_t bp;

main.c

(GPIOC)Pin1の割り込み設定、初期化、割り込み許可をする:
  EXTI_SetPinSensitivity(GPIO_Pin_1, EXTI_Trigger_Falling);
  GPIO_Init(GPIOC,GPIO_Pin_1, GPIO_Mode_In_FL_IT);
  enableInterrupts();
while(1)ループは
  while (1)
  {
    if(bp)
    {
      bp=0;
      mint2char(itmp,tab);
      LCD_GLASS_DisplayStrDeci(tab);
    }
  }
mint2charは整数値を16bitの”文字列”に変換する関数でmain.cの 中に書いてある。16bitなのはLCD_GLASS_DisplayStrDeciが受け取る 配列の型に合わせてあるからだが、下位8bitは普通の文字コード、 上位8bitはその文字の後ろに「:」や「.」等を付けたいときに セットする(いらないときは0)。
プロジェクト一式(zipファイル)mit.zip


2012.02
mm@ils.uec.ac.jp