CCWO Embedded Space

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

STM32 F401RE 7セグメントLED

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

本の順番に則って次は7セグメントLEDをダイナミック点灯していきたいと思います。
ダイナミック点灯とは、
LEDのダイナミック点灯とは | 大塚商会
のように一桁ずつ順に7セグメントLEDを点灯しあたかもすべて同時に点灯しているように見せる方法のことです。
今回はこちらの
http://akizukidenshi.com/catalog/g/gI-04450/
4桁の青色7セグメントLEDを使ってダイナミック点灯をします。
ピン配置とピンアサインは次のようになっています。
f:id:CCWO:20160914223004p:plain
f:id:CCWO:20160914223009p:plain
まずはSTM32CubeMXの設定を行います。
f:id:CCWO:20160914223603p:plain
ピンの設定は設定したいピンをクリックし、周辺機能を選択(GPIO_Output)し、右クリックを押しEnter User Labelを選択し、ラベルをわかりやすい名前に変更します。
また、NUCLEO-F401RE上のピン配置は次のようになっています。
f:id:CCWO:20160914223824p:plain
これでコードを生成します。
main.cは次のようになりました。ピンアサインはプログラム中に記載しました。

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
/*
	7SEGMENT LED Pin Assgin
	SEL3 (DIG4)	-> PC11
	SEL2 (DIG3)	-> PC10
	SEL1 (DIG2)	-> PC9
	SEL0 (DIG1)	-> PC8
	SEG7(A) 		-> PC7
	SEG6(B) 		-> PC6
	SEG5(C) 		-> PC5
	SEG4(D) 		-> PC4
	SEG3(E) 		-> PC3
	SEG2(F) 		-> PC2
	SEG1(G) 		-> PC1
	SEG0(DP) 		-> PC0
*/
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
void SelectSel(int sel)
{
	int mask;
	
	// セルが0-3以外の時はSEL3-0は消灯
	if((sel<0)||(sel>3)){
		HAL_GPIO_WritePin(GPIOC, 0xf00, GPIO_PIN_RESET);
		return;
	}
	
	sel = 3 - sel;
	
	// 選択されたセルのSELを点灯
	mask=(1<<(sel+8));
	HAL_GPIO_WritePin(GPIOC, mask, GPIO_PIN_SET);
	// 選択されたセル以外のSELを消灯
	mask=(~mask)&0xf00;
	HAL_GPIO_WritePin(GPIOC, mask, GPIO_PIN_RESET);
}

void ShowSeg(int val)
{
	char pat[16] = { 0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe4,		// 0-7
							0xfe, 0xe6, 0xee, 0x3e, 0x1a, 0x7a, 0x9e, 0x8e};	// 8-F
	int mask;
	mask = pat[val];
							HAL_GPIO_WritePin(GPIOC, mask, GPIO_PIN_RESET);
							mask = (~mask)&0xff;
							HAL_GPIO_WritePin(GPIOC, mask, GPIO_PIN_SET);
}

void ShowData(int dat)
{
	int i;
	int val;
	
	for(i = 0; i < 4; i++){
		val = (dat & 0x0f);
		ShowSeg(val);
		SelectSel(i);
		HAL_Delay(1);
		SelectSel(-1);
		dat>>=4;
	}
}

/* USER CODE END 0 */

int main(void)
{

	int i;
  /* USER CODE BEGIN 1 */
  /* 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();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  ShowData(0x1234);
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

とりあえず1234を表示できましたが、なにか釈然としないような・・・w
(RESETとSETが逆なんだよな~~・・・)どうやらこれであってるみたいだ・・・本のSETとRESETが逆になっている模様。
点灯した様子はこんな感じ!青色はキレイだな~
f:id:CCWO:20160915003037j:plain
f:id:CCWO:20160915003109j:plain

20170914の記事