STM32L010 TIMの使い方(NVIC)


TIM2を使用し1ms Tick Counterを作成します。
確認の為、MCOを有効とし、出力ポートも設定します。

1. デバイスの設定

1.1. TIM2の設定

Timers内TIM2を選択し、Mode を以下の様に設定します。
Clock Source Internal Clock
Channel1 Output Compare No Output




Parameter Settingsを以下の様に設定します。
Prescaler 31
Counter Mode Up
Counter Period 999
system clock = 32MHzなので、Prescalerで1/32としてTIM2のクロックソースを1MHzに設定。
Counter Periodを1000カウントとすることで1msとします。
Prescalerへの設定値は分周値-1とします。
Counter Periodの設定値も-1した値とします。




1.2. RCC_MCOの設定

RCC_MCOを有効とし、System clock を出力するように設定します。

Clock ConfigurationでRCC_PCMを1/16にして出力するよう設定します。
よってRCC_MCOには2MHzが出力されます。
Maximam max speed は 2MHz 出力なので LOW でも大丈夫です。








1.3. 出力ポートの設定

どこでも良いのですが、今回は PA7 を出力ポートとするように設定します。




1.4. 割込みの設定

NVIC Interrupt Tableを選択しEnabledにチェックを入れます。
その後、Code Generateを実行。




2. コーディング

2.1. TIM2割込み処理

USER CODE PV BEGINの下に外部変数を追加します。
ここでは uint32_t g_uwTickCountとします。
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim2;

/* USER CODE BEGIN PV */
uint32_t	g_uwTickCount;

/* USER CODE END PV */
				
USER CODE BEGIN 2の下に、HAL_TIM_Base_Start_ITを記述します。
これでTIM2割込み許可となります。
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);

  /* USER CODE END 2 */
				
USER CODE BEGIN 4の下に割込み処理関数を記述します。
関数名はHAL_TIM_PeriodElapsedCallback固定です。
g_uwTickCountをインクリメント。
HAL_GPIO_TogglePin関数でTICK_OUTを1ms毎にトグルします。
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	g_uwTickCount++;
	HAL_GPIO_TogglePin(TICK_OUT_GPIO_Port, TICK_OUT_Pin);
}
/* USER CODE END 4 */
				
コーディングはここまでです。



3. 動作確認

最初にRCC_MCOの波形を確認します。

RCC_MCOの周波数は2.0172MHz、周期は495.71nsとなっています。ぴったり2MHzにならないのは HSI RC の誤差です。

次に TICK_OUT の波形を確認します。

TICK_OUT の周期は1.9827msとなっています。
RCC_MCOの周期から計算すると、
 495.71(ns) x 2 x 1000 x 2 = 1.98284(ms)
となり、ほぼ実測値と一致しています。