1
0
forked from me/IronOS

Merge branch 'dev' into test-slow-i2c

This commit is contained in:
Ben V. Brown
2022-10-23 22:59:40 +11:00
committed by GitHub
22 changed files with 80 additions and 433 deletions

View File

@@ -14,7 +14,7 @@ jobs:
steps: steps:
- name: Install dependencies (apk) - name: Install dependencies (apk)
run: apk add --no-cache gcc-riscv-none-elf gcc-arm-none-eabi newlib-riscv-none-elf newlib-arm-none-eabi findutils python3 py3-pip make git bash run: apk add --no-cache gcc-riscv-none-elf gcc-arm-none-eabi newlib-riscv-none-elf newlib-arm-none-eabi findutils python3 py3-pip make git musl-dev clang bash clang-extra-tools
- name: Install dependencies (python) - name: Install dependencies (python)
run: python3 -m pip install bdflib run: python3 -m pip install bdflib

View File

@@ -16,7 +16,7 @@
"SleepingAdvancedString": "Slaapstand...", "SleepingAdvancedString": "Slaapstand...",
"SleepingTipAdvancedString": "Punt:", "SleepingTipAdvancedString": "Punt:",
"OffString": "Uit", "OffString": "Uit",
"DeviceFailedValidationWarning": "Your device is most likely a counterfeit!" "DeviceFailedValidationWarning": "Jouw toestel is wellicht een namaak-versie!"
}, },
"messagesWarn": { "messagesWarn": {
"ResetOKMessage": "Reset OK", "ResetOKMessage": "Reset OK",

View File

@@ -16,7 +16,7 @@
"SleepingAdvancedString": "Tr. uśpienia", "SleepingAdvancedString": "Tr. uśpienia",
"SleepingTipAdvancedString": "Grot:", "SleepingTipAdvancedString": "Grot:",
"OffString": "Wył", "OffString": "Wył",
"DeviceFailedValidationWarning": "Your device is most likely a counterfeit!" "DeviceFailedValidationWarning": "Twoje urządzenie jest najprawdopodobniej podróbką!"
}, },
"messagesWarn": { "messagesWarn": {
"ResetOKMessage": "Reset OK", "ResetOKMessage": "Reset OK",

View File

@@ -13,10 +13,10 @@
"UndervoltageString": "Nízke napätie", "UndervoltageString": "Nízke napätie",
"InputVoltageString": "Vstupné U: ", "InputVoltageString": "Vstupné U: ",
"SleepingSimpleString": "Chrr", "SleepingSimpleString": "Chrr",
"SleepingAdvancedString": "Pokojový režim..", "SleepingAdvancedString": "Pokojový režim.",
"SleepingTipAdvancedString": "Hrot:", "SleepingTipAdvancedString": "Hrot:",
"OffString": "Vyp", "OffString": "Vyp",
"DeviceFailedValidationWarning": "Your device is most likely a counterfeit!" "DeviceFailedValidationWarning": "Vaše zariadenie je pravdepodobne falzifikát!"
}, },
"messagesWarn": { "messagesWarn": {
"ResetOKMessage": "Reset OK", "ResetOKMessage": "Reset OK",
@@ -331,10 +331,10 @@
}, },
"LOGOTime": { "LOGOTime": {
"text2": [ "text2": [
"Boot logo", "Trvanie",
"duration" "boot loga"
], ],
"desc": "Sets the duration for the boot logo (s=seconds)" "desc": "Doba trvania boot loga (s=sekundy)"
} }
} }
} }

View File

@@ -17,7 +17,7 @@ extern "C" {
*/ */
// Erase the flash, then save the buffer. Returns 1 if worked // Erase the flash, then save the buffer. Returns 1 if worked
uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length); void flash_save_buffer(const uint8_t *buffer, const uint16_t length);
void flash_read_buffer(uint8_t *buffer, const uint16_t length); void flash_read_buffer(uint8_t *buffer, const uint16_t length);
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -10,14 +10,15 @@
#include "stm32f1xx_hal.h" #include "stm32f1xx_hal.h"
#include "string.h" #include "string.h"
static uint16_t settings_page[512] __attribute__((section(".settings_page"))); #define SETTINGS_START_PAGE (0x08000000 + (127 * 1024))
uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
void flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
FLASH_EraseInitTypeDef pEraseInit; FLASH_EraseInitTypeDef pEraseInit;
pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES; pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
pEraseInit.Banks = FLASH_BANK_1; pEraseInit.Banks = FLASH_BANK_1;
pEraseInit.NbPages = 1; pEraseInit.NbPages = 1;
pEraseInit.PageAddress = (uint32_t)settings_page; pEraseInit.PageAddress = (uint32_t)SETTINGS_START_PAGE;
uint32_t failingAddress = 0; uint32_t failingAddress = 0;
resetWatchdog(); resetWatchdog();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY);
@@ -32,13 +33,9 @@ uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
HAL_FLASH_Unlock(); HAL_FLASH_Unlock();
for (uint16_t i = 0; i < (length / 2); i++) { for (uint16_t i = 0; i < (length / 2); i++) {
resetWatchdog(); resetWatchdog();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, (uint32_t)&settings_page[i], data[i]); HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, SETTINGS_START_PAGE+ (i*sizeof(uint16_t)), data[i]);
} }
HAL_FLASH_Lock(); HAL_FLASH_Lock();
return 1;
} }
void flash_read_buffer(uint8_t *buffer, const uint16_t length) { void flash_read_buffer(uint8_t *buffer, const uint16_t length) { memcpy(buffer, (uint8_t*)SETTINGS_START_PAGE, length); }
memset(buffer, 0, length);
memcpy(buffer, settings_page, length);
}

View File

@@ -116,17 +116,6 @@ SECTIONS
_edata = .; /* define a global symbol at data end */ _edata = .; /* define a global symbol at data end */
} >RAM AT> ROM } >RAM AT> ROM
.logo_page (NOLOAD) :
{
. = ABSOLUTE(__FLASH_END_ADDR__ - 2048);
KEEP (*(.logo_page*))
} > ROM
.settings_page (NOLOAD) :
{
. = ABSOLUTE(__FLASH_END_ADDR__ - 1024);
KEEP (*(.settings_page*))
} > ROM
.bss : .bss :
{ {

View File

@@ -29,66 +29,29 @@ void resetWatchdog() { HAL_IWDG_Refresh(&hiwdg); }
static const uint16_t NTCHandleLookup[] = { static const uint16_t NTCHandleLookup[] = {
// ADC Reading , Temp in C // ADC Reading , Temp in C
29189, 0, // 29189, 0, //
29014, 1, //
28832, 2, // 28832, 2, //
28644, 3, //
28450, 4, // 28450, 4, //
28249, 5, //
28042, 6, // 28042, 6, //
27828, 7, //
27607, 8, // 27607, 8, //
27380, 9, //
27146, 10, // 27146, 10, //
26906, 11, //
26660, 12, // 26660, 12, //
26407, 13, //
26147, 14, // 26147, 14, //
25882, 15, //
25610, 16, // 25610, 16, //
25332, 17, //
25049, 18, // 25049, 18, //
24759, 19, //
24465, 20, // 24465, 20, //
24164, 21, //
23859, 22, // 23859, 22, //
23549, 23, //
23234, 24, // 23234, 24, //
22915, 25, //
22591, 26, // 22591, 26, //
22264, 27, //
21933, 28, // 21933, 28, //
21599, 29, //
21261, 30, // 21261, 30, //
20921, 31, //
20579, 32, // 20579, 32, //
20234, 33, //
19888, 34, // 19888, 34, //
19541, 35, //
19192, 36, // 19192, 36, //
18843, 37, //
18493, 38, // 18493, 38, //
18143, 39, //
17793, 40, // 17793, 40, //
17444, 41, //
17096, 42, // 17096, 42, //
16750, 43, //
16404, 44, // 16404, 44, //
16061, 45, // 16061, 45, //
// 15719, 46, //
// 15380, 47, //
// 15044, 48, //
// 14710, 49, //
// 14380, 50, //
// 14053, 51, //
// 13729, 52, //
// 13410, 53, //
// 13094, 54, //
// 12782, 55, //
// 12475, 56, //
// 12172, 57, //
// 11874, 58, //
// 11580, 59, //
// 11292, 60, //
}; };
#endif #endif

View File

@@ -124,7 +124,7 @@ __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void) {
\return PSP Register value \return PSP Register value
*/ */
__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void) { __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void) {
register uint32_t result; uint32_t result;
__ASM volatile("MRS %0, psp\n" : "=r"(result)); __ASM volatile("MRS %0, psp\n" : "=r"(result));
return (result); return (result);
@@ -143,7 +143,7 @@ __attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProc
\return MSP Register value \return MSP Register value
*/ */
__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void) { __attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void) {
register uint32_t result; uint32_t result;
__ASM volatile("MRS %0, msp\n" : "=r"(result)); __ASM volatile("MRS %0, msp\n" : "=r"(result));
return (result); return (result);

View File

@@ -278,8 +278,8 @@ typedef struct {
#define ADC_CHANNEL_16 ((uint32_t)(ADC_SQR3_SQ1_4)) #define ADC_CHANNEL_16 ((uint32_t)(ADC_SQR3_SQ1_4))
#define ADC_CHANNEL_17 ((uint32_t)(ADC_SQR3_SQ1_4 | ADC_SQR3_SQ1_0)) #define ADC_CHANNEL_17 ((uint32_t)(ADC_SQR3_SQ1_4 | ADC_SQR3_SQ1_0))
#define ADC_CHANNEL_TEMPSENSOR ADC_CHANNEL_16 /* ADC internal channel (no connection on device pin) */ // #define ADC_CHANNEL_TEMPSENSOR ADC_CHANNEL_16 /* ADC internal channel (no connection on device pin) */
#define ADC_CHANNEL_VREFINT ADC_CHANNEL_17 /* ADC internal channel (no connection on device pin) */ // #define ADC_CHANNEL_VREFINT ADC_CHANNEL_17 /* ADC internal channel (no connection on device pin) */
/** /**
* @} * @}
*/ */
@@ -812,10 +812,6 @@ uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc);
/* ADC IRQHandler and Callbacks used in non-blocking modes (Interruption and DMA) */ /* ADC IRQHandler and Callbacks used in non-blocking modes (Interruption and DMA) */
void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc); void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc);
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc);
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc);
void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc);
void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc);
/** /**
* @} * @}
*/ */
@@ -852,8 +848,6 @@ HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef *hadc);
HAL_StatusTypeDef ADC_ConversionStop_Disable(ADC_HandleTypeDef *hadc); HAL_StatusTypeDef ADC_ConversionStop_Disable(ADC_HandleTypeDef *hadc);
void ADC_StabilizationTime(uint32_t DelayUs); void ADC_StabilizationTime(uint32_t DelayUs);
void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma); void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma);
void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma);
void ADC_DMAError(DMA_HandleTypeDef *hdma);
/** /**
* @} * @}
*/ */

View File

@@ -233,7 +233,7 @@ typedef struct {
* @{ * @{
*/ */
#define I2C_ADDRESSINGMODE_7BIT 0x00004000U #define I2C_ADDRESSINGMODE_7BIT 0x00004000U
#define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | 0x00004000U) // #define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | 0x00004000U)
/** /**
* @} * @}
*/ */
@@ -317,7 +317,7 @@ typedef struct {
#define I2C_FLAG_TXE 0x00010080U #define I2C_FLAG_TXE 0x00010080U
#define I2C_FLAG_RXNE 0x00010040U #define I2C_FLAG_RXNE 0x00010040U
#define I2C_FLAG_STOPF 0x00010010U #define I2C_FLAG_STOPF 0x00010010U
#define I2C_FLAG_ADD10 0x00010008U // #define I2C_FLAG_ADD10 0x00010008U
#define I2C_FLAG_BTF 0x00010004U #define I2C_FLAG_BTF 0x00010004U
#define I2C_FLAG_ADDR 0x00010002U #define I2C_FLAG_ADDR 0x00010002U
#define I2C_FLAG_SB 0x00010001U #define I2C_FLAG_SB 0x00010001U

View File

@@ -1194,11 +1194,6 @@ HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, ui
/* Set the DMA transfer complete callback */ /* Set the DMA transfer complete callback */
hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt; hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
/* Set the DMA half transfer complete callback */
hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
/* Set the DMA error callback */
hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
/* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC */ /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC */
/* start (in case of SW start): */ /* start (in case of SW start): */
@@ -1357,8 +1352,6 @@ void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc) {
} }
} }
/* Conversion complete callback */
HAL_ADC_ConvCpltCallback(hadc);
/* Clear regular group conversion flag */ /* Clear regular group conversion flag */
__HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_STRT | ADC_FLAG_EOC); __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_STRT | ADC_FLAG_EOC);
@@ -1401,73 +1394,10 @@ void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc) {
} }
} }
/* ========== Check Analog watchdog flags ========== */
if (__HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_AWD)) {
if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_AWD)) {
/* Set ADC state */
SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
/* Level out of window callback */
HAL_ADC_LevelOutOfWindowCallback(hadc);
/* Clear the ADC analog watchdog flag */
__HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD);
}
}
} }
/**
* @brief Conversion complete callback in non blocking mode
* @param hadc: ADC handle
* @retval None
*/
__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {
/* Prevent unused argument(s) compilation warning */
UNUSED(hadc);
/* NOTE : This function should not be modified. When the callback is needed,
function HAL_ADC_ConvCpltCallback must be implemented in the user file.
*/
}
/**
* @brief Conversion DMA half-transfer callback in non blocking mode
* @param hadc: ADC handle
* @retval None
*/
__weak void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc) {
/* Prevent unused argument(s) compilation warning */
UNUSED(hadc);
/* NOTE : This function should not be modified. When the callback is needed,
function HAL_ADC_ConvHalfCpltCallback must be implemented in the user file.
*/
}
/**
* @brief Analog watchdog callback in non blocking mode.
* @param hadc: ADC handle
* @retval None
*/
__weak void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc) {
/* Prevent unused argument(s) compilation warning */
UNUSED(hadc);
/* NOTE : This function should not be modified. When the callback is needed,
function HAL_ADC_LevelOutOfWindowCallback must be implemented in the user file.
*/
}
/**
* @brief ADC error callback in non blocking mode
* (ADC conversion with interruption or transfer by DMA)
* @param hadc: ADC handle
* @retval None
*/
__weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc) {
/* Prevent unused argument(s) compilation warning */
UNUSED(hadc);
/* NOTE : This function should not be modified. When the callback is needed,
function HAL_ADC_ErrorCallback must be implemented in the user file.
*/
}
/** /**
* @} * @}
@@ -1509,7 +1439,6 @@ __weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc) {
*/ */
HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig) { HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig) {
HAL_StatusTypeDef tmp_hal_status = HAL_OK; HAL_StatusTypeDef tmp_hal_status = HAL_OK;
__IO uint32_t wait_loop_index = 0U;
/* Check the parameters */ /* Check the parameters */
assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
@@ -1543,32 +1472,7 @@ HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConf
MODIFY_REG(hadc->Instance->SMPR2, ADC_SMPR2(ADC_SMPR2_SMP0, sConfig->Channel), ADC_SMPR2(sConfig->SamplingTime, sConfig->Channel)); MODIFY_REG(hadc->Instance->SMPR2, ADC_SMPR2(ADC_SMPR2_SMP0, sConfig->Channel), ADC_SMPR2(sConfig->SamplingTime, sConfig->Channel));
} }
/* If ADC1 Channel_16 or Channel_17 is selected, enable Temperature sensor */
/* and VREFINT measurement path. */
if ((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) || (sConfig->Channel == ADC_CHANNEL_VREFINT)) {
/* For STM32F1 devices with several ADC: Only ADC1 can access internal */
/* measurement channels (VrefInt/TempSensor). If these channels are */
/* intended to be set on other ADC instances, an error is reported. */
if (hadc->Instance == ADC1) {
if (READ_BIT(hadc->Instance->CR2, ADC_CR2_TSVREFE) == RESET) {
SET_BIT(hadc->Instance->CR2, ADC_CR2_TSVREFE);
if ((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR)) {
/* Delay for temperature sensor stabilization time */
/* Compute number of CPU cycles to wait for */
wait_loop_index = (ADC_TEMPSENSOR_DELAY_US * (SystemCoreClock / 1000000U));
while (wait_loop_index != 0U) {
wait_loop_index--;
}
}
}
} else {
/* Update ADC state machine to error */
SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
tmp_hal_status = HAL_ERROR;
}
}
/* Process unlocked */ /* Process unlocked */
__HAL_UNLOCK(hadc); __HAL_UNLOCK(hadc);
@@ -1802,45 +1706,16 @@ void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma) {
} }
} }
/* Conversion complete callback */
HAL_ADC_ConvCpltCallback(hadc);
} else { } else {
/* Call DMA error callback */ /* Call DMA error callback */
hadc->DMA_Handle->XferErrorCallback(hdma); hadc->DMA_Handle->XferErrorCallback(hdma);
} }
} }
/**
* @brief DMA half transfer complete callback.
* @param hdma: pointer to DMA handle.
* @retval None
*/
void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma) {
/* Retrieve ADC handle corresponding to current DMA handle */
ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
/* Half conversion callback */
HAL_ADC_ConvHalfCpltCallback(hadc);
}
/**
* @brief DMA error callback
* @param hdma: pointer to DMA handle.
* @retval None
*/
void ADC_DMAError(DMA_HandleTypeDef *hdma) {
/* Retrieve ADC handle corresponding to current DMA handle */
ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
/* Set ADC state */
SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
/* Set ADC error code to DMA error */
SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_DMA);
/* Error callback */
HAL_ADC_ErrorCallback(hadc);
}
/** /**
* @} * @}

View File

@@ -661,11 +661,6 @@ HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef *hadc, uint32_t
/* Set the DMA transfer complete callback */ /* Set the DMA transfer complete callback */
hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt; hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
/* Set the DMA half transfer complete callback */
hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
/* Set the DMA error callback */
hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
/* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC */ /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC */
/* start (in case of SW start): */ /* start (in case of SW start): */
@@ -905,7 +900,6 @@ __weak void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc) {
*/ */
HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef *hadc, ADC_InjectionConfTypeDef *sConfigInjected) { HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef *hadc, ADC_InjectionConfTypeDef *sConfigInjected) {
HAL_StatusTypeDef tmp_hal_status = HAL_OK; HAL_StatusTypeDef tmp_hal_status = HAL_OK;
__IO uint32_t wait_loop_index = 0U;
/* Check the parameters */ /* Check the parameters */
assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
@@ -1034,11 +1028,8 @@ HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef *hadc, ADC_I
MODIFY_REG(hadc->Instance->SMPR2, ADC_SMPR2(ADC_SMPR2_SMP0, sConfigInjected->InjectedChannel), ADC_SMPR2(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel)); MODIFY_REG(hadc->Instance->SMPR2, ADC_SMPR2(ADC_SMPR2_SMP0, sConfigInjected->InjectedChannel), ADC_SMPR2(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel));
} }
/* If ADC1 InjectedChannel_16 or InjectedChannel_17 is selected, enable Temperature sensor */
/* and VREFINT measurement path. */
if ((sConfigInjected->InjectedChannel == ADC_CHANNEL_TEMPSENSOR) || (sConfigInjected->InjectedChannel == ADC_CHANNEL_VREFINT)) {
SET_BIT(hadc->Instance->CR2, ADC_CR2_TSVREFE);
}
/* Configure the offset: offset enable/disable, InjectedChannel, offset value */ /* Configure the offset: offset enable/disable, InjectedChannel, offset value */
switch (sConfigInjected->InjectedRank) { switch (sConfigInjected->InjectedRank) {
@@ -1060,32 +1051,6 @@ HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef *hadc, ADC_I
break; break;
} }
/* If ADC1 Channel_16 or Channel_17 is selected, enable Temperature sensor */
/* and VREFINT measurement path. */
if ((sConfigInjected->InjectedChannel == ADC_CHANNEL_TEMPSENSOR) || (sConfigInjected->InjectedChannel == ADC_CHANNEL_VREFINT)) {
/* For STM32F1 devices with several ADC: Only ADC1 can access internal */
/* measurement channels (VrefInt/TempSensor). If these channels are */
/* intended to be set on other ADC instances, an error is reported. */
if (hadc->Instance == ADC1) {
if (READ_BIT(hadc->Instance->CR2, ADC_CR2_TSVREFE) == RESET) {
SET_BIT(hadc->Instance->CR2, ADC_CR2_TSVREFE);
if ((sConfigInjected->InjectedChannel == ADC_CHANNEL_TEMPSENSOR)) {
/* Delay for temperature sensor stabilization time */
/* Compute number of CPU cycles to wait for */
wait_loop_index = (ADC_TEMPSENSOR_DELAY_US * (SystemCoreClock / 1000000U));
while (wait_loop_index != 0U) {
wait_loop_index--;
}
}
}
} else {
/* Update ADC state machine to error */
SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
tmp_hal_status = HAL_ERROR;
}
}
/* Process unlocked */ /* Process unlocked */
__HAL_UNLOCK(hadc); __HAL_UNLOCK(hadc);

View File

@@ -309,7 +309,6 @@ static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c);
static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c); static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c);
static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c); static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c);
static HAL_StatusTypeDef I2C_Master_SB(I2C_HandleTypeDef *hi2c); static HAL_StatusTypeDef I2C_Master_SB(I2C_HandleTypeDef *hi2c);
static HAL_StatusTypeDef I2C_Master_ADD10(I2C_HandleTypeDef *hi2c);
static HAL_StatusTypeDef I2C_Master_ADDR(I2C_HandleTypeDef *hi2c); static HAL_StatusTypeDef I2C_Master_ADDR(I2C_HandleTypeDef *hi2c);
/** /**
@@ -957,16 +956,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData
/* Clear ADDR flag */ /* Clear ADDR flag */
__HAL_I2C_CLEAR_ADDRFLAG(hi2c); __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
/* If 10bit addressing mode is selected */
if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) {
/* Wait until ADDR flag is set */
if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) {
return HAL_TIMEOUT;
}
/* Clear ADDR flag */
__HAL_I2C_CLEAR_ADDRFLAG(hi2c);
}
while (hi2c->XferSize > 0U) { while (hi2c->XferSize > 0U) {
/* Wait until TXE flag is set */ /* Wait until TXE flag is set */
@@ -3083,10 +3073,6 @@ void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c) {
if (((sr1itflags & I2C_FLAG_SB) != RESET) && ((itsources & I2C_IT_EVT) != RESET)) { if (((sr1itflags & I2C_FLAG_SB) != RESET) && ((itsources & I2C_IT_EVT) != RESET)) {
I2C_Master_SB(hi2c); I2C_Master_SB(hi2c);
} }
/* ADD10 Set -------------------------------------------------------------*/
else if (((sr1itflags & I2C_FLAG_ADD10) != RESET) && ((itsources & I2C_IT_EVT) != RESET)) {
I2C_Master_ADD10(hi2c);
}
/* ADDR Set --------------------------------------------------------------*/ /* ADDR Set --------------------------------------------------------------*/
else if (((sr1itflags & I2C_FLAG_ADDR) != RESET) && ((itsources & I2C_IT_EVT) != RESET)) { else if (((sr1itflags & I2C_FLAG_ADDR) != RESET) && ((itsources & I2C_IT_EVT) != RESET)) {
I2C_Master_ADDR(hi2c); I2C_Master_ADDR(hi2c);
@@ -3731,18 +3717,6 @@ static HAL_StatusTypeDef I2C_Master_SB(I2C_HandleTypeDef *hi2c) {
return HAL_OK; return HAL_OK;
} }
/**
* @brief Handle ADD10 flag for Master
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
* the configuration information for I2C module
* @retval HAL status
*/
static HAL_StatusTypeDef I2C_Master_ADD10(I2C_HandleTypeDef *hi2c) {
/* Send slave address */
hi2c->Instance->DR = I2C_10BIT_ADDRESS(hi2c->Devaddress);
return HAL_OK;
}
/** /**
* @brief Handle ADDR flag for Master * @brief Handle ADDR flag for Master
@@ -3760,14 +3734,6 @@ static HAL_StatusTypeDef I2C_Master_ADDR(I2C_HandleTypeDef *hi2c) {
if ((hi2c->EventCount == 0U) && (CurrentMode == HAL_I2C_MODE_MEM)) { if ((hi2c->EventCount == 0U) && (CurrentMode == HAL_I2C_MODE_MEM)) {
/* Clear ADDR flag */ /* Clear ADDR flag */
__HAL_I2C_CLEAR_ADDRFLAG(hi2c); __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
} else if ((hi2c->EventCount == 0U) && (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)) {
/* Clear ADDR flag */
__HAL_I2C_CLEAR_ADDRFLAG(hi2c);
/* Generate Restart */
hi2c->Instance->CR1 |= I2C_CR1_START;
hi2c->EventCount++;
} else { } else {
if (hi2c->XferCount == 0U) { if (hi2c->XferCount == 0U) {
/* Clear ADDR flag */ /* Clear ADDR flag */
@@ -3996,22 +3962,8 @@ static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_
if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) { if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) {
/* Send slave address */ /* Send slave address */
hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
} else {
/* Send header of slave address */
hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
/* Wait until ADD10 flag is set */
if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK) {
if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) {
return HAL_ERROR;
} else {
return HAL_TIMEOUT;
}
} }
/* Send slave address */
hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
}
/* Wait until ADDR flag is set */ /* Wait until ADDR flag is set */
if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) { if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) {
@@ -4059,45 +4011,8 @@ static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t
if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) { if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) {
/* Send slave address */ /* Send slave address */
hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
} else {
/* Send header of slave address */
hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
/* Wait until ADD10 flag is set */
if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK) {
if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) {
return HAL_ERROR;
} else {
return HAL_TIMEOUT;
}
} }
/* Send slave address */
hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
/* Wait until ADDR flag is set */
if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) {
if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) {
return HAL_ERROR;
} else {
return HAL_TIMEOUT;
}
}
/* Clear ADDR flag */
__HAL_I2C_CLEAR_ADDRFLAG(hi2c);
/* Generate Restart */
hi2c->Instance->CR1 |= I2C_CR1_START;
/* Wait until SB flag is set */
if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) {
return HAL_TIMEOUT;
}
/* Send header of slave address */
hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress);
}
/* Wait until ADDR flag is set */ /* Wait until ADDR flag is set */
if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) { if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) {

View File

@@ -10,14 +10,14 @@
#include "stm32f1xx_hal.h" #include "stm32f1xx_hal.h"
#include "string.h" #include "string.h"
static uint16_t settings_page[512] __attribute__((section(".settings_page"))); #define SETTINGS_START_PAGE (0x08000000 + (63 * 1024))
uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) { void flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
FLASH_EraseInitTypeDef pEraseInit; FLASH_EraseInitTypeDef pEraseInit;
pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES; pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
pEraseInit.Banks = FLASH_BANK_1; pEraseInit.Banks = FLASH_BANK_1;
pEraseInit.NbPages = 1; pEraseInit.NbPages = 1;
pEraseInit.PageAddress = (uint32_t)settings_page; pEraseInit.PageAddress = (uint32_t)SETTINGS_START_PAGE;
uint32_t failingAddress = 0; uint32_t failingAddress = 0;
resetWatchdog(); resetWatchdog();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY);
@@ -32,10 +32,10 @@ uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
HAL_FLASH_Unlock(); HAL_FLASH_Unlock();
for (uint16_t i = 0; i < (length / 2); i++) { for (uint16_t i = 0; i < (length / 2); i++) {
resetWatchdog(); resetWatchdog();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, (uint32_t)&settings_page[i], data[i]); HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, SETTINGS_START_PAGE+ (i*sizeof(uint16_t)), data[i]);
} }
HAL_FLASH_Lock(); HAL_FLASH_Lock();
return 1;
} }
void flash_read_buffer(uint8_t *buffer, const uint16_t length) { memcpy(buffer, settings_page, length); } void flash_read_buffer(uint8_t *buffer, const uint16_t length) { memcpy(buffer, (uint8_t*)SETTINGS_START_PAGE, length); }

View File

@@ -189,24 +189,27 @@ StackType_t *pxPortInitialiseStack(StackType_t *pxTopOfStack, TaskFunction_t pxC
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
static void prvTaskExitError(void) { static void prvTaskExitError(void) {
volatile uint32_t ulDummy = 0UL; // volatile uint32_t ulDummy = 0UL;
/* A function that implements a task must not exit or attempt to return to // /* A function that implements a task must not exit or attempt to return to
its caller as there is nothing to return to. If a task wants to exit it // its caller as there is nothing to return to. If a task wants to exit it
should instead call vTaskDelete( NULL ). // should instead call vTaskDelete( NULL ).
// Artificially force an assert() to be triggered if configASSERT() is
// defined, then stop here so application writers can catch the error. */
// configASSERT(uxCriticalNesting == ~0UL);
// portDISABLE_INTERRUPTS();
// while (ulDummy == 0) {
// /* This file calls prvTaskExitError() after the scheduler has been
// started to remove a compiler warning about the function being defined
// but never called. ulDummy is used purely to quieten other warnings
// about code appearing after this function is called - making ulDummy
// volatile makes the compiler think the function could return and
// therefore not output an 'unreachable code' warning for code that appears
// after it. */
// }
for(;;){
Artificially force an assert() to be triggered if configASSERT() is
defined, then stop here so application writers can catch the error. */
configASSERT(uxCriticalNesting == ~0UL);
portDISABLE_INTERRUPTS();
while (ulDummy == 0) {
/* This file calls prvTaskExitError() after the scheduler has been
started to remove a compiler warning about the function being defined
but never called. ulDummy is used purely to quieten other warnings
about code appearing after this function is called - making ulDummy
volatile makes the compiler think the function could return and
therefore not output an 'unreachable code' warning for code that appears
after it. */
} }
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/

View File

@@ -116,17 +116,6 @@ SECTIONS
_edata = .; /* define a global symbol at data end */ _edata = .; /* define a global symbol at data end */
} >RAM AT> ROM } >RAM AT> ROM
.logo_page (NOLOAD) :
{
. = ABSOLUTE(__FLASH_END_ADDR__ - 2048);
KEEP (*(.logo_page*))
} > ROM
.settings_page (NOLOAD) :
{
. = ABSOLUTE(__FLASH_END_ADDR__ - 1024);
KEEP (*(.settings_page*))
} > ROM
.bss : .bss :
{ {

View File

@@ -11,21 +11,6 @@ extern TIM_HandleTypeDef htim1; // used for the systick
/* Cortex-M3 Processor Interruption and Exception Handlers */ /* Cortex-M3 Processor Interruption and Exception Handlers */
/******************************************************************************/ /******************************************************************************/
void NMI_Handler(void) {}
// We have the assembly for a breakpoint trigger here to halt the system when a debugger is connected
// Hardfault handler, often a screwup in the code
void HardFault_Handler(void) {}
// Memory management unit had an error
void MemManage_Handler(void) {}
// Prefetcher or busfault occured
void BusFault_Handler(void) {}
void UsageFault_Handler(void) {}
void DebugMon_Handler(void) {}
// Systick is used by FreeRTOS tick // Systick is used by FreeRTOS tick
void SysTick_Handler(void) { osSystickHandler(); } void SysTick_Handler(void) { osSystickHandler(); }

View File

@@ -10,10 +10,8 @@
#include "gd32vf103_libopt.h" #include "gd32vf103_libopt.h"
#include "string.h" #include "string.h"
#define FMC_PAGE_SIZE ((uint16_t)0x400U) #define FMC_PAGE_SIZE ((uint16_t)0x400U)
// static uint16_t settings_page[FMC_PAGE_SIZE] __attribute__ ((section (".settings_page")));
// Linker script doesnt want to play, so for now its hard coded
#define SETTINGS_START_PAGE (0x08000000 + (127 * 1024)) #define SETTINGS_START_PAGE (0x08000000 + (127 * 1024))
uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) { void flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
/* unlock the flash program/erase controller */ /* unlock the flash program/erase controller */
fmc_unlock(); fmc_unlock();
@@ -34,7 +32,6 @@ uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
resetWatchdog(); resetWatchdog();
} }
fmc_lock(); fmc_lock();
return 1;
} }
void flash_read_buffer(uint8_t *buffer, const uint16_t length) { void flash_read_buffer(uint8_t *buffer, const uint16_t length) {

View File

@@ -41,6 +41,7 @@ extern "C" {
* These settings should not be altered. * These settings should not be altered.
*----------------------------------------------------------- *-----------------------------------------------------------
*/ */
#include "FreeRTOSConfig.h"
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>

View File

@@ -14,10 +14,9 @@
#define SETTINGS_START_PAGE (1023 * FLASH_PAGE_SIZE) // Hal auto offsets base addr #define SETTINGS_START_PAGE (1023 * FLASH_PAGE_SIZE) // Hal auto offsets base addr
uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) { void flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
BL_Err_Type err = flash_erase(SETTINGS_START_PAGE, FLASH_PAGE_SIZE); BL_Err_Type err = flash_erase(SETTINGS_START_PAGE, FLASH_PAGE_SIZE);
err = flash_write(SETTINGS_START_PAGE, buffer, length); err = flash_write(SETTINGS_START_PAGE, buffer, length);
return err != SUCCESS;
} }
void flash_read_buffer(uint8_t *buffer, const uint16_t length) { flash_read(SETTINGS_START_PAGE, buffer, length); } void flash_read_buffer(uint8_t *buffer, const uint16_t length) { flash_read(SETTINGS_START_PAGE, buffer, length); }

View File

@@ -152,15 +152,15 @@ S_SRCS := $(shell find $(MINIWARE_STARTUP_DIR) -type f -name '*.S')
LDSCRIPT=$(MINIWARE_LD_FILE) LDSCRIPT=$(MINIWARE_LD_FILE)
DEV_GLOBAL_DEFS= -D STM32F103T8Ux -D STM32F1 -D STM32 -D USE_HAL_DRIVER -D STM32F103xB -D USE_RTOS_SYSTICK -D GCC_ARMCM3 \ DEV_GLOBAL_DEFS= -D STM32F103T8Ux -D STM32F1 -D STM32 -D USE_HAL_DRIVER -D STM32F103xB -D USE_RTOS_SYSTICK -D GCC_ARMCM3 \
-D ARM_MATH_CM3 \ -D ARM_MATH_CM3 \
-D STM32F10X_MD -D STM32F10X_MD -finline-limit=9999999
DEV_LDFLAGS= DEV_LDFLAGS= -Wl,--wrap=printf -Wl,--no-wchar-size-warning
DEV_AFLAGS= DEV_AFLAGS=
DEV_CFLAGS= -D VECT_TAB_OFFSET=$(bootldr_size)U DEV_CFLAGS= -D VECT_TAB_OFFSET=$(bootldr_size)U
DEV_CXXFLAGS= DEV_CXXFLAGS=
CPUFLAGS= -mcpu=cortex-m3 \ CPUFLAGS= -mcpu=cortex-m3 \
-mthumb \ -mthumb \
-mfloat-abi=soft -mfloat-abi=soft
flash_size=64k flash_size=62k
bootldr_size=0x4000 bootldr_size=0x4000
DEVICE_DFU_ADDRESS=0x08004000 DEVICE_DFU_ADDRESS=0x08004000
DEVICE_DFU_VID_PID=0x1209:0xDB42 DEVICE_DFU_VID_PID=0x1209:0xDB42
@@ -186,7 +186,7 @@ DEV_CXXFLAGS=
CPUFLAGS= -mcpu=cortex-m3 \ CPUFLAGS= -mcpu=cortex-m3 \
-mthumb \ -mthumb \
-mfloat-abi=soft -mfloat-abi=soft
flash_size=128k flash_size=126k
bootldr_size=32k bootldr_size=32k
DEVICE_DFU_ADDRESS=0x08008000 DEVICE_DFU_ADDRESS=0x08008000
DEVICE_DFU_VID_PID=0x1209:0xDB42 DEVICE_DFU_VID_PID=0x1209:0xDB42
@@ -271,7 +271,7 @@ CPUFLAGS= -march=rv32imafc \
-mcmodel=medany -fsigned-char -fno-builtin -nostartfiles \ -mcmodel=medany -fsigned-char -fno-builtin -nostartfiles \
-DportasmHANDLE_INTERRUPT=FreeRTOS_Interrupt_Handler -DARCH_RISCV -D__RISCV_FEATURE_MVE=0 -DportUSING_MPU_WRAPPERS=0 -DportasmHANDLE_INTERRUPT=FreeRTOS_Interrupt_Handler -DARCH_RISCV -D__RISCV_FEATURE_MVE=0 -DportUSING_MPU_WRAPPERS=0
# -DBFLB_USE_ROM_DRIVER=1 # -DBFLB_USE_ROM_DRIVER=1
DEV_LDFLAGS=-nostartfiles -DDEBUG DEV_LDFLAGS=-nostartfiles
DEV_AFLAGS= DEV_AFLAGS=
DEV_GLOBAL_DEFS= DEV_GLOBAL_DEFS=
#Required to be turned off due to their drivers tripping warnings #Required to be turned off due to their drivers tripping warnings
@@ -313,12 +313,11 @@ $(shell find $(DEVICE_BSP_DIR) -type d \( $(EXCLUDED_DIRS) \) -prune -false -o
$(shell find $(SOURCE_MIDDLEWARES_DIR) -type f -name '*.cpp') $(shell find $(SOURCE_MIDDLEWARES_DIR) -type f -name '*.cpp')
# code optimisation ------------------------------------------------------------ # code optimisation ------------------------------------------------------------
OPTIM=-Os -flto -finline-small-functions -findirect-inlining -fdiagnostics-color -ffunction-sections -fdata-sections -fshort-enums -fsingle-precision-constant -fno-common OPTIM=-Os -foptimize-strlen -faggressive-loop-optimizations -fdevirtualize-at-ltrans -fmerge-all-constants -fshort-wchar -flto -finline-small-functions -finline-functions -findirect-inlining -fdiagnostics-color -ffunction-sections -fdata-sections -fshort-enums -fsingle-precision-constant -fno-common -fno-math-errno -ffast-math -ffinite-math-only -fno-signed-zeros -fsingle-precision-constant
# global defines --------------------------------------------------------------- # global defines ---------------------------------------------------------------
GLOBAL_DEFINES += $(DEV_GLOBAL_DEFS) -D USE_RTOS_SYSTICK -D MODEL_$(model) -D VECT_TAB_OFFSET=$(bootldr_size)U -fshort-wchar GLOBAL_DEFINES += $(DEV_GLOBAL_DEFS) -D USE_RTOS_SYSTICK -D MODEL_$(model) -D VECT_TAB_OFFSET=$(bootldr_size)U -fshort-wchar
DEBUG=-g3
ifdef swd_enable ifdef swd_enable
GLOBAL_DEFINES += -DSWD_ENABLE GLOBAL_DEFINES += -DSWD_ENABLE
endif endif
@@ -343,6 +342,7 @@ endif
CC=$(COMPILER_PREFIX)-gcc CC=$(COMPILER_PREFIX)-gcc
CPP=$(COMPILER_PREFIX)-g++ CPP=$(COMPILER_PREFIX)-g++
OBJCOPY=$(COMPILER_PREFIX)-objcopy OBJCOPY=$(COMPILER_PREFIX)-objcopy
SIZE=$(COMPILER_PREFIX)-size
OBJDUMP=$(COMPILER_PREFIX)-objdump OBJDUMP=$(COMPILER_PREFIX)-objdump
# use gcc in assembler mode so we can use defines etc in assembly # use gcc in assembler mode so we can use defines etc in assembly
AS=$(COMPILER_PREFIX)-gcc -x assembler-with-cpp AS=$(COMPILER_PREFIX)-gcc -x assembler-with-cpp
@@ -399,13 +399,12 @@ CHECKOPTIONS_C= $(CHECKOPTIONS) -Wbad-function-cast
CXXFLAGS=$(DEV_CXXFLAGS) \ CXXFLAGS=$(DEV_CXXFLAGS) \
$(CPUFLAGS) \ $(CPUFLAGS) \
$(DEBUG) \
$(INCLUDES) \ $(INCLUDES) \
$(GLOBAL_DEFINES) \ $(GLOBAL_DEFINES) \
-D${COMPILER} \ -D${COMPILER} \
-MMD \ -MMD \
$(CHECKOPTIONS) \ $(CHECKOPTIONS) \
-std=c++14 \ -std=c++17 \
$(OPTIM) \ $(OPTIM) \
-fno-rtti \ -fno-rtti \
-fno-exceptions \ -fno-exceptions \
@@ -418,7 +417,6 @@ CXXFLAGS=$(DEV_CXXFLAGS) \
CFLAGS=$(DEV_CFLAGS) \ CFLAGS=$(DEV_CFLAGS) \
$(CPUFLAGS) \ $(CPUFLAGS) \
$(DEBUG) \
$(INCLUDES) \ $(INCLUDES) \
$(CHECKOPTIONS_C) \ $(CHECKOPTIONS_C) \
$(GLOBAL_DEFINES) \ $(GLOBAL_DEFINES) \
@@ -435,7 +433,6 @@ AFLAGS= $(CPUFLAGS) \
$(DEV_AFLAGS) \ $(DEV_AFLAGS) \
$(GLOBAL_DEFINES) \ $(GLOBAL_DEFINES) \
$(OPTIM) \ $(OPTIM) \
$(DEBUG) \
$(ASM_INC) \ $(ASM_INC) \
$(INCLUDES) $(INCLUDES)
@@ -469,35 +466,12 @@ firmware-%: $(HEXFILE_DIR)/$(model)_%.hex $(HEXFILE_DIR)/$(model)_%.bin $(HEXFIL
%.bin : %.elf Makefile %.bin : %.elf Makefile
$(OBJCOPY) $< -O binary $@ $(OBJCOPY) $< -O binary $@
$(SIZE) $<
%.dfu : %.bin Makefile %.dfu : %.bin Makefile
python3 dfuse-pack.py -b $(DEVICE_DFU_ADDRESS)@0:$< -D $(DEVICE_DFU_VID_PID) $@ python3 dfuse-pack.py -b $(DEVICE_DFU_ADDRESS)@0:$< -D $(DEVICE_DFU_VID_PID) $@
$(HEXFILE_DIR)/$(model)_%.elf : \ $(HEXFILE_DIR)/$(model)_%.elf : \
$(OUT_OBJS_S) $(OUT_OBJS) $(OUT_OBJS_CPP) \
$(OUTPUT_DIR)/Core/Gen/Translation.%.o \
$(OUTPUT_DIR)/Core/LangSupport/lang_single.o \
Makefile $(LDSCRIPT)
@test -d $(@D) || mkdir -p $(@D)
@echo Linking $@
@$(CPP) $(CXXFLAGS) $(OUT_OBJS_S) $(OUT_OBJS) $(OUT_OBJS_CPP) \
$(OUTPUT_DIR)/Core/Gen/Translation.$*.o \
$(OUTPUT_DIR)/Core/LangSupport/lang_single.o \
$(LIBS) $(LINKER_FLAGS) -o$@ -Wl,-Map=$@.map
$(HEXFILE_DIR)/$(model)_string_compressed_%.elf : \
$(OUT_OBJS_S) $(OUT_OBJS) $(OUT_OBJS_CPP) \
$(OUTPUT_DIR)/Core/Gen/Translation_brieflz.%.o \
$(OUTPUT_DIR)/Core/LangSupport/lang_single.o \
Makefile $(LDSCRIPT)
@test -d $(@D) || mkdir -p $(@D)
@echo Linking $@
@$(CPP) $(CXXFLAGS) $(OUT_OBJS_S) $(OUT_OBJS) $(OUT_OBJS_CPP) \
$(OUTPUT_DIR)/Core/Gen/Translation_brieflz.$*.o \
$(OUTPUT_DIR)/Core/LangSupport/lang_single.o \
$(LIBS) $(LINKER_FLAGS) -o$@ -Wl,-Map=$@.map
$(HEXFILE_DIR)/$(model)_font_compressed_%.elf : \
$(OUT_OBJS_S) $(OUT_OBJS) $(OUT_OBJS_CPP) \ $(OUT_OBJS_S) $(OUT_OBJS) $(OUT_OBJS_CPP) \
$(OUTPUT_DIR)/Core/Gen/Translation_brieflz_font.%.o \ $(OUTPUT_DIR)/Core/Gen/Translation_brieflz_font.%.o \
$(OUTPUT_DIR)/Core/LangSupport/lang_single.o \ $(OUTPUT_DIR)/Core/LangSupport/lang_single.o \
@@ -509,6 +483,7 @@ $(HEXFILE_DIR)/$(model)_font_compressed_%.elf : \
$(OUTPUT_DIR)/Core/LangSupport/lang_single.o \ $(OUTPUT_DIR)/Core/LangSupport/lang_single.o \
$(LIBS) $(LINKER_FLAGS) -o$@ -Wl,-Map=$@.map $(LIBS) $(LINKER_FLAGS) -o$@ -Wl,-Map=$@.map
$(OUT_OBJS): $(OUTPUT_DIR)/%.o : %.c Makefile $(OUT_OBJS): $(OUTPUT_DIR)/%.o : %.c Makefile
@test -d $(@D) || mkdir -p $(@D) @test -d $(@D) || mkdir -p $(@D)
@echo Compiling ${<} @echo Compiling ${<}
@@ -544,12 +519,12 @@ Core/Gen/Translation.%.cpp $(OUTPUT_DIR)/Core/Gen/translation.files/%.pickle: ..
$(OUTPUT_DIR)/Core/Gen/translation.files/%.o: Core/Gen/Translation.%.cpp $(OUTPUT_DIR)/Core/Gen/translation.files/%.o: Core/Gen/Translation.%.cpp
@test -d $(@D) || mkdir -p $(@D) @test -d $(@D) || mkdir -p $(@D)
@echo Generating $@ @echo Generating $@
@$(CPP) -c $(filter-out -flto -g3,$(CXXFLAGS)) $< -o $@ @$(CPP) -c $(filter-out -flto ,$(CXXFLAGS)) $< -o $@
$(OUTPUT_DIR)/Core/Gen/translation.files/multi.%.o: Core/Gen/Translation_multi.%.cpp $(OUTPUT_DIR)/Core/Gen/translation.files/multi.%.o: Core/Gen/Translation_multi.%.cpp
@test -d $(@D) || mkdir -p $(@D) @test -d $(@D) || mkdir -p $(@D)
@echo Generating $@ @echo Generating $@
@$(CPP) -c $(filter-out -flto -g3,$(CXXFLAGS)) $< -o $@ @$(CPP) -c $(filter-out -flto ,$(CXXFLAGS)) $< -o $@
$(HOST_OUTPUT_DIR)/brieflz/libbrieflz.so: Core/brieflz/brieflz.c Core/brieflz/depack.c $(HOST_OUTPUT_DIR)/brieflz/libbrieflz.so: Core/brieflz/brieflz.c Core/brieflz/depack.c
@test -d $(@D) || mkdir -p $(@D) @test -d $(@D) || mkdir -p $(@D)