STM32F4xx modifications for HAL_STM32 (#12080)

This commit is contained in:
Karl Andersson 2018-10-16 13:42:41 +02:00 committed by Scott Lahteine
parent bf0c809ff2
commit 8b5e51c9aa
15 changed files with 97 additions and 47 deletions

View file

@ -67,7 +67,7 @@ uint8_t HAL_get_reset_source(void) {
void watchdog_reset() { void watchdog_reset() {
WDT_Feed(); WDT_Feed();
#if PIN_EXISTS(LED) #if !defined(PINS_DEBUGGING) && PIN_EXISTS(LED)
TOGGLE(LED_PIN); // heart beat indicator TOGGLE(LED_PIN); // heart beat indicator
#endif #endif
} }

View file

@ -79,7 +79,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
TimerHandle[timer_num].timer = STEP_TIMER_DEV; TimerHandle[timer_num].timer = STEP_TIMER_DEV;
TimerHandle[timer_num].irqHandle = Step_Handler; TimerHandle[timer_num].irqHandle = Step_Handler;
TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / step_prescaler) / frequency) - 1, step_prescaler); TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / step_prescaler) / frequency) - 1, step_prescaler);
HAL_NVIC_SetPriority(STEP_TIMER_IRQ_NAME, 6, 0); HAL_NVIC_SetPriority(STEP_TIMER_IRQ_NAME, STEP_TIMER_IRQ_PRIO, 0);
break; break;
case TEMP_TIMER_NUM: case TEMP_TIMER_NUM:
@ -87,7 +87,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
TimerHandle[timer_num].timer = TEMP_TIMER_DEV; TimerHandle[timer_num].timer = TEMP_TIMER_DEV;
TimerHandle[timer_num].irqHandle = Temp_Handler; TimerHandle[timer_num].irqHandle = Temp_Handler;
TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / temp_prescaler) / frequency) - 1, temp_prescaler); TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / temp_prescaler) / frequency) - 1, temp_prescaler);
HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_NAME, 2, 0); HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_NAME, TEMP_TIMER_IRQ_PRIO, 0);
break; break;
} }
timers_initialised[timer_num] = true; timers_initialised[timer_num] = true;

View file

@ -34,40 +34,64 @@
#define FORCE_INLINE __attribute__((always_inline)) inline #define FORCE_INLINE __attribute__((always_inline)) inline
#define hal_timer_t uint32_t #define hal_timer_t uint32_t
#define HAL_TIMER_TYPE_MAX 0xFFFF #define HAL_TIMER_TYPE_MAX 0xFFFFFFFF // Timers can be 16 or 32 bit
#ifdef STM32F0xx #ifdef STM32F0xx
#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq()) // frequency of timer peripherals #define HAL_TIMER_RATE (F_CPU) // frequency of timer peripherals
#ifndef STEP_TIMER
#define STEP_TIMER 16 #define STEP_TIMER 16
#endif
#ifndef TEMP_TIMER
#define TEMP_TIMER 17 #define TEMP_TIMER 17
#endif
#elif defined STM32F1xx #elif defined STM32F1xx
#define HAL_TIMER_RATE (HAL_RCC_GetPCLK2Freq()) // frequency of timer peripherals #define HAL_TIMER_RATE (F_CPU) // frequency of timer peripherals
#ifndef STEP_TIMER
#define STEP_TIMER 4 #define STEP_TIMER 4
#endif
#ifndef TEMP_TIMER
#define TEMP_TIMER 2 #define TEMP_TIMER 2
#endif
#elif defined STM32F4xx #elif defined STM32F4xx
#define HAL_TIMER_RATE (HAL_RCC_GetPCLK2Freq()) // frequency of timer peripherals #define HAL_TIMER_RATE (F_CPU/2) // frequency of timer peripherals
#define STEP_TIMER 4 #ifndef STEP_TIMER
#define TEMP_TIMER 5 #define STEP_TIMER 5
#endif
#ifndef TEMP_TIMER
#define TEMP_TIMER 7
#endif
#elif defined STM32F7xx #elif defined STM32F7xx
#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq()/2) // frequency of timer peripherals #define HAL_TIMER_RATE (F_CPU/2) // frequency of timer peripherals
#ifndef STEP_TIMER
#define STEP_TIMER 5 #define STEP_TIMER 5
#define TEMP_TIMER 7
#if MB(REMRAM_V1)
#define STEP_TIMER 2
#endif #endif
#ifndef TEMP_TIMER
#define TEMP_TIMER 7
#endif
#endif
#ifndef STEP_TIMER_IRQ_PRIO
#define STEP_TIMER_IRQ_PRIO 1
#endif
#ifndef TEMP_TIMER_IRQ_PRIO
#define TEMP_TIMER_IRQ_PRIO 2
#endif #endif
#define STEP_TIMER_NUM 0 // index of timer to use for stepper #define STEP_TIMER_NUM 0 // index of timer to use for stepper
@ -110,9 +134,6 @@
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
#define TEMP_ISR_ENABLED() HAL_timer_interrupt_enabled(TEMP_TIMER_NUM)
extern void Step_Handler(stimer_t *htim); extern void Step_Handler(stimer_t *htim);
extern void Temp_Handler(stimer_t *htim); extern void Temp_Handler(stimer_t *htim);
#define HAL_STEP_TIMER_ISR void Step_Handler(stimer_t *htim) #define HAL_STEP_TIMER_ISR void Step_Handler(stimer_t *htim)
@ -153,11 +174,5 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
return __HAL_TIM_GET_AUTORELOAD(&TimerHandle[timer_num].handle); return __HAL_TIM_GET_AUTORELOAD(&TimerHandle[timer_num].handle);
} }
FORCE_INLINE static void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks) {
const hal_timer_t mincmp = HAL_timer_get_count(timer_num) + interval_ticks;
if (HAL_timer_get_compare(timer_num) < mincmp)
HAL_timer_set_compare(timer_num, mincmp);
}
#define HAL_timer_isr_prologue(TIMER_NUM) #define HAL_timer_isr_prologue(TIMER_NUM)
#define HAL_timer_isr_epilogue(TIMER_NUM) #define HAL_timer_isr_epilogue(TIMER_NUM)

View file

@ -52,6 +52,12 @@ void setup_endstop_interrupts(void) {
#if HAS_Z2_MIN #if HAS_Z2_MIN
attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE);
#endif #endif
#if HAS_Z3_MAX
attachInterrupt(Z3_MAX_PIN, endstop_ISR, CHANGE);
#endif
#if HAS_Z3_MIN
attachInterrupt(Z3_MIN_PIN, endstop_ISR, CHANGE);
#endif
#if HAS_Z_MIN_PROBE_PIN #if HAS_Z_MIN_PROBE_PIN
attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE);
#endif #endif

View file

@ -28,20 +28,20 @@
#include "../shared/persistent_store_api.h" #include "../shared/persistent_store_api.h"
#if DISABLED(EEPROM_EMULATED_WITH_SRAM) #if DISABLED(EEPROM_EMULATED_WITH_SRAM) && DISABLED(SPI_EEPROM) && DISABLED(I2C_EEPROM)
#include <EEPROM.h> #include <EEPROM.h>
static bool eeprom_data_written = false; static bool eeprom_data_written = false;
#endif #endif
bool PersistentStore::access_start() { bool PersistentStore::access_start() {
#if DISABLED(EEPROM_EMULATED_WITH_SRAM) #if DISABLED(EEPROM_EMULATED_WITH_SRAM) && DISABLED(SPI_EEPROM) && DISABLED(I2C_EEPROM)
eeprom_buffer_fill(); eeprom_buffer_fill();
#endif #endif
return true; return true;
} }
bool PersistentStore::access_finish() { bool PersistentStore::access_finish() {
#if DISABLED(EEPROM_EMULATED_WITH_SRAM) #if DISABLED(EEPROM_EMULATED_WITH_SRAM) && DISABLED(SPI_EEPROM) && DISABLED(I2C_EEPROM)
if (eeprom_data_written) { if (eeprom_data_written) {
eeprom_buffer_flush(); eeprom_buffer_flush();
eeprom_data_written = false; eeprom_data_written = false;
@ -54,8 +54,20 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
while (size--) { while (size--) {
uint8_t v = *value; uint8_t v = *value;
// Save to either program flash or Backup SRAM // Save to either external EEPROM, program flash or Backup SRAM
#if DISABLED(EEPROM_EMULATED_WITH_SRAM) #if ENABLED(SPI_EEPROM) || ENABLED(I2C_EEPROM)
// EEPROM has only ~100,000 write cycles,
// so only write bytes that have changed!
uint8_t * const p = (uint8_t * const)pos;
if (v != eeprom_read_byte(p)) {
eeprom_write_byte(p, v);
if (eeprom_read_byte(p) != v) {
SERIAL_ECHO_START();
SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE);
return true;
}
}
#elif DISABLED(EEPROM_EMULATED_WITH_SRAM)
eeprom_buffered_write_byte(pos, v); eeprom_buffered_write_byte(pos, v);
#else #else
*(__IO uint8_t *)(BKPSRAM_BASE + (uint8_t * const)pos) = v; *(__IO uint8_t *)(BKPSRAM_BASE + (uint8_t * const)pos) = v;
@ -65,7 +77,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
pos++; pos++;
value++; value++;
}; };
#if DISABLED(EEPROM_EMULATED_WITH_SRAM) #if DISABLED(EEPROM_EMULATED_WITH_SRAM) && DISABLED(SPI_EEPROM) && DISABLED(I2C_EEPROM)
eeprom_data_written = true; eeprom_data_written = true;
#endif #endif
@ -74,9 +86,11 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing) { bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing) {
do { do {
// Read from either program flash or Backup SRAM // Read from either external EEPROM, program flash or Backup SRAM
const uint8_t c = ( const uint8_t c = (
#if DISABLED(EEPROM_EMULATED_WITH_SRAM) #if ENABLED(SPI_EEPROM) || ENABLED(I2C_EEPROM)
eeprom_read_byte((uint8_t*)pos)
#elif DISABLED(EEPROM_EMULATED_WITH_SRAM)
eeprom_buffered_read_byte(pos) eeprom_buffered_read_byte(pos)
#else #else
(*(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos))) (*(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos)))
@ -92,7 +106,9 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
} }
size_t PersistentStore::capacity() { size_t PersistentStore::capacity() {
#if DISABLED(EEPROM_EMULATED_WITH_SRAM) #if ENABLED(SPI_EEPROM) || ENABLED(I2C_EEPROM)
return E2END + 1;
#elif DISABLED(EEPROM_EMULATED_WITH_SRAM)
return E2END + 1; return E2END + 1;
#else #else
return 4096; // 4kB return 4096; // 4kB

View file

@ -31,7 +31,14 @@
void watchdog_init() { IWatchdog.begin(4000000); } // 4 sec timeout void watchdog_init() { IWatchdog.begin(4000000); } // 4 sec timeout
void watchdog_reset() { IWatchdog.reload(); } void watchdog_reset()
{
IWatchdog.reload();
#if PIN_EXISTS(LED)
TOGGLE(LED_PIN); // heart beat indicator
#endif
}
#endif // USE_WATCHDOG #endif // USE_WATCHDOG
#endif // ARDUINO_ARCH_STM32 #endif // ARDUINO_ARCH_STM32

View file

@ -47,7 +47,7 @@
/** @addtogroup EEPROM_Emulation /** @addtogroup EEPROM_Emulation
* @{ * @{
*/ */
#if defined(STM32F4) || defined(STM32F4xx) #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "eeprom_emul.h" #include "eeprom_emul.h"

View file

@ -17,7 +17,7 @@
* *
*/ */
#if defined(STM32F4) || defined(STM32F4xx) #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
/** /**
* Description: functions for I2C connected external EEPROM. * Description: functions for I2C connected external EEPROM.

View file

@ -21,7 +21,7 @@
* *
*/ */
#if defined(STM32F4) || defined(STM32F4xx) #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Includes // Includes

View file

@ -21,7 +21,7 @@
* *
*/ */
#if defined(STM32F4) || defined(STM32F4xx) #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"

View file

@ -30,7 +30,7 @@
* Adapted to the STM32F4 HAL * Adapted to the STM32F4 HAL
*/ */
#if defined(STM32F4) || defined(STM32F4xx) #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Includes // Includes

View file

@ -20,7 +20,7 @@
* *
*/ */
#if defined(STM32F4) || defined(STM32F4xx) #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Includes // Includes
@ -91,7 +91,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
TimerHandle[timer_num].irqHandle = TC5_Handler; TimerHandle[timer_num].irqHandle = TC5_Handler;
TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / step_prescaler) / frequency) - 1, step_prescaler); TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / step_prescaler) / frequency) - 1, step_prescaler);
#endif #endif
HAL_NVIC_SetPriority(STEP_TIMER_IRQ_ID, 6, 0); HAL_NVIC_SetPriority(STEP_TIMER_IRQ_ID, 1, 0);
break; break;
case TEMP_TIMER_NUM: case TEMP_TIMER_NUM:

View file

@ -21,7 +21,7 @@
* *
*/ */
#if defined(STM32F4) || defined(STM32F4xx) #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
#include "../shared/persistent_store_api.h" #include "../shared/persistent_store_api.h"

View file

@ -20,7 +20,7 @@
* *
*/ */
#if defined(STM32F4) || defined(STM32F4xx) #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F4xx))
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"

View file

@ -124,3 +124,9 @@
#define BTN_EN1 54 // BTN_EN1 #define BTN_EN1 54 // BTN_EN1
#define BTN_EN2 55 // BTN_EN2 #define BTN_EN2 55 // BTN_EN2
#define BTN_ENC 47 // BTN_ENC #define BTN_ENC 47 // BTN_ENC
//
// Timers
//
#define STEP_TIMER 2