STM32 F401RE 7セグメントLED
開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本
定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ)
- 作者:芹井 滋喜
- 発売日: 2016/01/29
- メディア: 単行本
本の順番に則って次は7セグメントLEDをダイナミック点灯していきたいと思います。
ダイナミック点灯とは、
・LEDのダイナミック点灯とは | 大塚商会
のように一桁ずつ順に7セグメントLEDを点灯しあたかもすべて同時に点灯しているように見せる方法のことです。
今回はこちらの
・http://akizukidenshi.com/catalog/g/gI-04450/
4桁の青色7セグメントLEDを使ってダイナミック点灯をします。
ピン配置とピンアサインは次のようになっています。
まずはSTM32CubeMXの設定を行います。
ピンの設定は設定したいピンをクリックし、周辺機能を選択(GPIO_Output)し、右クリックを押しEnter User Labelを選択し、ラベルをわかりやすい名前に変更します。
また、NUCLEO-F401RE上のピン配置は次のようになっています。
これでコードを生成します。
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が逆になっている模様。
点灯した様子はこんな感じ!青色はキレイだな~
20170914の記事