STM32 F401RE ADC その3
開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本
定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ)
- 作者:芹井 滋喜
- 発売日: 2016/01/29
- メディア: 単行本
STM32CubeMXの設定はADC その2にPA1をADC1_IN1として追加しただけです。
デバッガで一行ずつやっていくとできるのだが・・・シングルチップモードだと、エラーで全く進まない。
以下ソースコード
/* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" /* USER CODE BEGIN Includes */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; UART_HandleTypeDef huart2; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ volatile int AdcCH = 0; volatile int AdcValue[2]; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); static void MX_USART2_UART_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ char sio_getc(void); // UARTから1文字取得 void sio_putc(char); // UARTに1文字を出力 void sio_puts(char *); // UARTに文字列を出力 /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ char sio_getc() { char ch; while(HAL_UART_Receive(&huart2, (uint8_t *)&ch, 1, 1000)==HAL_TIMEOUT) ; return ch; } void sio_putc(char ch) { HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 1000); } void sio_puts(char *str) { HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen(str), 1000); } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { ADC_ChannelConfTypeDef sConfig; AdcValue[AdcCH] = HAL_ADC_GetValue(hadc); HAL_ADC_Stop_IT(hadc); if(AdcCH == 0){ sConfig.Channel = ADC_CHANNEL_1; AdcCH = 1; } else { sConfig.Channel = ADC_CHANNEL_0; AdcCH = 0; } sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&hadc1, &sConfig); HAL_ADC_Start_IT(hadc); } /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ ADC_ChannelConfTypeDef sConfig; char str[16]; /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ AdcCH = 0; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;; HAL_ADC_ConfigChannel(&hadc1, &sConfig); HAL_ADCEx_InjectedStart(&hadc1); HAL_ADC_Start_IT(&hadc1); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { sprintf(str, "ADC0: %04X\tADC1: %04X\n", AdcValue[0], AdcValue[1]); sio_puts(str); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
ここまででAD変換やってみて、ちょっと本の解説のF103とF401はかなり違うっぽいのでしっかりHAL libraryのドキュメントを読んで見ようと思います。
デバッガありなしにかかわらず割り込み一回しかきてない模様。
20160917の記事