CCWO Embedded Space

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

STM32 F401RE ADC その1

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

次はAD変換をやっていきたいと思います。
まずは、簡単な連続キャリブレーション状態にしておいて値を読んでいきます。
CubeMXの設定はこちら。
f:id:CCWO:20160916013030p:plain
USART2->Asynchronous: PA2, PA3:
ADC1->IN0: PA0
としました。Configuration設定はとくにいじっていません。
mainは次のようになりました。
・main.c

/* 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 ---------------------------------------------------------*/

/* 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);
}
/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */
	int adc1 = 1;
	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 */
  HAL_ADCEx_InjectedStart(&hadc1);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  //if(HAL_ADC_GetState(&hadc1) == HAL_ADC_STATE_EOC_REG){
		  adc1 = HAL_ADC_GetValue(&hadc1);
		  sprintf(str, "AD0: %04X\n", adc1);
		  sio_puts(str);
	  //}
	  HAL_ADC_Stop(&hadc1);
	  HAL_Delay(100);
		  
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

これで100msおきにTeraTermでデバッグを行いました。その結果がこちら。
f:id:CCWO:20160916013302p:plain
半固定抵抗を回転させ16進表示で値が000→FFF(12bit)で値が増えているのが確認できました。
ただ、ステータスをとるHAL_ADC_GetState(&hadc1)これが永遠に1にならないのでコメントアウトしました。詳しい資料を読む必要があります。
f:id:CCWO:20160916075114j:plain

20160916の記事