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:
+120
-9
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user