Documente Academic
Documente Profesional
Documente Cultură
STM32F429I-DISCO
ARM Cortex-M4
Ionel ZAGAN
Vasile Gheorghiță GĂITAN
MICROCONTROLERE
- NOTE APLICATIVE
Suceava, 2020
STM32F429I-DISCO ARM Cortex-M4
Cuprins
1. STM32CubeMX ............................................................................................................................2
2. Giroscopul digital cu 3 axe L3GD20 - MEMS .......................................................................17
3. STM32F429 Multi-layer Support ..........................................................................................20
4. FreeRTOS și GPIO .....................................................................................................................22
5. Template – Butoane, leduri, UART1 .....................................................................................25
6. Bluetooth HC-05 zs-040 (sau gw-040) .................................................................................30
7. WIFI ESP8266 ESP-01 ..............................................................................................................33
8. TouchGFX și STM32CubeIDE .................................................................................................38
9. Power Wake-Up ........................................................................................................................49
10. MCU Temperature ................................................................................................................49
11. IWDG (Independent watchdog) .........................................................................................50
12. WWDG (Window watchdog)...............................................................................................50
13. RNG (Random Number Generator) ...................................................................................51
14. CRC (Cyclic Redundancy Check) hardware integrat .....................................................51
15. Comanda unui motor DC și a unui motor pas cu pas .....................................................51
16. Real-time clock - RTC ...........................................................................................................54
17. Citirea unei tastaturi de tip matrice .................................................................................55
18. SIM800C GSM Module ..........................................................................................................56
19. RS485 cu adaptorul USB-RS485-WE-1800-BT (FTDI) ..................................................58
20. WaveShare Sensors Pack ....................................................................................................59
21. Template-uri TouchGFX și ARM Cortex-M7 ....................................................................67
1
STM32F429I-DISCO ARM Cortex-M4
1. STM32CubeMX
În cele ce urmează sunt descrise etapele pentru crearea unui proiect nou cu LCD TFT
Display Controller (LTDC) cu Touch Screen și UART1 folosind STM32CubeMX.
https://www.st.com/en/development-tools/stm32cubemx.html
2
STM32F429I-DISCO ARM Cortex-M4
3
STM32F429I-DISCO ARM Cortex-M4
4
STM32F429I-DISCO ARM Cortex-M4
5
STM32F429I-DISCO ARM Cortex-M4
6
STM32F429I-DISCO ARM Cortex-M4
7
STM32F429I-DISCO ARM Cortex-M4
8
STM32F429I-DISCO ARM Cortex-M4
În Keil selectați Options for Target , selectați tab-ul C/C++, apoi efectuați click pe
butonul ,
apoi pe New (Insert) , selectați și alegeti Drivers\BSP\STM32F429I-Discovery ,OK,
OK. Fereastra va apărea precum este ilustrat în figura următoare.
9
STM32F429I-DISCO ARM Cortex-M4
În main.c între liniile indicate de comentariile USER CODE BEGIN / END (la o nouă
configurare a proiectului sau adăugare de periferice utilizând CubeMX codul introdus nu va fi
șters) introduceți următorul cod:
#include "stm32f429i_discovery_lcd.h"
#include "stm32f429i_discovery_sdram.h"
#include "stm32f429i_discovery_ts.h"
#include <stdio.h>
10
STM32F429I-DISCO ARM Cortex-M4
În int main(void) introduceți următorul cod:
/* USER CODE BEGIN 1 */
uint16_t x1, y1;
/* USER CODE END 1 */
//…
/* USER CODE BEGIN 2 */
/* Initialize the LCD */
printf("\n\rLaborator-Proiect MICROCONTROLERE\n\r");
BSP_LCD_Init();
BSP_LCD_LayerDefaultInit(LCD_BACKGROUND_LAYER, LCD_FRAME_BUFFER);
BSP_LCD_LayerDefaultInit(LCD_FOREGROUND_LAYER, LCD_FRAME_BUFFER);
BSP_LCD_SelectLayer(LCD_FOREGROUND_LAYER);
BSP_LCD_DisplayOn();
BSP_LCD_Clear(LCD_COLOR_BLUE);
HAL_Delay(400);
BSP_LCD_Clear(LCD_COLOR_WHITE);
BSP_LCD_SetTextColor(LCD_COLOR_RED);
BSP_LCD_SetFont(&Font16);
BSP_LCD_DisplayStringAtLine(1, (uint8_t*)"Laborator-Proiect");
BSP_LCD_DisplayStringAt(0, LINE(2), (uint8_t*)"MICROCONTROLERE", RIGHT_MODE);
BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
BSP_LCD_SetFont(&Font24);
BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t*)"USV", CENTER_MODE);
BSP_LCD_SetFont(&Font20);
BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t*)"FIESC", CENTER_MODE);
HAL_Delay(200);
BSP_LCD_SetFont(&Font16);
BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t*)"Nume:", LEFT_MODE);
BSP_LCD_SetFont(&Font16);
BSP_LCD_DisplayStringAt(0, LINE(9), (uint8_t*)"Grupa:", LEFT_MODE);
BSP_LCD_SetFont(&Font16);
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
BSP_LCD_DisplayStringAt(4, LINE(16), (uint8_t*)"BUTON_1", LEFT_MODE);
BSP_LCD_DisplayStringAt(0, LINE(16), (uint8_t*)"BUTON_2", RIGHT_MODE);
BSP_LCD_DrawRect(1,252,84,24);
BSP_LCD_DrawRect(150,252,84,24);
BSP_LCD_SetTextColor(LCD_COLOR_RED);
BSP_LCD_DisplayStringAt(0, LINE(18), (uint8_t*)"ARM Cortex M4", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, LINE(19), (uint8_t*)"MCU: STM32F429ZITx", CENTER_MODE);
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
if (BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize()) == TS_ERROR) {
BSP_LCD_DisplayStringAt(0, LINE(11), (uint8_t*)"Eroare initializare touch!", LEFT_MODE);
}
printf("\n\rCoordonate ecran touch: x=%d, y=%d\n\r", BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
uint8_t desc[50];
sprintf((char *)desc, "Coord. x:%d, y:%d", BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
BSP_LCD_DisplayStringAt(0, LINE(10), (uint8_t *)desc, LEFT_MODE);
/* USER CODE END 2 */
//…
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
BSP_TS_GetState(&TS_State);
11
STM32F429I-DISCO ARM Cortex-M4
if(TS_State.TouchDetected)
{
x1 = TS_State.X;
y1 = TS_State.Y;
if((x1>2 && x1<100) && (y1>250 && y1<300))
{
BSP_LCD_DisplayStringAt(0, LINE(12), (uint8_t*)"BUTON 1 ", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, LINE(13), (uint8_t*)"APASAT ", CENTER_MODE);
}
else if((x1>180 && x1<230) && (y1>250 && y1<300))
{
BSP_LCD_DisplayStringAt(0, LINE(12), (uint8_t*)" BUTON 2", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, LINE(13), (uint8_t*)" APASAT ", CENTER_MODE);
}
else
{
BSP_LCD_DisplayStringAt(0, LINE(12), (uint8_t*)" ", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, LINE(13), (uint8_t*)" TOUCH ATINS ", CENTER_MODE);
}
}
else
{
BSP_LCD_DisplayStringAt(0, LINE(12), (uint8_t*)" ", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, LINE(13), (uint8_t*)" ", CENTER_MODE);
}
HAL_Delay(50);
}
/* USER CODE END 3 */
//…
În funcția static void MX_USART1_UART_Init(void) introduceți urmatorul cod:
/* USER CODE BEGIN USART1_Init 2 */
SET_BIT(huart1.Instance->CR1, USART_CR1_RXNEIE);
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE END USART1_Init 2 */
Secțiune de cod pentru USER CODE BEGIN 4:
/* USER CODE BEGIN 4 */
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* write a character to the uart1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
12
STM32F429I-DISCO ARM Cortex-M4
return ch;
}
/* USER CODE END 4 */
Apăsați Ctrl+S, apoi deschideți fișierul stm32f4xx_it.c și adăugați:
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
In functia USART1_IRQHandler adaugati urmatorul cod si comentati linia
HAL_UART_IRQHandler(&huart1);.
/* USER CODE BEGIN USART1_IRQn 0 */
char rx = USART1->DR;
if((rx == '\r') || (rx == '\n'))
printf("\r\n");
else
printf("%c", rx);
/* USER CODE END USART1_IRQn 0 */
+ +
Pentru a afișa o imagine pe LCD se va copia fișierul stlogo.h în directorul /Inc din cadrul
proiectului și se va scrie următoarele linii de cod in fisierul main.c (înainte de bucla while (1)):
#include "stlogo.h"
BSP_LCD_DrawBitmap(0,62, (uint8_t *) stlogo);
În cele ce urmează sunt descriși pașii necesari pentru a afișa pe LCD sigla USV. Pentru
început trebuie să realizați fișierul usv.h. Se poate folosi de exemplu programul
Pixelformer.Setup (disponibil și pe pagina didactică). Selectați File, New, Image Size, RGB
color (24bpp) și OK. Copiați din Paint imaginea la dimensiunile stabilite și apăsați Ctrl+V în
Pixelformer.Setup. File, Save As, OK.
13
STM32F429I-DISCO ARM Cortex-M4
Din meniu selectați File, Export, usv pentru File name și .bmp la type, apoi în fereastra
apărută selectați R5:G6:B5 (16bpp) și OK.
14
STM32F429I-DISCO ARM Cortex-M4
Din fișierul generat FramewinDLG.c copiați codul corespunzător imaginii usv (textul
marcat cu rosu în cele ce urmează).
* _acImage_0, "C:\Users\Ionel Zagan\Desktop\usv.bmp", ID_IMAGE_0_IMAGE_0
*/
static const U8 _acImage_0[9866] = {
15
STM32F429I-DISCO ARM Cortex-M4
0x42, 0x4D, 0x8A, 0x26, 0x00, 0x00, 0x00
...
...
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};
// USER END
Faceți o copie la fișierul stlogo.h, redenumiți această copie în usv.h, în directorul /Inc din
cadrul proiectului și în main.c scrieți următoarele linii de cod (înainte de bucla while (1)):
#include "usv.h"
BSP_LCD_DrawBitmap(158,50, (uint8_t *) usv);
+ +
16
STM32F429I-DISCO ARM Cortex-M4
#include "stm32f429i_discovery_gyroscope.h"
#define ABS(x) (x < 0) ? (-x) : x
float Buffer[3];
float Xval, Yval, Zval = 0x00;
uint8_t state = 0;
//-----int main(void)---
printf("\n\rExemplu L3GD20: 3-axis digital gyroscope!");
if (BSP_GYRO_Init() != GYRO_OK)
{
BSP_LCD_DisplayStringAt(0, LINE(11), (uint8_t*)"Eroare initializare MEMS!",
LEFT_MODE);
}
else
{
BSP_GYRO_Reset();
}
//---- while (1)---
BSP_GYRO_GetXYZ(Buffer);
Xval = ABS(Buffer[0]);
Yval = ABS(Buffer[1]);
Zval = ABS(Buffer[2]);
if((Xval>Yval) && (Xval>Zval))
{
if(Buffer[0] > 10000.0f)
{
printf ("\n\rX+");
17
STM32F429I-DISCO ARM Cortex-M4
}
else if(Buffer[0] < -10000.0f)
{
printf ("\n\rX-");
}
}
else if ((Yval>Xval) && (Yval>Zval))
{
if(Buffer[1] > 10000.0f)
{
printf ("\n\rY+");
}
else if(Buffer[1] < -10000.0f)
{
printf ("\n\rY-");
}
}
else if ((Zval>Xval) && (Zval>Yval))
{
if(Buffer[2] > 10000.0f)
{
printf ("\n\rZ+");
}
else if(Buffer[2] < -10000.0f)
{
printf ("\n\rZ-");
}
}
HAL_Delay(350);
18
STM32F429I-DISCO ARM Cortex-M4
19
STM32F429I-DISCO ARM Cortex-M4
20
STM32F429I-DISCO ARM Cortex-M4
BSP_LCD_LayerDefaultInit(LCD_BACKGROUND_LAYER, LCD_FRAME_BUFFER);
BSP_LCD_LayerDefaultInit(LCD_FOREGROUND_LAYER, LCD_FRAME_BUFFER+ 0x130000);
BSP_LCD_DisplayOn();
BSP_LCD_SelectLayer(LCD_FOREGROUND_LAYER);
BSP_LCD_SetLayerVisible(LCD_FOREGROUND_LAYER, ENABLE);
BSP_LCD_Clear(LCD_COLOR_WHITE);
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
BSP_LCD_SetTextColor(LCD_COLOR_RED);
BSP_LCD_SetFont(&Font16);
BSP_LCD_DisplayStringAtLine(1, (uint8_t*)"Laborator-Proiect");
BSP_LCD_DisplayStringAt(0, LINE(2), (uint8_t*)"MICROCONTROLERE", RIGHT_MODE);
BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
BSP_LCD_SetFont(&Font24);
BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t*)"USV", CENTER_MODE);
BSP_LCD_SetFont(&Font20);
BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t*)"FIESC", CENTER_MODE);
BSP_LCD_SetFont(&Font16);
BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t*)"Nume:", LEFT_MODE);
BSP_LCD_DisplayStringAt(0, LINE(9), (uint8_t*)"Grupa:", LEFT_MODE);
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
BSP_LCD_SetFont(&Font20);
BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t*)"FOREGROUND_LAYER", CENTER_MODE);
BSP_LCD_SetFont(&Font16);
BSP_LCD_DisplayStringAt(4, LINE(16), (uint8_t*)"BUTON_1", LEFT_MODE);
BSP_LCD_DisplayStringAt(0, LINE(16), (uint8_t*)"BUTON_2", RIGHT_MODE);
BSP_LCD_DrawRect(1,252,84,24);
BSP_LCD_DrawRect(150,252,84,24);
BSP_LCD_SetTextColor(LCD_COLOR_RED);
BSP_LCD_DisplayStringAt(0, LINE(18), (uint8_t*)"ARM Cortex M4", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, LINE(19), (uint8_t*)"MCU: STM32F429ZITx", CENTER_MODE);
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
if (BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize()) == TS_ERROR) {
BSP_LCD_DisplayStringAt(0, LINE(11), (uint8_t*)"Eroare initializare touch!", LEFT_MODE);
}
printf("\n\rCoordonate ecran touch: x=%d, y=%d\n\r", BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
HAL_Delay(2000);
BSP_LCD_SetLayerVisible(LCD_FOREGROUND_LAYER, DISABLE);
BSP_LCD_SelectLayer(LCD_BACKGROUND_LAYER);
BSP_LCD_SetLayerVisible(LCD_BACKGROUND_LAYER, ENABLE);
BSP_LCD_Clear(LCD_COLOR_WHITE);
BSP_LCD_SetFont(&Font20);
BSP_LCD_DisplayStringAt(0, LINE(1), (uint8_t*)"BACKGROUND_LAYER", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t*)"Meniu:", LEFT_MODE);
BSP_LCD_DisplayStringAt(80, LINE(9), (uint8_t*)"AUTO", LEFT_MODE);
BSP_LCD_DisplayStringAt(80, LINE(11), (uint8_t*)"MANUAL>", LEFT_MODE);
BSP_LCD_DisplayStringAt(150, LINE(13), (uint8_t*)"ON", LEFT_MODE);
BSP_LCD_DisplayStringAt(150, LINE(15), (uint8_t*)"OFF", LEFT_MODE);
HAL_Delay(2000);
BSP_LCD_SetLayerVisible(LCD_BACKGROUND_LAYER, DISABLE);
BSP_LCD_SelectLayer(LCD_FOREGROUND_LAYER);
BSP_LCD_SetLayerVisible(LCD_FOREGROUND_LAYER, ENABLE);
HAL_Delay(2000);
BSP_LCD_SetLayerVisible(LCD_FOREGROUND_LAYER, DISABLE);
BSP_LCD_SelectLayer(LCD_BACKGROUND_LAYER);
BSP_LCD_SetLayerVisible(LCD_BACKGROUND_LAYER, ENABLE);
21
STM32F429I-DISCO ARM Cortex-M4
HAL_Delay(2000);
BSP_LCD_SetLayerVisible(LCD_BACKGROUND_LAYER, DISABLE);
BSP_LCD_SelectLayer(LCD_FOREGROUND_LAYER);
BSP_LCD_SetLayerVisible(LCD_FOREGROUND_LAYER, ENABLE);
BSP_LCD_SetFont(&Font16);
/* USER CODE END 2 */
4. FreeRTOS și GPIO
Pentru utilizarea sistemului de operare în timp real FreeRTOS deschideți proiectul
cu CubeMX, apoi accesați tab-ul Middleware. Bifați FREERTOS și adăugați un task utilizator
denumit myTask02. Generați și deschideți proiectul în Keil. La sfârșitul fișierului main.c
introduceți următoarele linii de cod. Pentru mai multe informații consultați proiectele din
directorul 34.FreeRTOS.
22
STM32F429I-DISCO ARM Cortex-M4
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN 5 */
/* Infinite loop */
for(;;)
{
printf("Task implicit\n\r");
osDelay(2000);
}
/* USER CODE END 5 */
}
/* USER CODE BEGIN Header_StartTask02 */
/*
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
osDelay(1000);
printf("Task secund\n\r");
}
/* USER CODE END StartTask02 */
}
Pentru setarea unui pin de intrare, conectat la butonul USER (albastru), în CubeMX
efectuați click stânga pe pin și GPIO_Input. În fereastra Configuration selectați pinul
PA0/WKUP, apoi în partea de jos a ferestrei la User Label scrieți buton. Verificați pinii de ieșire
PG13, PG14 conectați la ledurile de pe kit.
Apoi: GENERATE CODE!
23
STM32F429I-DISCO ARM Cortex-M4
În Keil, la StartDefaultTask introduceți următorul cod,
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_14);
Iar la StartTask02:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET)
HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_13);
Compilați și programați microcontrolerul.
Pentru adăugarea altor funcții se aleg opțiunile corespunzătoare care nu sunt dezactivate
sau folosite deja în alte categorii ( ).
24
STM32F429I-DISCO ARM Cortex-M4
25
STM32F429I-DISCO ARM Cortex-M4
26
STM32F429I-DISCO ARM Cortex-M4
27
STM32F429I-DISCO ARM Cortex-M4
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_14);
else
HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_13);
HAL_Delay(500);
}
/* USER CODE END 3 */
/* USER CODE BEGIN 4 */
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* write a character to the uart1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 4 */
În funcția static void MX_USART1_UART_Init(void) introduceți următorul cod:
/* USER CODE BEGIN USART1_Init 2 */
SET_BIT(huart1.Instance->CR1, USART_CR1_RXNEIE);
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE END USART1_Init 2 */
În fișierul stm32f4xx_it.c adăugați:
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
În funcția USART1_IRQHandler adăugați următorul cod și comentați linia
HAL_UART_IRQHandler(&huart1);.
/* USER CODE BEGIN USART1_IRQn 0 */
char rx = USART1->DR;
if((rx == '\r') || (rx == '\n'))
printf("\r\n");
else
printf("%c", rx);
/* USER CODE END USART1_IRQn 0 */
+ + . Efectuați click dreapta și
pe HAL_GPIO_TogglePin.
28
STM32F429I-DISCO ARM Cortex-M4
29
STM32F429I-DISCO ARM Cortex-M4
Aceste comenzi pot fi trimise și prin intermediul unui terminal, respectiv al unui
convertor USB-UART, după cum se poate observa în figura următoare.
Pentru a trimite comenzi AT modulului HC-05 în etapa de testare se poate folosi una din
conexiunile din figurile următoare împreună cu un termial instalat pe PC.
30
STM32F429I-DISCO ARM Cortex-M4
Modulul bluetooth HC-05 și circuitul YP-05 FTDI FT232L (USB to TTL UART)
31
STM32F429I-DISCO ARM Cortex-M4
Realizați un proiect astfel încât să comandați releul de 5V și ventilatorul atât prin
intermediul butonului USER cât și prin comanda VENTILATOR_ON/VENTILATOR_OFF
(set/clr) emisă prin Bluetooth.
32
STM32F429I-DISCO ARM Cortex-M4
33
STM32F429I-DISCO ARM Cortex-M4
34
STM32F429I-DISCO ARM Cortex-M4
35
STM32F429I-DISCO ARM Cortex-M4
36
STM32F429I-DISCO ARM Cortex-M4
37
STM32F429I-DISCO ARM Cortex-M4
8. TouchGFX și STM32CubeIDE
Acest capitol prezintă roiectarea aplicațiilor înglobate ce utilizează afișorul LCD TFT
Touch Screen cu ajutorul TouchGFX și STM32CubeIDE.
38
STM32F429I-DISCO ARM Cortex-M4
Selectați Box, extindeți dimensiunile acestuia pe tot display-ul, apoi din partea dreaptă
selectați o culoare de fundal și schimați numele din “box1” în “background”. Din partea stangă
39
STM32F429I-DISCO ARM Cortex-M4
Selectați screen-ul Settings, selectați +, apoi Tiled Image (util pentru memoria flash). În
partea dreaptă la Style selectați vertical_cloth.png apoi redimesionați pe toata supafața. Adăugați
și imaginea st.png în centrul ecranului curent (introduceți la nume stlogo). Salvați și selectați
Run Simulator.
40
STM32F429I-DISCO ARM Cortex-M4
41
STM32F429I-DISCO ARM Cortex-M4
(https://www.touchgfx.com/)
În fișierul SettingsViewBase.cpp, tineți apăsată tasta CTRL apoi efectuați click pe funcția
fadeSTlogo(value); și se va deschide fișierul corespunzător. Copiați funcția
42
STM32F429I-DISCO ARM Cortex-M4
43
STM32F429I-DISCO ARM Cortex-M4
(https://www.touchgfx.com/)
44
STM32F429I-DISCO ARM Cortex-M4
Pentru a funcționa corect în SettingView.cpp modificați funcția setupScreen după cum
urmează:
void SettingsView::setupScreen()
{
SettingsViewBase::setupScreen();
stlogo.setAlpha(slider1.getValue());
stlogo.invalidate();
}
+ +
Adăugați butonul PA0 și ledurile PG13 si PG14, astfel încât deschideți STM32CubeMX
efectuând dublu click pe din structura proiectului. Apoi din secțiunea
Middleware selectați FREERTOS, Tasks and Queues, Add și OK. Salvati și alegeți să generați
cod.
45
STM32F429I-DISCO ARM Cortex-M4
În Application, User, main.c introduceți cod pentru a controla ledurile. Va fi folosit task-ul
creat StartTask02. int tick_task02=0; int buton = 0;
+ +
Pentru interfațarea cu modulul Backend se folosesc semafoare
(osSemaphoreWait(BinarySemHandle, 100) == osOK) sau alte mecanisme oferite de sistemul de
operare. Pentru acest exemplu se va testa direct starea butonului utilizând o variabilă globală.
46
STM32F429I-DISCO ARM Cortex-M4
47
STM32F429I-DISCO ARM Cortex-M4
+ +
48
STM32F429I-DISCO ARM Cortex-M4
9. Power Wake-Up
// Enable WakeUp Pin PWR_WAKEUP_PIN1 connected to PA.0
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
//..
HAL_PWR_EnterSTANDBYMode();
49
STM32F429I-DISCO ARM Cortex-M4
50
STM32F429I-DISCO ARM Cortex-M4
51
STM32F429I-DISCO ARM Cortex-M4
52
STM32F429I-DISCO ARM Cortex-M4
Utilizând același proiect, prin semnalul PWM generat pe pinul PF6 se va comanda turația
unui ventilator alimentat la 5V, acesta având integrat un driver corespunzător. Pentru citirea
turației ventilatorului se poate măsura frecvența generată prin pinul Tacho (rotation sensor).
53
STM32F429I-DISCO ARM Cortex-M4
54
STM32F429I-DISCO ARM Cortex-M4
55
STM32F429I-DISCO ARM Cortex-M4
56
STM32F429I-DISCO ARM Cortex-M4
57
STM32F429I-DISCO ARM Cortex-M4
58
STM32F429I-DISCO ARM Cortex-M4
https://drive.google.com/drive/folders/1elS754RdMzpgu4Zus9gmgwq49-_lO0zU?usp=sharing
59
STM32F429I-DISCO ARM Cortex-M4
https://www.waveshare.com/w/upload/6/60/Color-Sensor-UserManual.pdf
https://www.waveshare.com/w/upload/c/ca/TCS3200.pdf
https://www.waveshare.com/w/upload/4/44/Flame-Sensor-UserManual.pdf
60
STM32F429I-DISCO ARM Cortex-M4
https://www.waveshare.com/w/upload/e/eb/Hall-Sensor-UserManual.pdf
https://www.waveshare.com/w/upload/a/a9/A3144.pdf
https://www.waveshare.com/w/upload/b/b0/AH49E.pdf
https://www.waveshare.com/w/upload/f/f7/Infrared-Reflective-Sensor-UserManual.pdf
61
STM32F429I-DISCO ARM Cortex-M4
https://www.waveshare.com/w/upload/9/93/Laser-Sensor-UserManual.pdf
62
STM32F429I-DISCO ARM Cortex-M4
https://www.waveshare.com/w/upload/7/78/Liquid-Level-Sensor-UserManual.pdf
Moisture Sensor: https://www.waveshare.com/wiki/Moisture_Sensor
https://www.waveshare.com/w/upload/b/bd/Moisture-Sensor-UserManual.pdf
MQ5 Gas Sensor: https://www.waveshare.com/wiki/MQ-5_Gas_Sensor
63
STM32F429I-DISCO ARM Cortex-M4
https://www.waveshare.com/w/upload/7/76/MQ-5-Gas-Sensor-UserManual.pdf
https://www.waveshare.com/w/upload/c/ce/MQ-5.pdf
64
STM32F429I-DISCO ARM Cortex-M4
https://www.waveshare.com/w/upload/d/d3/Rotation-Sensor-UserManual.pdf
https://www.waveshare.com/w/upload/1/1e/Sound-Sensor-UserManual.pdf
DHT11 Temperature-Humidity Sensor:
https://www.waveshare.com/wiki/DHT11_Temperature-Humidity_Sensor
65
STM32F429I-DISCO ARM Cortex-M4
https://www.waveshare.com/w/upload/8/8a/Tilt-Sensor-UserManual.pdf
UV Sensor: https://www.waveshare.com/wiki/UV_Sensor
https://www.waveshare.com/w/upload/3/3d/UV-Sensor-UserManual.pdf
66
STM32F429I-DISCO ARM Cortex-M4
67
STM32F429I-DISCO ARM Cortex-M4
68
STM32F429I-DISCO ARM Cortex-M4
STM32F429I-DISCO
STM32F746G-DISCO
69
STM32F429I-DISCO ARM Cortex-M4
STM32F769I-DISCO
Proiecte:
https://drive.google.com/drive/folders/1DNfEeouoZVyIKVNdft_jMBb3V2WyD_e0?usp=sharing
Kit-uri:
https://drive.google.com/drive/folders/15poCFseW85JAyeHznEddpJqeaTtHKDAy?usp=sharing
70