読者です 読者をやめる 読者になる 読者になる

CCWO

挫けそうになるブログ

STM32 F401RE 7セグメントLED

STM32 F401RE

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

本の順番に則って次は7セグメントLEDをダイナミック点灯していきたいと思います。
ダイナミック点灯とは、
LEDのダイナミック点灯とは | 大塚商会
のように一桁ずつ順に7セグメントLEDを点灯しあたかもすべて同時に点灯しているように見せる方法のことです。
今回はこちらの
ダイナミック接続4桁高輝度青色7セグメントLED表示器 アノードコモン アノード共通接続: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販
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