2019年3月19日火曜日

STM32: ADCをInterruptで使う(Nucleo-F446RE)

ADCを1チャネル、割り込みでテストしました。

参考にした記事
STM32CubeのExample「ADC_RegularConversion_Interrupt」
<STM32Cube>\Repository\STM32Cube_FW_F4_V1.24.0\Projects\STM32446E_EVAL\Examples\ADC\ADC_RegularConversion_Interrupt
「EMCU」さんの「How to use ADC in Interrupt mode

実行環境

  • Nucleo-F446RE
  • STM32CubeMX Version 5.1.0
  • System Workbench for STM32 - C/C++ Embedded Development Tools for MCU Version: 2.8.1.201903050911

プロジェクト:
https://github.com/ryood/STM32Cube_Test/tree/master/SW4STM32/Nucleo-F446_ADC_Interrupt_Test1

STM32CubeMXの設定



[Analog]-[ADC1]で[IN0]を有効化。

[IN0]の[Parameter Settings]で以下の通り設定

  • Continuous Conversion Mode: Enable
  • End Of Conversion Selection: EOC flag at the end of all conversions


[NVIC Settings]で[Enable]にチェック

SW4STM32でコードを追加(一部抜粋)

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

/* USER CODE BEGIN PV */
/* Variable used to get converted value */
__IO uint16_t uhADCxConvertedValue = 0;
/* USER CODE END PV */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
 HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
 return ch;
}
/* USER CODE END 0 */

/* USER CODE BEGIN 4 */
/**
  * @brief  Conversion complete callback in non blocking mode
  * @param  AdcHandle : AdcHandle handle
  * @note   This example shows a simple way to report end of conversion, and
  *         you can add your own implementation.
  * @retval None
  */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
  /* Get the converted value of regular channel */
  uhADCxConvertedValue = HAL_ADC_GetValue(AdcHandle);
  printf("ADC Value: %d\r\n", uhADCxConvertedValue);
}
/* USER CODE END 4 */

HAL_ADC_ConvCpltCallback()は割り込みハンドラで名前は固定です。printf()を使っていますが、ブロッキングされるので本当は割り込みハンドラ内で使ってはいけません。

メモ:


「End of Conversion Slection」(変数名はEOCSelection)は、STM32CubeのExampleでは
  AdcHandle.Init.EOCSelection          = DISABLE;
となっています。DISABLEは、stm32f4xx.hで「0U」と定義されています。

STM32Cube_FW_F4_V1.24.0では、stm32f4xx_hall_adc.hで
  /** @defgroup ADC_EOCSelection ADC EOC Selection
  * @{
  */
#define ADC_EOC_SEQ_CONV              0x00000000U
#define ADC_EOC_SINGLE_CONV           0x00000001U
#define ADC_EOC_SINGLE_SEQ_CONV       0x00000002U  /*!< reserved for future use */
と定義されています。よって「ADC_EOC_SEQ_CONV」(0U)を指定しました。

「ADC_EOC_SINGLE_CONV」(1U)の場合は、ポーリングの場合と同様に、起動時に1回割り込みがかかってそれっきりで、連続変換になりません。これはADC_CR2レジスタのEOCSビットの仕様だと思います。

0 件のコメント:

コメントを投稿