CCWO Embedded Space

CCWOの日々の開発を発信するブログ

STM32 F401RE ADC その3

開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本

割り込みの次はマルチチャネルの読み出しを試そうとしましたが・・・
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のドキュメントを読んで見ようと思います。
f:id:CCWO:20160917010823p:plain
デバッガありなしにかかわらず割り込み一回しかきてない模様。

20160917の記事