Sunteți pe pagina 1din 71

Universitatea "Ştefan cel Mare" Suceava

Facultatea de Inginerie Electrică şi Ştiinţa Calculatoarelor

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

TFT LCD (Thin-film-transistor liquid-crystal display) este un afișor de 2,41" cu 262 K


culori, QVGA (240 x 320 pixeli), comandat direct de STM32F429ZIT6 folosind protocolul RGB
și controlerul LCD ILI9341. În cele ce urmează sunt prezentați pașii necesari pentru crearea unui
proiect nou utilizand STM32CubeMX și Keil uVision5. Proiectul va inițializa afișorul TFT LCD
(touch) și portul serial UART1. Deschideți STM32CubeMX apoi selectați

sau din tab-ul Board Selector.


Selectați din listă 32F429IDISCOVERY, apoi efectuați click pe butonul

2
STM32F429I-DISCO ARM Cortex-M4

(în fereastra care apare alegeți configurarea perifericelor în


modul implicit). Din meniul apărut în partea stângă alegeți următoarele setări.

3
STM32F429I-DISCO ARM Cortex-M4

4
STM32F429I-DISCO ARM Cortex-M4

5
STM32F429I-DISCO ARM Cortex-M4

6
STM32F429I-DISCO ARM Cortex-M4

Din categoriile Computing și Middleware dezactivați CRC, FREERTOS și


USB_HOST.

7
STM32F429I-DISCO ARM Cortex-M4

Dacă toate perifericele au fost setate corect efectuați click pe butonul și


apoi în fereastra apărută selectați Open Project. Se va deschide Keil apoi selectați Rebuild .
Descărcați arhiva BSP_Utilities de pe pagina didactică și copiați directorul BSP în Drivers, iar
mai apoi copiați directorul Utilities în Template.

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.

Efectuați click pe butonul File extensions… , în tab-ul Groups selectați , în linia


apărută scrieți BSP/STM32F429_Discovery, apoi efectuați click în afara liniei pentru a valida
textul. Apăsati butoul Add Files și din directorul Drivers/BSP/STM32F429_Discovery selectați
și adăugați fișierele: stm32f429i_discovery.c, stm32f429i_discovery_lcd.c,
stm32f429i_discovery_sdram.c, stm32f429i_discovery_ts.c.

9
STM32F429I-DISCO ARM Cortex-M4

În tab-ul Groups selectați , în linia apărută scrieți BSP/Components, apoi efectuați un


click în afara liniei pentru a valida textul. Apăsați butoul Add Files și din directorul
Drivers/BSP/Componets/ili9341 selectați și adăugați fișierul ili9341.c. Apoi selectați din nou
Add Files, din directorul Drivers/BSP/Componets/stmpe811 selectați și adaugati fișierul
stmpe811.c, apoi selectați OK.

Î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

De pe pagina didactică se va descărca programul GUIBuilder (acesta putând


fi descărcat și de pe site-ul ST, STemWin). Selectați New, Framewin, efectuați click pe Image,
click dreapta și Assign BMP file, alegeți fișierul usv.bmp generat anterior cu Pixelformer apoi
Open. Redimensionați imaginea în funcție de dimensiuni, apoi selectați File și Save.

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

2. Giroscopul digital cu 3 axe L3GD20 - MEMS


Senzorul MEMS L3GD20 de pe placa STM32F429-Discovery dispune de o bibliotecă
proprie. Giroscopul digital cu 3 axe L3GD20 poate măsura rotația în axele X, Y și Z. Senzorul
L3GD20 funcționează cu comunicația SPI sau I2C. Pe kit-ul STM32F429 giroscopul este
conectat prin SPI, SPI5 fiind utilizat pentru comunicație (a fost configurat deja în
STM32CubeMX).

#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

3. STM32F429 Multi-layer Support


Pentru setarea a două layer-e se va deschide proiectul cu CubeMX, respectiv tab-ul
Multimedia și apoi LTDC. Realizați următoarele modificări.

Selectați GENERATE CODE, apoi în Keil, în main.c folosiți următorul cod:


/* USER CODE BEGIN 2 */
/* Initialize the LCD */
printf("\n\rLaborator-Proiect MICROCONTROLERE\n\r");
BSP_LCD_Init();

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

5. Template – Butoane, leduri, UART1

Deschide STM32CubeMX, selectați sau

, din tab-ul Board Selector selectați din lista


32F429IDISCOVERY, apoi efectuați click pe butonul În

fereastra care apare alegeți No . Din meniul apărut în


partea stangă alegeți următoarele setări pentru PA0, PG13, PG14 și UART1.

25
STM32F429I-DISCO ARM Cortex-M4

26
STM32F429I-DISCO ARM Cortex-M4

La Project Manager alegeți numele proiectului, calea, și MDK-ARM la Toolchain/IDE,


apoi GENERATE CODE. Se va deschide proiectul cu Keil.
În fișierul main.c adăugați:
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
//-----------------------------------
/* USER CODE BEGIN 2 */
printf("\n\rTemplate STM32F429I-DISCO \n\r");
/* USER CODE END 2 */
//----------------------------------
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

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

6. Bluetooth HC-05 zs-040 (sau gw-040)


Conectați modulul Bluetooth HC-05 la portul UART3 și testați comanda unui ventilator
prin intermediul unui releu comandat de microcontroler, respectiv a unei aplicații instalate pe
telefonul mobil. Se va utiliza și modifica proiectul HC-05 Bluetooth precum și aplicația
Bluetooth Terminal.
Modul de comandă AT vă permite să interogați modulul Bluetooth și să modificați unele
dintre setări precum numele, rata de transfer, indiferent dacă funcționează sau nu în modul slave
sau în modul master. Când este utilizat ca dispozitiv master, comenzile AT vă permit să vă
conectați la alte dispozitive slave Bluetooth. Exemple de comenzi (se va deconecta modulul HC-
05 de la aplicatie):
 AT - cerere simplă de feedback. Modulul va returna OK.
 AT+VERSION- returnează versiunea de firmware. Raspuns: “hc01.comV2.0”.
 AT+BAUD - returnează rata de transfer utilizată de HC-05 în modul de comunicatie.
Valoarea implicită este 9600. Returnează: „OK9600" Pentru a schimba rata de transfer
la 2400: AT+BAUD2 Returnează „OK”.
 AT+NAME Interogarea numelui modulului. Modificarea numelui modulelor cu
AT+NAMEnumele_nou.
 AT+PIN1234 Schimbare parola. Raspuns: OKsetPIN.

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

Circuitul PL2303 (USB to TTL UART)

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.

La apăsarea butonului ON/OFF se va trimite și mesaj la aplicatie. În setările telefonului


se va selecta Bluetooth ON, scanare și apoi “pairing”. Deschideți aplicația și conectați-vă la HC-
05 cu parola 1234. Testați comenzile VENTILATOR_ON/VENTILATOR_OFF pentru oprirea
și pornirea ventilatorului prin intermediul unui releu cu un canal.

32
STM32F429I-DISCO ARM Cortex-M4

7. WIFI ESP8266 ESP-01


Se va utiliza proiectul de start 19.ESP8266_WiFi. Comenzi AT:
NU FOLOSITI COMANDA !! AT+IPR=9600 - sterge firmware-UL!
AT+UART_DEF=<baudrate>, <databits>, <stopbits>, <parity>, <flow control>
AT+UART_DEF=9600,8,1,1,0 //Set ESP8266 baud rate to 9600
AT+GMR - View version info
AT+CWMODE=1, select STA mode;
AT+RST, reset;
AT+CWJAP=<ssid>, <password>, let WiFi module connect to the router, for example:
AT+CWJAP="LCTECH","12345678";
AT+CIPMUX=1, open multiple connections;
AT+CIPSERVER=1,8080, configure the TCP server, set the port number;
AT+CIFSR, view the IP address in STA mode, such as: STAIP, “192.168.1.103”;
http://room-15.github.io/blog/2015/03/26/esp8266-at-command-reference/
Caracteristici tehnice:
 802.11 b / g / n
 Wi-Fi Direct (P2P), soft-AP
 Protocol TCP / IP încorporat
 Comutator TR încorporat, balun, LNA, amplificator de putere și rețea de potrivire
 PLL încorporat, regulator de tensiune și componente de gestionare a energiei
 Modul 802.11b + puterea de ieșire de 19,5 dBm

33
STM32F429I-DISCO ARM Cortex-M4

 Senzor de temperatură încorporat


 Suport antenă
 Scurgerea de curent este mai mică de 10uA
 CPU portabil de 32 biți cu putere redusă: se poate dubla ca procesor de aplicații
 SDIO 2.0, SPI, UART
 STBC, 1x1 MIMO, 2x1 MIMO
 A-MPDU, A-MSDU
 2 ms, conectare și transfer pachet de date
 Consumul de energie în standby mai mic de 1,0mW (DTIM3)

Conectați modulul WIFI la conectorul UART3 de pe shield-ul Open429Z-D


3.3V <-> 3V3
GND <-> GND
TX <-> RX
RX <-> TX.
Modificați în proiect linia const char AT_CWJAP[] = "AT+CWJAP=\"DIGI-
AggC\",\"RYA_23_c\"\r\n"; introducând numele și parola router-ului la care vă conectați. Se va
utiliza terminalul TeraTerm și programul SocketTest V3.0 pentru a testa modulul WiFi
ESP8266. Se va apasa butonul USER de pe kit pentru a trimite comenzi.
Pentru a trimite comenzi AT modulului ESP8266 ESP-01 în etapa de testare se poate
folosi conexiunea din figura următoare sau circuitul bridge USB to UART de pe shield-ul
WaveShare, împreună cu un termial instalat pe PC.

34
STM32F429I-DISCO ARM Cortex-M4

35
STM32F429I-DISCO ARM Cortex-M4

“+IPD,0,4:75” repezentând recepția caracterelor “75” de la client.


https://www.espressif.com/sites/default/files/documentation/4b-
esp8266_at_command_examples_en.pdf
https://www.espressif.com/sites/default/files/documentation/4a-
esp8266_at_instruction_set_en.pdf
https://room-15.github.io/blog/2015/03/26/esp8266-at-command-reference/#AT+CIPSEND
Pentru a simplifica răspunsurile se poate dezactiva ecoul trimițând comanda ATE0.

36
STM32F429I-DISCO ARM Cortex-M4

Exemplu folosind aplicația WiFi Controller 1.3 instalată pe telefonul mobil.

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.

Realizarea unui proiect cu TouchGFX (X-CUBE-TOUCHGFX) și STM32CubeIDE. În


TouchGFX, introduceți numele proiectului, calea, selectați Change la Application Template apoi
alegeți kit-ul STM32F429I-DISCO, Select și CREATE.

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ă

selectați Image, și din partea dreaptă alegeți usv.png , la nume

introduceți usv, iar la Screen1 introduceți Splash. Cu butonul se va introduce un text, și


anume “Proiect MICROCONTROLERE”. Imaginea trebuie să fie .png, aceasta putând fi
importată cu drag-and-drop în secțiunea Images.

Adăugați un nou Screen prin intermediul butonului „+”


cu denumirea Settings. Selectați, Splash, apoi Interactions din partea dreaptă și Add
Interaction. Adăugați 3 interacțiuni după cum se poate observa în figura următoare.

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

În screen-ul Settings adăugați un obiect Slider . Selectați Add Interaction și


introduceți setările din figura următoare, apoi selectați Generate Code. Salvați, apoi din
directorul proiectului deschideți STM32CubeIDE din directorul STM32CubeIDE.

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

virtual void fadeSTlogo(int value)


{
// Override and implement this function in Settings
}

apoi deschideți fișierul SettingView.cpp din apoi SettingView.hpp.

42
STM32F429I-DISCO ARM Cortex-M4

În clasa class SettingsView : public SettingsViewBase introduceți


virtual void fadeSTlogo(int value);

void SettingsView::fadeSTlogo(int value)


{
stlogo.setAlpha(value);
stlogo.invalidate();
}

Salvați, selectați Project, Build All, apoi Run.

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

+ +

Modificați proiectul astfel încât să afișați imaginile on.PNG și off.PNG în funcție de


starea butonului user.

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();

10. MCU Temperature


MX_ADC1_Init();
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
AD_Value = HAL_ADC_GetValue(&hadc1);
printf("MCU Temperature : %.1f\r\n",((AD_Value*3300/4096-760)/2.5+25));

49
STM32F429I-DISCO ARM Cortex-M4

11. IWDG (Independent watchdog)


MX_IWDG_Init();
HAL_IWDG_Start(&hiwdg);
HAL_IWDG_Refresh(&hiwdg);

12. WWDG (Window watchdog)


MX_WWDG_Init();
HAL_WWDG_Start_IT(&hwwdg);

50
STM32F429I-DISCO ARM Cortex-M4

13. RNG (Random Number Generator)


MX_RNG_Init();
HAL_RNG_GetRandomNumber(&hrng)

14. CRC (Cyclic Redundancy Check) hardware


integrat
if(HAL_CRC_Accumulate(&hcrc, (uint32_t *)aDataBuffer, BUFFER_SIZE) !=
uwExpectedCRCValue)

15. Comanda unui motor DC și a unui motor


pas cu pas
Conexiuni pentru comanda unui motor DC:
Shield-ul folosit pentru teste poate controla 4 motoare cu curent continuu sau 2 motoare
pas cu pas simultan. Se va începe folosind proiectul de test corespunzător din arhiva
PR_MC_STM32F429_HAL.

51
STM32F429I-DISCO ARM Cortex-M4

 Setări shield: Selector (shield) pe DC5V-9V;


 Alimentare: conectați cablul USB la PC și la alimentarea 5V DC, Switch-ul de pe
placă pe ON, conectați 5V-GND (Schield) - 5V-GND pe Open429Z-D.
 D2 (Shield) și D3 (shield) se conectează la 0V și la 3.3V (pentru schimbare sens se
inversează).
 D6 (Shield) conectat la semnalul PWM generat de PF6 (Open429Z-D) .
 Motorul DC este conectat la M1A și M1B (Shield).

Conexiuni pentru comanda unui motor pas cu pas:


 Setări shield: Selector (shield) pe DC5V-9V;
 Alimentare: Se conctează cablul USB la PC și la alimentarea 5V DC, Switch-ul de pe
placă pe ON, se conectează 5V-GND (Shield) - 5V-GND pe Open429Z-D.
 D10 (shield) și D11 (shield) la 3.3V (sau 5V) pentru abilitare.
 D7, D8, D12, D13 shield motor conectați la pinii MCU PF7, PF8, PF9 PF10.
 Motorul pas cu pas este conectat la 5V M3A, M3B, M4A, M4B.

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

16. Real-time clock - RTC


Un RTC este un ceas care ține evidența timpului curent. Pentru kit-ul STM32F429,
trebuie să se elimine punțile SB16 și SB17, să se unească R53 și R54, și să se lipească
condensatoarele C23, C24, respectiv oscilatorul X2 de 32.kHz. Modificați proiectul
corespunzător din arhiva de pe pagina didactică astfel încât să ajustați timpul curent.
MX_RTC_Init();
HAL_RTC_GetTime(&hrtc, &stimestructure, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sdatestructure, RTC_FORMAT_BIN);
printf("%02d/%02d/%02d\r\n",2000 + sdatestructure.Year, sdatestructure.Month, sdatestructure.Date);
printf("%02d:%02d:%02d\r\n",stimestructure.Hours, stimestructure.Minutes, stimestructure.Seconds) ;

54
STM32F429I-DISCO ARM Cortex-M4

17. Citirea unei tastaturi de tip matrice


În cadrul proiectului de test liniile și coloanele tastaturii sunt conectate la liniile de port
PD0- PD3 respectiv PD4-PD7.

55
STM32F429I-DISCO ARM Cortex-M4

18. SIM800C GSM Module


Pentru utilizarea circuitului SIM800C se va studia documentația corespunzătoare și
respectiv exemplele de la adresa https://m2msupport.net/m2msupport/sms-at-commands/. Pentru
diagnosticare se poate utiliza un terminal precum AT Command Tester și un convertor USB-
UART. În figura următoare este redată o captură de ecran cu terminalul AT Command Tester în
etapa de testare. Conectati modulul GSM la portul UART3 și testați proiectul
20.SIM800C_GSM/ 20.1.Send_SMS din arhivă. Modificați proiectul astfel încât să înglobați
comunicația GSM în sistemul proiectat la MC.
Comenzi: AT, AT+CGMI, AT+CGMM, AT+GSV, AT+CMGF=1 (setează formatul
textului pentru SMS), AT+CMGS="0799999999".

56
STM32F429I-DISCO ARM Cortex-M4

57
STM32F429I-DISCO ARM Cortex-M4

19. RS485 cu adaptorul USB-RS485-WE-1800-


BT (FTDI)

58
STM32F429I-DISCO ARM Cortex-M4

20. WaveShare Sensors Pack


https://www.waveshare.com/wiki/Sensors_Pack#Resources

https://drive.google.com/drive/folders/1elS754RdMzpgu4Zus9gmgwq49-_lO0zU?usp=sharing

59
STM32F429I-DISCO ARM Cortex-M4

Color sensor: https://www.waveshare.com/wiki/Color_Sensor

https://www.waveshare.com/w/upload/6/60/Color-Sensor-UserManual.pdf
https://www.waveshare.com/w/upload/c/ca/TCS3200.pdf

Flame sensor: https://www.waveshare.com/wiki/Flame_Sensor

https://www.waveshare.com/w/upload/4/44/Flame-Sensor-UserManual.pdf

60
STM32F429I-DISCO ARM Cortex-M4

Hall sensor: https://www.waveshare.com/wiki/Hall_Sensor

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

Infrared Reflective Sensor: https://www.waveshare.com/wiki/Infrared_Reflective_Sensor

https://www.waveshare.com/w/upload/f/f7/Infrared-Reflective-Sensor-UserManual.pdf

61
STM32F429I-DISCO ARM Cortex-M4

Laser Sensor: https://www.waveshare.com/wiki/Laser_Sensor

https://www.waveshare.com/w/upload/9/93/Laser-Sensor-UserManual.pdf

Liquid Level Sensor: https://www.waveshare.com/wiki/Liquid_Level_Sensor

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

Rotation Sensor: https://www.waveshare.com/wiki/Rotation_Sensor

64
STM32F429I-DISCO ARM Cortex-M4

https://www.waveshare.com/w/upload/d/d3/Rotation-Sensor-UserManual.pdf

Sound Sensor: https://www.waveshare.com/wiki/Sound_Sensor

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

Tilt Sensor: https://www.waveshare.com/wiki/Tilt_Sensor

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

21. Template-uri TouchGFX și ARM Cortex-M7

Se va deschide proiectul din directorul unde a fost


salvat proiectul: Display\TouchGFXProjects\STM32F429\MyApplication\STM32CubeIDE.
https://support.touchgfx.com/docs/tutorials/tutorial-02

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

S-ar putea să vă placă și