Add DMA and LiquidCrystal I2C support

- Implemented DMA functionality with a new dma.c and dma.h file.
- Added LiquidCrystal I2C driver with liquidcrystal_i2c.c and liquidcrystal_i2c.h files.
- Updated CMakeLists.txt to include dma.c and liquidcrystal_i2c.c in the build process.
- Modified build.ninja and compile_commands.json to reflect the new source files.
- Enhanced the main application to utilize the new DMA and LiquidCrystal I2C features.
This commit is contained in:
2025-05-18 16:27:45 +02:00
parent f8c5650c95
commit 344d0000fa
18 changed files with 814 additions and 105 deletions
+120 -9
View File
@@ -19,6 +19,7 @@
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "i2c.h"
#include "spi.h"
#include "usart.h"
@@ -27,6 +28,11 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "pn532_stm32f1.h"
#include "liquidcrystal_i2c.h"
#include <stdlib.h>
#include <time.h>
#include <string.h>
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -36,7 +42,14 @@
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
typedef struct
{
uint8_t state;
char name[32];
char surname[32];
time_t time;
} incomming_data_t;
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
@@ -59,7 +72,7 @@ void SystemClock_Config(void);
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void sendToServer(uint16_t _uuid);
void send_CalculateCRC(uint8_t *packet);
void parseIncommingPacket(uint8_t *_packet, incomming_data_t *_data);
/* USER CODE END 0 */
/**
@@ -83,7 +96,7 @@ int main(void)
HAL_Init();
/* USER CODE BEGIN Init */
incomming_data_t R_Data;
/* USER CODE END Init */
/* Configure the system clock */
@@ -95,12 +108,21 @@ int main(void)
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
MX_SPI1_Init();
/* USER CODE BEGIN 2 */
printf("Hello!\r\n");
HD44780_Init(2);
HD44780_Clear();
HD44780_SetCursor(0, 0);
HD44780_PrintStr("LightTAM RFID");
HD44780_SetCursor(0, 1);
HD44780_PrintStr("(C) E. Dlabal");
HAL_Delay(2000);
HD44780_Clear();
PN532 pn532;
// PN532_SPI_Init(&pn532);
PN532_I2C_Init(&pn532);
@@ -114,6 +136,8 @@ int main(void)
return -1;
}
PN532_SamConfiguration(&pn532);
HD44780_SetCursor(1, 0);
HD44780_PrintStr("Prilozte kartu");
printf("Waiting for RFID/NFC card...\r\n");
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_SET);
@@ -127,6 +151,7 @@ int main(void)
/* USER CODE BEGIN 3 */
// Check if a card is available to read
uid_len = PN532_ReadPassiveTarget(&pn532, uid, PN532_MIFARE_ISO14443A, 1000);
if (uid_len == PN532_STATUS_ERROR)
{
@@ -134,9 +159,15 @@ int main(void)
}
else
{
printf("Found card with UID: ");
HD44780_Clear();
HD44780_SetCursor(0, 0);
HD44780_PrintStr("Prosim,ponechte");
HD44780_SetCursor(0, 1);
HD44780_PrintStr("kartu prilozenou");
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(ORANGE_LED_GPIO_Port, ORANGE_LED_Pin, GPIO_PIN_SET);
printf("Found card with UID: ");
for (uint8_t i = 0; i < uid_len; i++)
{
printf("%02x ", uid[i]);
@@ -146,8 +177,7 @@ int main(void)
{
printf(" Auth block 6..\r\n");
pn532_error = PN532_MifareClassicAuthenticateBlock(&pn532, uid, uid_len,
6, MIFARE_CMD_AUTH_A, key_a);
pn532_error = PN532_MifareClassicAuthenticateBlock(&pn532, uid, uid_len, 6, MIFARE_CMD_AUTH_A, key_a);
for (uint8_t i = 0; i < 16; i++)
{
@@ -162,20 +192,61 @@ int main(void)
printf("\r\n");
uint32_t value_le = (buff[3] << 24) | (buff[2] << 16) | (buff[1] << 8) | buff[0];
printf("Cislo z bloku (little-endian): %lu\r\n", value_le);
printf("UUID: %lu\r\n", value_le);
sendToServer(value_le);
uint8_t r_packet[76];
HAL_UART_Receive(&huart2, r_packet, 76, HAL_MAX_DELAY);
parseIncommingPacket(r_packet, &R_Data);
HD44780_Clear();
HAL_GPIO_WritePin(ORANGE_LED_GPIO_Port, ORANGE_LED_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_SET);
if (R_Data.state == 1)
{
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_SET);
HD44780_SetCursor(1, 0);
HD44780_PrintStr("Prichod OK");
HD44780_SetCursor(0, 1);
char name[15];
sprintf(name, "%10s,%1s.", R_Data.surname, R_Data.name);
HD44780_PrintStr(name);
}
else if (R_Data.state == 2)
{
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_SET);
HD44780_SetCursor(1, 0);
HD44780_PrintStr("Odchod OK");
HD44780_SetCursor(0, 1);
char name[15];
sprintf(name, "%10s,%1s.", R_Data.surname, R_Data.name);
HD44780_PrintStr(name);
}
else if (R_Data.state == 0)
{
HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_SET);
HD44780_SetCursor(1, 0);
HD44780_PrintStr("Chyba");
HD44780_SetCursor(0, 1);
HD44780_PrintStr("Zkuste to znovu");
}
while (PN532_ReadPassiveTarget(&pn532, uid, PN532_MIFARE_ISO14443A, 100) != PN532_STATUS_ERROR)
{
HAL_Delay(100);
}
HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_SET);
printf("Card removed. Waiting for next card...\r\n");
break; // Exit the inner while(1) to wait for a new card
HD44780_Clear();
HD44780_SetCursor(1, 0);
HD44780_PrintStr("Prilozte kartu");
if (pn532_error)
{
printf("Error: 0x%02x\r\n", pn532_error);
}
break;
}
}
}
@@ -243,8 +314,48 @@ void sendToServer(uint16_t _uuid)
packet[5] = crc;
HAL_UART_Transmit(&huart2, packet, 6, HAL_MAX_DELAY);
return;
}
void parseIncommingPacket(uint8_t *_packet, incomming_data_t *_data)
{
if (_packet[0] != 0xFF || _packet[1] != 0x55)
{
printf("Invalid packet header\r\n");
return;
}
uint8_t state = _packet[2];
char name[32] = {0};
char surname[32] = {0};
time_t time = 0;
uint8_t crc = 0;
memcpy(name, _packet + 3, 31);
name[31] = '\0';
memcpy(surname, _packet + 35, 31);
surname[31] = '\0';
memcpy(&time, _packet + 67, sizeof(time_t));
for (int i = 0; i < 67 + sizeof(time_t); i++)
{
crc ^= _packet[i];
}
if (crc != _packet[67 + sizeof(time_t)])
{
printf("CRC error\r\n");
return;
}
strcpy(_data->name, name);
strcpy(_data->surname, surname);
_data->state = state;
_data->time = time;
return;
}
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf