
STM32-F746NG-DISCO Project.
Dependencies: BSP_DISCO_F746NG
main.cpp@2:f3bee2fcc2a0, 2020-01-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |