参考にした記事
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と定義されています。よって「ADC_EOC_SEQ_CONV」(0U)を指定しました。
* @{
*/
#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_SINGLE_CONV」(1U)の場合は、ポーリングの場合と同様に、起動時に1回割り込みがかかってそれっきりで、連続変換になりません。これはADC_CR2レジスタのEOCSビットの仕様だと思います。
0 件のコメント:
コメントを投稿