added libs
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
#ifndef __FATFS_SD_H
|
||||
#define __FATFS_SD_H
|
||||
|
||||
/* Definitions for MMC/SDC command */
|
||||
#define CMD0 (0x40+0) /* GO_IDLE_STATE */
|
||||
#define CMD1 (0x40+1) /* SEND_OP_COND */
|
||||
#define CMD8 (0x40+8) /* SEND_IF_COND */
|
||||
#define CMD9 (0x40+9) /* SEND_CSD */
|
||||
#define CMD10 (0x40+10) /* SEND_CID */
|
||||
#define CMD12 (0x40+12) /* STOP_TRANSMISSION */
|
||||
#define CMD16 (0x40+16) /* SET_BLOCKLEN */
|
||||
#define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */
|
||||
#define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */
|
||||
#define CMD23 (0x40+23) /* SET_BLOCK_COUNT */
|
||||
#define CMD24 (0x40+24) /* WRITE_BLOCK */
|
||||
#define CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */
|
||||
#define CMD41 (0x40+41) /* SEND_OP_COND (ACMD) */
|
||||
#define CMD55 (0x40+55) /* APP_CMD */
|
||||
#define CMD58 (0x40+58) /* READ_OCR */
|
||||
|
||||
/* MMC card type flags (MMC_GET_TYPE) */
|
||||
#define CT_MMC 0x01 /* MMC ver 3 */
|
||||
#define CT_SD1 0x02 /* SD ver 1 */
|
||||
#define CT_SD2 0x04 /* SD ver 2 */
|
||||
#define CT_SDC 0x06 /* SD */
|
||||
#define CT_BLOCK 0x08 /* Block addressing */
|
||||
|
||||
/* Functions */
|
||||
DSTATUS SD_disk_initialize (BYTE pdrv);
|
||||
DSTATUS SD_disk_status (BYTE pdrv);
|
||||
DRESULT SD_disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
|
||||
DRESULT SD_disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
|
||||
DRESULT SD_disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
|
||||
|
||||
#define SPI_TIMEOUT 100
|
||||
|
||||
extern SPI_HandleTypeDef hspi1;
|
||||
#define HSPI_SDCARD &hspi1
|
||||
#define SD_CS_PORT GPIOB
|
||||
#define SD_CS_PIN GPIO_PIN_6
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,544 @@
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#define bool BYTE
|
||||
|
||||
#include "stm32f4xx_hal.h"
|
||||
|
||||
#include "diskio.h"
|
||||
#include "fatfs_sd.h"
|
||||
|
||||
uint16_t Timer1, Timer2; /* 1ms Timer Counter */
|
||||
|
||||
static volatile DSTATUS Stat = STA_NOINIT; /* Disk Status */
|
||||
static uint8_t CardType; /* Type 0:MMC, 1:SDC, 2:Block addressing */
|
||||
static uint8_t PowerFlag = 0; /* Power flag */
|
||||
|
||||
/***************************************
|
||||
* SPI functions
|
||||
**************************************/
|
||||
|
||||
/* slave select */
|
||||
static void SELECT(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(SD_CS_PORT, SD_CS_PIN, GPIO_PIN_RESET);
|
||||
HAL_Delay(1);
|
||||
}
|
||||
|
||||
/* slave deselect */
|
||||
static void DESELECT(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(SD_CS_PORT, SD_CS_PIN, GPIO_PIN_SET);
|
||||
HAL_Delay(1);
|
||||
}
|
||||
|
||||
/* SPI transmit a byte */
|
||||
static void SPI_TxByte(uint8_t data)
|
||||
{
|
||||
while(!__HAL_SPI_GET_FLAG(HSPI_SDCARD, SPI_FLAG_TXE));
|
||||
HAL_SPI_Transmit(HSPI_SDCARD, &data, 1, SPI_TIMEOUT);
|
||||
}
|
||||
|
||||
/* SPI transmit buffer */
|
||||
static void SPI_TxBuffer(uint8_t *buffer, uint16_t len)
|
||||
{
|
||||
while(!__HAL_SPI_GET_FLAG(HSPI_SDCARD, SPI_FLAG_TXE));
|
||||
HAL_SPI_Transmit(HSPI_SDCARD, buffer, len, SPI_TIMEOUT);
|
||||
}
|
||||
|
||||
/* SPI receive a byte */
|
||||
static uint8_t SPI_RxByte(void)
|
||||
{
|
||||
uint8_t dummy, data;
|
||||
dummy = 0xFF;
|
||||
|
||||
while(!__HAL_SPI_GET_FLAG(HSPI_SDCARD, SPI_FLAG_TXE));
|
||||
HAL_SPI_TransmitReceive(HSPI_SDCARD, &dummy, &data, 1, SPI_TIMEOUT);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/* SPI receive a byte via pointer */
|
||||
static void SPI_RxBytePtr(uint8_t *buff)
|
||||
{
|
||||
*buff = SPI_RxByte();
|
||||
}
|
||||
|
||||
/***************************************
|
||||
* SD functions
|
||||
**************************************/
|
||||
|
||||
/* wait SD ready */
|
||||
static uint8_t SD_ReadyWait(void)
|
||||
{
|
||||
uint8_t res;
|
||||
|
||||
/* timeout 500ms */
|
||||
Timer2 = 500;
|
||||
|
||||
/* if SD goes ready, receives 0xFF */
|
||||
do {
|
||||
res = SPI_RxByte();
|
||||
} while ((res != 0xFF) && Timer2);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/* power on */
|
||||
static void SD_PowerOn(void)
|
||||
{
|
||||
uint8_t args[6];
|
||||
uint32_t cnt = 0x1FFF;
|
||||
|
||||
/* transmit bytes to wake up */
|
||||
DESELECT();
|
||||
for(int i = 0; i < 10; i++)
|
||||
{
|
||||
SPI_TxByte(0xFF);
|
||||
}
|
||||
|
||||
/* slave select */
|
||||
SELECT();
|
||||
|
||||
/* make idle state */
|
||||
args[0] = CMD0; /* CMD0:GO_IDLE_STATE */
|
||||
args[1] = 0;
|
||||
args[2] = 0;
|
||||
args[3] = 0;
|
||||
args[4] = 0;
|
||||
args[5] = 0x95; /* CRC */
|
||||
|
||||
SPI_TxBuffer(args, sizeof(args));
|
||||
|
||||
/* wait response */
|
||||
while ((SPI_RxByte() != 0x01) && cnt)
|
||||
{
|
||||
cnt--;
|
||||
}
|
||||
|
||||
DESELECT();
|
||||
SPI_TxByte(0XFF);
|
||||
|
||||
PowerFlag = 1;
|
||||
}
|
||||
|
||||
/* power off */
|
||||
static void SD_PowerOff(void)
|
||||
{
|
||||
PowerFlag = 0;
|
||||
}
|
||||
|
||||
/* check power flag */
|
||||
static uint8_t SD_CheckPower(void)
|
||||
{
|
||||
return PowerFlag;
|
||||
}
|
||||
|
||||
/* receive data block */
|
||||
static bool SD_RxDataBlock(BYTE *buff, UINT len)
|
||||
{
|
||||
uint8_t token;
|
||||
|
||||
/* timeout 200ms */
|
||||
Timer1 = 200;
|
||||
|
||||
/* loop until receive a response or timeout */
|
||||
do {
|
||||
token = SPI_RxByte();
|
||||
} while((token == 0xFF) && Timer1);
|
||||
|
||||
/* invalid response */
|
||||
if(token != 0xFE) return FALSE;
|
||||
|
||||
/* receive data */
|
||||
do {
|
||||
SPI_RxBytePtr(buff++);
|
||||
} while(len--);
|
||||
|
||||
/* discard CRC */
|
||||
SPI_RxByte();
|
||||
SPI_RxByte();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* transmit data block */
|
||||
#if _USE_WRITE == 1
|
||||
static bool SD_TxDataBlock(const uint8_t *buff, BYTE token)
|
||||
{
|
||||
uint8_t resp;
|
||||
uint8_t i = 0;
|
||||
|
||||
/* wait SD ready */
|
||||
if (SD_ReadyWait() != 0xFF) return FALSE;
|
||||
|
||||
/* transmit token */
|
||||
SPI_TxByte(token);
|
||||
|
||||
/* if it's not STOP token, transmit data */
|
||||
if (token != 0xFD)
|
||||
{
|
||||
SPI_TxBuffer((uint8_t*)buff, 512);
|
||||
|
||||
/* discard CRC */
|
||||
SPI_RxByte();
|
||||
SPI_RxByte();
|
||||
|
||||
/* receive response */
|
||||
while (i <= 64)
|
||||
{
|
||||
resp = SPI_RxByte();
|
||||
|
||||
/* transmit 0x05 accepted */
|
||||
if ((resp & 0x1F) == 0x05) break;
|
||||
i++;
|
||||
}
|
||||
|
||||
/* recv buffer clear */
|
||||
while (SPI_RxByte() == 0);
|
||||
}
|
||||
|
||||
/* transmit 0x05 accepted */
|
||||
if ((resp & 0x1F) == 0x05) return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
#endif /* _USE_WRITE */
|
||||
|
||||
/* transmit command */
|
||||
static BYTE SD_SendCmd(BYTE cmd, uint32_t arg)
|
||||
{
|
||||
uint8_t crc, res;
|
||||
|
||||
/* wait SD ready */
|
||||
if (SD_ReadyWait() != 0xFF) return 0xFF;
|
||||
|
||||
/* transmit command */
|
||||
SPI_TxByte(cmd); /* Command */
|
||||
SPI_TxByte((uint8_t)(arg >> 24)); /* Argument[31..24] */
|
||||
SPI_TxByte((uint8_t)(arg >> 16)); /* Argument[23..16] */
|
||||
SPI_TxByte((uint8_t)(arg >> 8)); /* Argument[15..8] */
|
||||
SPI_TxByte((uint8_t)arg); /* Argument[7..0] */
|
||||
|
||||
/* prepare CRC */
|
||||
if(cmd == CMD0) crc = 0x95; /* CRC for CMD0(0) */
|
||||
else if(cmd == CMD8) crc = 0x87; /* CRC for CMD8(0x1AA) */
|
||||
else crc = 1;
|
||||
|
||||
/* transmit CRC */
|
||||
SPI_TxByte(crc);
|
||||
|
||||
/* Skip a stuff byte when STOP_TRANSMISSION */
|
||||
if (cmd == CMD12) SPI_RxByte();
|
||||
|
||||
/* receive response */
|
||||
uint8_t n = 10;
|
||||
do {
|
||||
res = SPI_RxByte();
|
||||
} while ((res & 0x80) && --n);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/***************************************
|
||||
* user_diskio.c functions
|
||||
**************************************/
|
||||
|
||||
/* initialize SD */
|
||||
DSTATUS SD_disk_initialize(BYTE drv)
|
||||
{
|
||||
uint8_t n, type, ocr[4];
|
||||
|
||||
/* single drive, drv should be 0 */
|
||||
if(drv) return STA_NOINIT;
|
||||
|
||||
/* no disk */
|
||||
if(Stat & STA_NODISK) return Stat;
|
||||
|
||||
/* power on */
|
||||
SD_PowerOn();
|
||||
|
||||
/* slave select */
|
||||
SELECT();
|
||||
|
||||
/* check disk type */
|
||||
type = 0;
|
||||
|
||||
/* send GO_IDLE_STATE command */
|
||||
if (SD_SendCmd(CMD0, 0) == 1)
|
||||
{
|
||||
/* timeout 1 sec */
|
||||
Timer1 = 1000;
|
||||
|
||||
/* SDC V2+ accept CMD8 command, http://elm-chan.org/docs/mmc/mmc_e.html */
|
||||
if (SD_SendCmd(CMD8, 0x1AA) == 1)
|
||||
{
|
||||
/* operation condition register */
|
||||
for (n = 0; n < 4; n++)
|
||||
{
|
||||
ocr[n] = SPI_RxByte();
|
||||
}
|
||||
|
||||
/* voltage range 2.7-3.6V */
|
||||
if (ocr[2] == 0x01 && ocr[3] == 0xAA)
|
||||
{
|
||||
/* ACMD41 with HCS bit */
|
||||
do {
|
||||
if (SD_SendCmd(CMD55, 0) <= 1 && SD_SendCmd(CMD41, 1UL << 30) == 0) break;
|
||||
} while (Timer1);
|
||||
|
||||
/* READ_OCR */
|
||||
if (Timer1 && SD_SendCmd(CMD58, 0) == 0)
|
||||
{
|
||||
/* Check CCS bit */
|
||||
for (n = 0; n < 4; n++)
|
||||
{
|
||||
ocr[n] = SPI_RxByte();
|
||||
}
|
||||
|
||||
/* SDv2 (HC or SC) */
|
||||
type = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* SDC V1 or MMC */
|
||||
type = (SD_SendCmd(CMD55, 0) <= 1 && SD_SendCmd(CMD41, 0) <= 1) ? CT_SD1 : CT_MMC;
|
||||
|
||||
do
|
||||
{
|
||||
if (type == CT_SD1)
|
||||
{
|
||||
if (SD_SendCmd(CMD55, 0) <= 1 && SD_SendCmd(CMD41, 0) == 0) break; /* ACMD41 */
|
||||
}
|
||||
else
|
||||
{
|
||||
if (SD_SendCmd(CMD1, 0) == 0) break; /* CMD1 */
|
||||
}
|
||||
|
||||
} while (Timer1);
|
||||
|
||||
/* SET_BLOCKLEN */
|
||||
if (!Timer1 || SD_SendCmd(CMD16, 512) != 0) type = 0;
|
||||
}
|
||||
}
|
||||
|
||||
CardType = type;
|
||||
|
||||
/* Idle */
|
||||
DESELECT();
|
||||
SPI_RxByte();
|
||||
|
||||
/* Clear STA_NOINIT */
|
||||
if (type)
|
||||
{
|
||||
Stat &= ~STA_NOINIT;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Initialization failed */
|
||||
SD_PowerOff();
|
||||
}
|
||||
|
||||
return Stat;
|
||||
}
|
||||
|
||||
/* return disk status */
|
||||
DSTATUS SD_disk_status(BYTE drv)
|
||||
{
|
||||
if (drv) return STA_NOINIT;
|
||||
return Stat;
|
||||
}
|
||||
|
||||
/* read sector */
|
||||
DRESULT SD_disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count)
|
||||
{
|
||||
/* pdrv should be 0 */
|
||||
if (pdrv || !count) return RES_PARERR;
|
||||
|
||||
/* no disk */
|
||||
if (Stat & STA_NOINIT) return RES_NOTRDY;
|
||||
|
||||
/* convert to byte address */
|
||||
if (!(CardType & CT_SD2)) sector *= 512;
|
||||
|
||||
SELECT();
|
||||
|
||||
if (count == 1)
|
||||
{
|
||||
/* READ_SINGLE_BLOCK */
|
||||
if ((SD_SendCmd(CMD17, sector) == 0) && SD_RxDataBlock(buff, 512)) count = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* READ_MULTIPLE_BLOCK */
|
||||
if (SD_SendCmd(CMD18, sector) == 0)
|
||||
{
|
||||
do {
|
||||
if (!SD_RxDataBlock(buff, 512)) break;
|
||||
buff += 512;
|
||||
} while (--count);
|
||||
|
||||
/* STOP_TRANSMISSION */
|
||||
SD_SendCmd(CMD12, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Idle */
|
||||
DESELECT();
|
||||
SPI_RxByte();
|
||||
|
||||
return count ? RES_ERROR : RES_OK;
|
||||
}
|
||||
|
||||
/* write sector */
|
||||
#if _USE_WRITE == 1
|
||||
DRESULT SD_disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count)
|
||||
{
|
||||
/* pdrv should be 0 */
|
||||
if (pdrv || !count) return RES_PARERR;
|
||||
|
||||
/* no disk */
|
||||
if (Stat & STA_NOINIT) return RES_NOTRDY;
|
||||
|
||||
/* write protection */
|
||||
if (Stat & STA_PROTECT) return RES_WRPRT;
|
||||
|
||||
/* convert to byte address */
|
||||
if (!(CardType & CT_SD2)) sector *= 512;
|
||||
|
||||
SELECT();
|
||||
|
||||
if (count == 1)
|
||||
{
|
||||
/* WRITE_BLOCK */
|
||||
if ((SD_SendCmd(CMD24, sector) == 0) && SD_TxDataBlock(buff, 0xFE))
|
||||
count = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* WRITE_MULTIPLE_BLOCK */
|
||||
if (CardType & CT_SD1)
|
||||
{
|
||||
SD_SendCmd(CMD55, 0);
|
||||
SD_SendCmd(CMD23, count); /* ACMD23 */
|
||||
}
|
||||
|
||||
if (SD_SendCmd(CMD25, sector) == 0)
|
||||
{
|
||||
do {
|
||||
if(!SD_TxDataBlock(buff, 0xFC)) break;
|
||||
buff += 512;
|
||||
} while (--count);
|
||||
|
||||
/* STOP_TRAN token */
|
||||
if(!SD_TxDataBlock(0, 0xFD))
|
||||
{
|
||||
count = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Idle */
|
||||
DESELECT();
|
||||
SPI_RxByte();
|
||||
|
||||
return count ? RES_ERROR : RES_OK;
|
||||
}
|
||||
#endif /* _USE_WRITE */
|
||||
|
||||
/* ioctl */
|
||||
DRESULT SD_disk_ioctl(BYTE drv, BYTE ctrl, void *buff)
|
||||
{
|
||||
DRESULT res;
|
||||
uint8_t n, csd[16], *ptr = buff;
|
||||
WORD csize;
|
||||
|
||||
/* pdrv should be 0 */
|
||||
if (drv) return RES_PARERR;
|
||||
res = RES_ERROR;
|
||||
|
||||
if (ctrl == CTRL_POWER)
|
||||
{
|
||||
switch (*ptr)
|
||||
{
|
||||
case 0:
|
||||
SD_PowerOff(); /* Power Off */
|
||||
res = RES_OK;
|
||||
break;
|
||||
case 1:
|
||||
SD_PowerOn(); /* Power On */
|
||||
res = RES_OK;
|
||||
break;
|
||||
case 2:
|
||||
*(ptr + 1) = SD_CheckPower();
|
||||
res = RES_OK; /* Power Check */
|
||||
break;
|
||||
default:
|
||||
res = RES_PARERR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* no disk */
|
||||
if (Stat & STA_NOINIT) return RES_NOTRDY;
|
||||
|
||||
SELECT();
|
||||
|
||||
switch (ctrl)
|
||||
{
|
||||
case GET_SECTOR_COUNT:
|
||||
/* SEND_CSD */
|
||||
if ((SD_SendCmd(CMD9, 0) == 0) && SD_RxDataBlock(csd, 16))
|
||||
{
|
||||
if ((csd[0] >> 6) == 1)
|
||||
{
|
||||
/* SDC V2 */
|
||||
csize = csd[9] + ((WORD) csd[8] << 8) + 1;
|
||||
*(DWORD*) buff = (DWORD) csize << 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* MMC or SDC V1 */
|
||||
n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;
|
||||
csize = (csd[8] >> 6) + ((WORD) csd[7] << 2) + ((WORD) (csd[6] & 3) << 10) + 1;
|
||||
*(DWORD*) buff = (DWORD) csize << (n - 9);
|
||||
}
|
||||
res = RES_OK;
|
||||
}
|
||||
break;
|
||||
case GET_SECTOR_SIZE:
|
||||
*(WORD*) buff = 512;
|
||||
res = RES_OK;
|
||||
break;
|
||||
case CTRL_SYNC:
|
||||
if (SD_ReadyWait() == 0xFF) res = RES_OK;
|
||||
break;
|
||||
case MMC_GET_CSD:
|
||||
/* SEND_CSD */
|
||||
if (SD_SendCmd(CMD9, 0) == 0 && SD_RxDataBlock(ptr, 16)) res = RES_OK;
|
||||
break;
|
||||
case MMC_GET_CID:
|
||||
/* SEND_CID */
|
||||
if (SD_SendCmd(CMD10, 0) == 0 && SD_RxDataBlock(ptr, 16)) res = RES_OK;
|
||||
break;
|
||||
case MMC_GET_OCR:
|
||||
/* READ_OCR */
|
||||
if (SD_SendCmd(CMD58, 0) == 0)
|
||||
{
|
||||
for (n = 0; n < 4; n++)
|
||||
{
|
||||
*ptr++ = SPI_RxByte();
|
||||
}
|
||||
res = RES_OK;
|
||||
}
|
||||
default:
|
||||
res = RES_PARERR;
|
||||
}
|
||||
|
||||
DESELECT();
|
||||
SPI_RxByte();
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
+167
-44
@@ -48,8 +48,9 @@
|
||||
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
SPI_HandleTypeDef hspi1;
|
||||
ADC_HandleTypeDef hadc;
|
||||
ADC_HandleTypeDef hadc1;
|
||||
RTC_HandleTypeDef hrtc;
|
||||
|
||||
UART_HandleTypeDef huart2;
|
||||
|
||||
/* USER CODE BEGIN PV */
|
||||
@@ -106,9 +107,7 @@ uint32_t totalSpace, freeSpace;
|
||||
char buffer[100];
|
||||
uint16_t AD_RES;
|
||||
int num;
|
||||
|
||||
//Variable name for txt file
|
||||
char txtVar[19];
|
||||
char filename[12];
|
||||
|
||||
/* USER CODE END PV */
|
||||
|
||||
@@ -118,7 +117,7 @@ static void MX_GPIO_Init(void);
|
||||
static void MX_USART2_UART_Init(void);
|
||||
static void MX_RTC_Init(void);
|
||||
static void MX_SPI1_Init(void);
|
||||
static void MX_ADC_Init(void);
|
||||
static void MX_ADC1_Init(void);
|
||||
static void MyFlagInterruptHandler(void);
|
||||
void ButtonHandler(void);
|
||||
/* USER CODE BEGIN PFP */
|
||||
@@ -478,18 +477,8 @@ int calc_interval_duration(timeAndDate *sunrise, timeAndDate *sunset){
|
||||
return (duration_h * 60 + duration_m) / leapsFor180Deg;
|
||||
}
|
||||
|
||||
char int_to_char_and_concat(int amount, char* separator, ...){
|
||||
va_list argumentlist;
|
||||
va_start(argumentlist, separator);
|
||||
char str[200] = "";
|
||||
|
||||
while (amount--){
|
||||
char arg = va_arg(argumentlist, char);
|
||||
strcat(str, arg);
|
||||
strcat(str, separator);
|
||||
}
|
||||
|
||||
return str;
|
||||
void generate_filename(timeAndDate *date){
|
||||
sprintf(filename, "%02d%02d%02d.txt", date->year, date->month, date->day);
|
||||
}
|
||||
|
||||
/* USER CODE END 0 */
|
||||
@@ -526,7 +515,7 @@ int main(void)
|
||||
MX_RTC_Init();
|
||||
MX_SPI1_Init();
|
||||
MX_FATFS_Init();
|
||||
MX_ADC_Init();
|
||||
MX_ADC1_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
//######### Inits of the Motor control library #########
|
||||
@@ -584,8 +573,23 @@ int main(void)
|
||||
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
|
||||
freqPwm = BSP_MotorControl_GetBridgeInputPwmFreq(0);
|
||||
|
||||
BSP_MotorControl_SetBridgeInputPwmFreq(0, freqPwm>>1);
|
||||
|
||||
pos = BSP_MotorControl_GetPosition(0);
|
||||
|
||||
BSP_MotorControl_SetHome(0, pos);
|
||||
|
||||
BSP_MotorControl_SelectStepMode(0, STEP_MODE_FULL);
|
||||
|
||||
while (1)
|
||||
{
|
||||
//######### Start ADC #########
|
||||
|
||||
// Start ADC Conversion
|
||||
HAL_ADC_Start(&hadc1);
|
||||
|
||||
//######### Motor settings and motor test #########
|
||||
|
||||
@@ -593,37 +597,28 @@ int main(void)
|
||||
|
||||
transmit_uart("Resetting motor position and calculating new dates and times.\r\n");
|
||||
|
||||
freqPwm = BSP_MotorControl_GetBridgeInputPwmFreq(0);
|
||||
|
||||
BSP_MotorControl_SetBridgeInputPwmFreq(0, freqPwm>>1);
|
||||
|
||||
pos = BSP_MotorControl_GetPosition(0);
|
||||
|
||||
BSP_MotorControl_SetHome(0, pos);
|
||||
|
||||
BSP_MotorControl_SelectStepMode(0, STEP_MODE_FULL);
|
||||
|
||||
BSP_MotorControl_Move(0, FORWARD, stepsToMake);
|
||||
BSP_MotorControl_WaitWhileActive(0);
|
||||
|
||||
BSP_MotorControl_Move(0, FORWARD, stepsToMake);
|
||||
BSP_MotorControl_WaitWhileActive(0);
|
||||
|
||||
BSP_MotorControl_Move(0, FORWARD, stepsToMake);
|
||||
BSP_MotorControl_WaitWhileActive(0);
|
||||
|
||||
BSP_MotorControl_GoHome(0);
|
||||
BSP_MotorControl_WaitWhileActive(0);
|
||||
|
||||
/* USER CODE END WHILE */
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
/* USER CODE BEGIN 3 */
|
||||
/* USER CODE BEGIN 3 */
|
||||
set_time_and_date(&initialDate);
|
||||
|
||||
leap_year_check(initialDate.year);
|
||||
|
||||
calc_tomorrows_date(&initialDate, &tomorrowsDate);
|
||||
|
||||
generate_filename(&tomorrowsDate);
|
||||
|
||||
// Open file with tomorrows date as file name
|
||||
fres = f_open(&fil, filename, FA_OPEN_APPEND | FA_WRITE | FA_READ);
|
||||
if (fres == FR_OK) {
|
||||
transmit_uart("File opened.\r\n");
|
||||
} else if (fres != FR_OK) {
|
||||
transmit_uart("File was not opened!\r\n");
|
||||
}
|
||||
|
||||
//Calculate sunrise and sunset time for tomorrow
|
||||
calc_sunrise_sunset(&initialDate, &sunrise, &sunset, &tomorrowsDate);
|
||||
|
||||
@@ -640,7 +635,6 @@ int main(void)
|
||||
timeToNextStep_m = calc_interval_duration(&sunrise, &sunset);
|
||||
|
||||
// Set Alarm for sunrise
|
||||
|
||||
transmit_uart("Setting alarm for sunrise.\r\n");
|
||||
set_alarm(sunrise.hours, sunrise.minutes, sunrise.weekDay, "A", &sAlarmA);
|
||||
|
||||
@@ -697,6 +691,11 @@ int main(void)
|
||||
HAL_ResumeTick();
|
||||
|
||||
if (makeStepFlag) {
|
||||
// Poll ADC1 Perihperal & TimeOut = 1mSec
|
||||
HAL_ADC_PollForConversion(&hadc1, 1);
|
||||
// Read The ADC Conversion Result
|
||||
AD_RES = HAL_ADC_GetValue(&hadc1);
|
||||
|
||||
transmit_uart("Making a step.\r\n");
|
||||
BSP_MotorControl_Move(0, FORWARD, stepsToMake);
|
||||
BSP_MotorControl_WaitWhileActive(0);
|
||||
@@ -782,7 +781,7 @@ static void MX_RTC_Init(void)
|
||||
|
||||
RTC_TimeTypeDef sTime = {0};
|
||||
RTC_DateTypeDef sDate = {0};
|
||||
//RTC_AlarmTypeDef sAlarm = {0};
|
||||
RTC_AlarmTypeDef sAlarm = {0};
|
||||
|
||||
/* USER CODE BEGIN RTC_Init 1 */
|
||||
|
||||
@@ -825,6 +824,35 @@ static void MX_RTC_Init(void)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/** Enable the Alarm A
|
||||
*/
|
||||
sAlarm.AlarmTime.Hours = 0;
|
||||
sAlarm.AlarmTime.Minutes = 0;
|
||||
sAlarm.AlarmTime.Seconds = 0;
|
||||
sAlarm.AlarmTime.SubSeconds = 0;
|
||||
sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
|
||||
sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
|
||||
sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
|
||||
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
|
||||
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
|
||||
sAlarm.AlarmDateWeekDay = 1;
|
||||
sAlarm.Alarm = RTC_ALARM_A;
|
||||
if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/** Enable the Alarm B
|
||||
*/
|
||||
sAlarm.AlarmDateWeekDay = 1;
|
||||
sAlarm.Alarm = RTC_ALARM_B;
|
||||
if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN RTC_Init 2 */
|
||||
|
||||
/* USER CODE END RTC_Init 2 */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -876,7 +904,7 @@ static void MX_GPIO_Init(void)
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
//HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin : B1_Pin */
|
||||
GPIO_InitStruct.Pin = B1_Pin;
|
||||
@@ -885,11 +913,106 @@ static void MX_GPIO_Init(void)
|
||||
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : LD2_Pin */
|
||||
//GPIO_InitStruct.Pin = LD2_Pin;
|
||||
GPIO_InitStruct.Pin = LD2_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
//HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
|
||||
HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : PB6 */
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_6;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ADC1 Initialization Function
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
static void MX_ADC1_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN ADC1_Init 0 */
|
||||
|
||||
/* USER CODE END ADC1_Init 0 */
|
||||
|
||||
ADC_ChannelConfTypeDef sConfig = {0};
|
||||
|
||||
/* USER CODE BEGIN ADC1_Init 1 */
|
||||
|
||||
/* USER CODE END ADC1_Init 1 */
|
||||
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
|
||||
*/
|
||||
hadc1.Instance = ADC1;
|
||||
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
|
||||
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
|
||||
hadc1.Init.ScanConvMode = DISABLE;
|
||||
hadc1.Init.ContinuousConvMode = ENABLE;
|
||||
hadc1.Init.DiscontinuousConvMode = DISABLE;
|
||||
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
||||
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
||||
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
||||
hadc1.Init.NbrOfConversion = 1;
|
||||
hadc1.Init.DMAContinuousRequests = DISABLE;
|
||||
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
|
||||
if (HAL_ADC_Init(&hadc1) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
|
||||
*/
|
||||
sConfig.Channel = ADC_CHANNEL_0;
|
||||
sConfig.Rank = 1;
|
||||
sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
|
||||
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN ADC1_Init 2 */
|
||||
|
||||
/* USER CODE END ADC1_Init 2 */
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief SPI1 Initialization Function
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
static void MX_SPI1_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN SPI1_Init 0 */
|
||||
|
||||
/* USER CODE END SPI1_Init 0 */
|
||||
|
||||
/* USER CODE BEGIN SPI1_Init 1 */
|
||||
|
||||
/* USER CODE END SPI1_Init 1 */
|
||||
/* SPI1 parameter configuration*/
|
||||
hspi1.Instance = SPI1;
|
||||
hspi1.Init.Mode = SPI_MODE_MASTER;
|
||||
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
|
||||
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
|
||||
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
|
||||
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
|
||||
hspi1.Init.NSS = SPI_NSS_SOFT;
|
||||
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
|
||||
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
|
||||
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
|
||||
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
|
||||
hspi1.Init.CRCPolynomial = 10;
|
||||
if (HAL_SPI_Init(&hspi1) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN SPI1_Init 2 */
|
||||
|
||||
/* USER CODE END SPI1_Init 2 */
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -304,6 +304,134 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ADC MSP De-Initialization
|
||||
* This function freeze the hardware resources used in this example
|
||||
* @param hadc: ADC handle pointer
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
|
||||
{
|
||||
if(hadc->Instance==ADC1)
|
||||
{
|
||||
/* USER CODE BEGIN ADC1_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END ADC1_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_ADC1_CLK_DISABLE();
|
||||
|
||||
/**ADC GPIO Configuration
|
||||
PA0-WKUP1 ------> ADC_IN0
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);
|
||||
|
||||
/* USER CODE BEGIN ADC1_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END ADC1_MspDeInit 1 */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ADC MSP Initialization
|
||||
* This function configures the hardware resources used in this example
|
||||
* @param hadc: ADC handle pointer
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
if(hadc->Instance==ADC1)
|
||||
{
|
||||
/* USER CODE BEGIN ADC1_MspInit 0 */
|
||||
|
||||
/* USER CODE END ADC1_MspInit 0 */
|
||||
/* Peripheral clock enable */
|
||||
__HAL_RCC_ADC1_CLK_ENABLE();
|
||||
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
/**ADC GPIO Configuration
|
||||
PA0-WKUP1 ------> ADC_IN0
|
||||
*/
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_0;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/* USER CODE BEGIN ADC1_MspInit 1 */
|
||||
|
||||
/* USER CODE END ADC1_MspInit 1 */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief SPI MSP Initialization
|
||||
* This function configures the hardware resources used in this example
|
||||
* @param hspi: SPI handle pointer
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
if(hspi->Instance==SPI1)
|
||||
{
|
||||
/* USER CODE BEGIN SPI1_MspInit 0 */
|
||||
|
||||
/* USER CODE END SPI1_MspInit 0 */
|
||||
/* Peripheral clock enable */
|
||||
__HAL_RCC_SPI1_CLK_ENABLE();
|
||||
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
/**SPI1 GPIO Configuration
|
||||
PA5 ------> SPI1_SCK
|
||||
PA6 ------> SPI1_MISO
|
||||
PA7 ------> SPI1_MOSI
|
||||
*/
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/* USER CODE BEGIN SPI1_MspInit 1 */
|
||||
|
||||
/* USER CODE END SPI1_MspInit 1 */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief SPI MSP De-Initialization
|
||||
* This function freeze the hardware resources used in this example
|
||||
* @param hspi: SPI handle pointer
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
|
||||
{
|
||||
if(hspi->Instance==SPI1)
|
||||
{
|
||||
/* USER CODE BEGIN SPI1_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END SPI1_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_SPI1_CLK_DISABLE();
|
||||
|
||||
/**SPI1 GPIO Configuration
|
||||
PA5 ------> SPI1_SCK
|
||||
PA6 ------> SPI1_MISO
|
||||
PA7 ------> SPI1_MOSI
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
|
||||
|
||||
/* USER CODE BEGIN SPI1_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END SPI1_MspDeInit 1 */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user