STM32-F746NG-DISCO Project.

Dependencies:   BSP_DISCO_F746NG

Committer:
chri721u
Date:
Wed Jan 08 14:41:01 2020 +0000
Revision:
2:f3bee2fcc2a0
Parent:
1:0c13955ae7ae
Child:
3:1d1ced98a985
FIXED DIGITAL INPUT;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chri721u 0:6b60860a3ffe 1 /*
chri721u 0:6b60860a3ffe 2 Author: Christian Andresen
chri721u 1:0c13955ae7ae 3 Website: xcha11.skp-dp.sde.dk
chri721u 2:f3bee2fcc2a0 4 Date: 10-01-2020
chri721u 2:f3bee2fcc2a0 5 Brief: Basic arduino project involving sensors (Button, Touch), digital output (LED, Buzzer), and onboard LCD Screen.
chri721u 0:6b60860a3ffe 6
chri721u 0:6b60860a3ffe 7 */
chri721u 2:f3bee2fcc2a0 8 #include "mbed.h" // mbed-os 5
chri721u 2:f3bee2fcc2a0 9 #include "stm32746g_discovery_lcd.h" // Last updated 27/11/2019
chri721u 2:f3bee2fcc2a0 10
chri721u 2:f3bee2fcc2a0 11 // D2-D4: DigitalIN, D5-D8: DigitalOut.
chri721u 0:6b60860a3ffe 12 DigitalIn button(D2);
chri721u 0:6b60860a3ffe 13 DigitalIn touch(D3);
chri721u 2:f3bee2fcc2a0 14 //InterruptIn button(D2);
chri721u 2:f3bee2fcc2a0 15 //InterruptIn touch(D3);
chri721u 0:6b60860a3ffe 16 DigitalOut led(D5);
chri721u 0:6b60860a3ffe 17 DigitalOut buzzer(D6);
chri721u 0:6b60860a3ffe 18
chri721u 2:f3bee2fcc2a0 19 // Multithreading
chri721u 2:f3bee2fcc2a0 20 Thread firstThread;
chri721u 2:f3bee2fcc2a0 21 Thread secondThread;
chri721u 2:f3bee2fcc2a0 22
chri721u 2:f3bee2fcc2a0 23 // Prototype for the blue screen of death.
chri721u 0:6b60860a3ffe 24 void bluescreen();
chri721u 2:f3bee2fcc2a0 25 // Visible ints, used to register button presses and touch-sensor activation.
chri721u 0:6b60860a3ffe 26 int button_count;
chri721u 0:6b60860a3ffe 27 int touch_count;
chri721u 2:f3bee2fcc2a0 28 // Integer used for the 9999 counter.
chri721u 2:f3bee2fcc2a0 29 int countup;
chri721u 2:f3bee2fcc2a0 30 // restarts is an invisible int, gaining 1 in value eachtime countup reaches 9999. Used for the bluescreen() event.
chri721u 2:f3bee2fcc2a0 31 int restarts;
chri721u 0:6b60860a3ffe 32
chri721u 2:f3bee2fcc2a0 33 // 9999 counter program. Added above main for multithread ability.
chri721u 2:f3bee2fcc2a0 34 void ninecounter()
chri721u 2:f3bee2fcc2a0 35 {
chri721u 2:f3bee2fcc2a0 36 HAL_Delay(3000);
chri721u 2:f3bee2fcc2a0 37 while(1) {
chri721u 2:f3bee2fcc2a0 38 if (countup != 9999) {
chri721u 2:f3bee2fcc2a0 39 wait(0.001);
chri721u 2:f3bee2fcc2a0 40 countup++;
chri721u 2:f3bee2fcc2a0 41
chri721u 2:f3bee2fcc2a0 42 } else {
chri721u 2:f3bee2fcc2a0 43 countup = 9900;
chri721u 2:f3bee2fcc2a0 44 restarts++;
chri721u 2:f3bee2fcc2a0 45 }
chri721u 2:f3bee2fcc2a0 46 }
chri721u 2:f3bee2fcc2a0 47 }
chri721u 2:f3bee2fcc2a0 48 /* // USE ONLY IF TOUCH SENSOR AND BUTTON ARE INTERRUPT-IN
chri721u 2:f3bee2fcc2a0 49 void buttonpress() {
chri721u 2:f3bee2fcc2a0 50 led = 1; // Turn LED on
chri721u 2:f3bee2fcc2a0 51 buzzer = 1; // Emit sound from buzzer
chri721u 2:f3bee2fcc2a0 52 wait(0.25);
chri721u 2:f3bee2fcc2a0 53 button_count++; // Register a button has been pressed, so it can be displayed later.
chri721u 2:f3bee2fcc2a0 54 led = 0; // Turn LED off
chri721u 2:f3bee2fcc2a0 55 buzzer = 0; // Halt sound emmital from buzzer.
chri721u 2:f3bee2fcc2a0 56 }
chri721u 2:f3bee2fcc2a0 57
chri721u 2:f3bee2fcc2a0 58 void touchpress() {
chri721u 2:f3bee2fcc2a0 59 led = 1; // Turn LED on
chri721u 2:f3bee2fcc2a0 60 wait(0.25);
chri721u 2:f3bee2fcc2a0 61 touch_count++; // Register that the touch sensor has been triggered, so it can be displayed layer.
chri721u 2:f3bee2fcc2a0 62 led = 0; // Turn LED off
chri721u 2:f3bee2fcc2a0 63 } */
chri721u 2:f3bee2fcc2a0 64
chri721u 2:f3bee2fcc2a0 65 void inputcounter()
chri721u 2:f3bee2fcc2a0 66 {
chri721u 2:f3bee2fcc2a0 67 HAL_Delay(3000);
chri721u 2:f3bee2fcc2a0 68 while(1) {
chri721u 2:f3bee2fcc2a0 69 //button.rise(&buttonpress); USE IF BUTTON IS INTERRUPT IN (BRUG IKKE RISE I WHILE - Flyt 2 linjer op)
chri721u 2:f3bee2fcc2a0 70 //touch.rise(&touchpress); USE IF TOUCH SENSOR IS INTERRUPT IN
chri721u 2:f3bee2fcc2a0 71
chri721u 2:f3bee2fcc2a0 72 // USE IF BUTTON AND TOUCH SENSOR IS DIGITAL IN
chri721u 2:f3bee2fcc2a0 73 // Register if the button has been pressed.
chri721u 2:f3bee2fcc2a0 74 if(button) {
chri721u 2:f3bee2fcc2a0 75 led = 1; // Turn LED on
chri721u 2:f3bee2fcc2a0 76 buzzer = 1; // Emit sound from buzzer
chri721u 2:f3bee2fcc2a0 77 wait(0.5);
chri721u 2:f3bee2fcc2a0 78 button_count++; // Register a button has been pressed, so it can be displayed later.
chri721u 2:f3bee2fcc2a0 79 led = 0; // Turn LED off
chri721u 2:f3bee2fcc2a0 80 buzzer = 0; // Halt sound emmital from buzzer.
chri721u 2:f3bee2fcc2a0 81 }
chri721u 2:f3bee2fcc2a0 82 // Register if touchscreen has been touched.
chri721u 2:f3bee2fcc2a0 83 else if(touch) {
chri721u 2:f3bee2fcc2a0 84 led = 1; // Turn LED on
chri721u 2:f3bee2fcc2a0 85 wait(0.69);
chri721u 2:f3bee2fcc2a0 86 touch_count++; // Register that the touch sensor has been triggered, so it can be displayed layer.
chri721u 2:f3bee2fcc2a0 87 led = 0; // Turn LED off
chri721u 2:f3bee2fcc2a0 88 }
chri721u 2:f3bee2fcc2a0 89 // If nothing is being toched, prevent anything from happening.
chri721u 2:f3bee2fcc2a0 90 else {
chri721u 2:f3bee2fcc2a0 91 led = 0;
chri721u 2:f3bee2fcc2a0 92 buzzer = 0;
chri721u 2:f3bee2fcc2a0 93 }
chri721u 2:f3bee2fcc2a0 94 }
chri721u 2:f3bee2fcc2a0 95 }
chri721u 0:6b60860a3ffe 96 // Main part of the program
chri721u 0:6b60860a3ffe 97 int main()
chri721u 0:6b60860a3ffe 98 {
chri721u 2:f3bee2fcc2a0 99 firstThread.start(&ninecounter); // Start multithread main and ninecounter()
chri721u 2:f3bee2fcc2a0 100 secondThread.start(&inputcounter);
chri721u 2:f3bee2fcc2a0 101
chri721u 2:f3bee2fcc2a0 102 // Prepare 3 text elements for later print to LCD
chri721u 1:0c13955ae7ae 103 uint8_t text1[30];
chri721u 1:0c13955ae7ae 104 uint8_t text2[30];
chri721u 2:f3bee2fcc2a0 105 uint8_t text3[30];
chri721u 2:f3bee2fcc2a0 106 // Give integers a default value of 0
chri721u 0:6b60860a3ffe 107 button_count = 0;
chri721u 0:6b60860a3ffe 108 touch_count = 0;
chri721u 2:f3bee2fcc2a0 109 countup = 9900;
chri721u 2:f3bee2fcc2a0 110 restarts = 0;
chri721u 1:0c13955ae7ae 111
chri721u 2:f3bee2fcc2a0 112 // Boot up LCD screen
chri721u 0:6b60860a3ffe 113 BSP_LCD_Init();
chri721u 0:6b60860a3ffe 114 BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS);
chri721u 0:6b60860a3ffe 115 BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
chri721u 2:f3bee2fcc2a0 116
chri721u 0:6b60860a3ffe 117 // Clear the screen, add black background and red text
chri721u 0:6b60860a3ffe 118 BSP_LCD_Clear(LCD_COLOR_BLACK);
chri721u 0:6b60860a3ffe 119 BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
chri721u 0:6b60860a3ffe 120 BSP_LCD_SetTextColor(LCD_COLOR_RED);
chri721u 2:f3bee2fcc2a0 121
chri721u 0:6b60860a3ffe 122 // Bootup Message
chri721u 0:6b60860a3ffe 123 BSP_LCD_DisplayStringAt(0, 130, (uint8_t *) "SYSTEM BOOTING", CENTER_MODE);
chri721u 2:f3bee2fcc2a0 124 HAL_Delay(2500);
chri721u 2:f3bee2fcc2a0 125 // Change LCD Screen to system
chri721u 0:6b60860a3ffe 126 BSP_LCD_Clear(LCD_COLOR_BLACK);
chri721u 2:f3bee2fcc2a0 127 // Studio name & department
chri721u 2:f3bee2fcc2a0 128 BSP_LCD_DisplayStringAt(0, 25, (uint8_t *) "HELLDROP STUDIO SOFTWARE", CENTER_MODE);
chri721u 2:f3bee2fcc2a0 129 BSP_LCD_DisplayStringAt(0, 250, (uint8_t *) "Code by Christian Andresen", CENTER_MODE);
chri721u 0:6b60860a3ffe 130
chri721u 2:f3bee2fcc2a0 131 while(restarts < 10) {
chri721u 1:0c13955ae7ae 132 sprintf((char*)text1, "Button count: %d", button_count);
chri721u 1:0c13955ae7ae 133 sprintf((char*)text2, "Touch count: %d", touch_count);
chri721u 2:f3bee2fcc2a0 134 sprintf((char*)text3, " %d (%d) ", countup, restarts);
chri721u 1:0c13955ae7ae 135
chri721u 2:f3bee2fcc2a0 136 BSP_LCD_DisplayStringAt(0, 75, (uint8_t *)&text1, CENTER_MODE);
chri721u 2:f3bee2fcc2a0 137 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)&text2, CENTER_MODE);
chri721u 2:f3bee2fcc2a0 138 BSP_LCD_DisplayStringAt(0, 175, (uint8_t *)&text3, CENTER_MODE);
chri721u 2:f3bee2fcc2a0 139 }
chri721u 2:f3bee2fcc2a0 140 if (restarts >= 10) {
chri721u 2:f3bee2fcc2a0 141 bluescreen();
chri721u 0:6b60860a3ffe 142 }
chri721u 0:6b60860a3ffe 143 }
chri721u 0:6b60860a3ffe 144
chri721u 0:6b60860a3ffe 145 void bluescreen()
chri721u 0:6b60860a3ffe 146 {
chri721u 0:6b60860a3ffe 147 //BLUE SCREEN OF DEATH
chri721u 0:6b60860a3ffe 148 BSP_LCD_Clear(LCD_COLOR_BLUE);
chri721u 0:6b60860a3ffe 149 BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
chri721u 0:6b60860a3ffe 150 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
chri721u 2:f3bee2fcc2a0 151 BSP_LCD_DisplayStringAt(0, 75, (uint8_t *) "This device has", CENTER_MODE);
chri721u 2:f3bee2fcc2a0 152 BSP_LCD_DisplayStringAt(0, 100, (uint8_t *) "encountered", CENTER_MODE);
chri721u 2:f3bee2fcc2a0 153 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *) "a fatal error", CENTER_MODE);
chri721u 2:f3bee2fcc2a0 154 BSP_LCD_DisplayStringAt(0, 150, (uint8_t *) "and needs to reboot.", CENTER_MODE);
chri721u 2:f3bee2fcc2a0 155 BSP_LCD_DisplayStringAt(0, 250, (uint8_t *) "HAL Error", LEFT_MODE);
chri721u 2:f3bee2fcc2a0 156 BSP_LCD_DisplayStringAt(0, 250, (uint8_t *) "ERROR CODE: 40", RIGHT_MODE);
chri721u 0:6b60860a3ffe 157 }