Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions Marlin/src/HAL/STM32F1/HAL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,8 @@ void MarlinHAL::adc_init() {
adc.setContinuous();
adc.startConversion();
}

#elif HAS_N32_CR10
#include "HAL_N32.h"
#endif // !VOXELAB_N32

void MarlinHAL::adc_start(const pin_t pin) {
Expand Down Expand Up @@ -199,7 +200,26 @@ void MarlinHAL::adc_start(const pin_t pin) {
_TCASE(POWER_MONITOR_CURRENT, POWER_MONITOR_CURRENT_PIN, POWERMON_CURRENT)
_TCASE(POWER_MONITOR_VOLTAGE, POWER_MONITOR_VOLTAGE_PIN, POWERMON_VOLTAGE)
}
adc_result = (adc_results[(int)pin_index] & 0xFFF) >> (12 - HAL_ADC_RESOLUTION); // shift out unused bits

#if DISABLED(HAS_N32_CR10)
adc_result = (adc_results[(int)pin_index] & 0xFFF) >> (12 - HAL_ADC_RESOLUTION); // shift out unused bits
#else
ADC_Initial(USE_ADC);

switch (pin_index) {
case TEMP_0:
adc_result = ADC_GetData(USE_ADC, ADC2_Channel_02_PA5);
adc_result = ADC_GetData(USE_ADC, ADC2_Channel_02_PA5);
break;
case TEMP_BED:
adc_result = ADC_GetData(USE_ADC, ADC2_Channel_01_PA4);
adc_result = ADC_GetData(USE_ADC, ADC2_Channel_01_PA4);
break;
default:
break;
}
adc_result = (adc_result >> 2) & 0x3FF;
#endif
}

// ------------------------
Expand Down
3 changes: 3 additions & 0 deletions Marlin/src/HAL/STM32F1/HAL.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@ typedef int8_t pin_t;
// ADC
// ------------------------

#if HAS_N32_CR10
#define ADC_RESOLUTION 10
#endif
#ifdef ADC_RESOLUTION
#define HAL_ADC_RESOLUTION ADC_RESOLUTION
#else
Expand Down
41 changes: 28 additions & 13 deletions Marlin/src/HAL/STM32F1/HAL_N32.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,27 +87,31 @@ void ADC_DeInit(ADC_Module* NS_ADCx) {
reg_temp = ADC_RCC_AHBPRST;
reg_temp |= RCC_AHB_PERIPH_ADC1;
ADC_RCC_AHBPRST = reg_temp; // ADC module reunion position
TERN_(HAS_N32_CR10, for(volatile int i=0; i<10; i++) {})
ADC_RCC_AHBPRST = 0x00000000; // ADC module reset and clear
}
else if (NS_ADCx == NS_ADC2) {
/* Enable ADC2 reset state */
reg_temp = ADC_RCC_AHBPRST;
reg_temp |= RCC_AHB_PERIPH_ADC2;
ADC_RCC_AHBPRST = reg_temp; // ADC module reunion position
TERN_(HAS_N32_CR10, for(volatile int i=0; i<10; i++) {})
ADC_RCC_AHBPRST = 0x00000000; // ADC module reset and clear
}
else if (NS_ADCx == NS_ADC3) {
/* Enable ADC2 reset state */
reg_temp = ADC_RCC_AHBPRST;
reg_temp |= RCC_AHB_PERIPH_ADC3;
ADC_RCC_AHBPRST = reg_temp; // ADC module reunion position
TERN_(HAS_N32_CR10, for(volatile int i=0; i<10; i++) {})
ADC_RCC_AHBPRST = 0x00000000; // ADC module reset and clear
}
else if (NS_ADCx == NS_ADC4) {
/* Enable ADC3 reset state */
reg_temp = ADC_RCC_AHBPRST;
reg_temp |= RCC_AHB_PERIPH_ADC4;
ADC_RCC_AHBPRST = reg_temp; // ADC module reunion position
TERN_(HAS_N32_CR10, for(volatile int i=0; i<10; i++) {})
ADC_RCC_AHBPRST = 0x00000000; // ADC module reset and clear
}
}
Expand Down Expand Up @@ -399,21 +403,25 @@ void enable_adc_clk(uint8_t cmd) {
void ADC_Initial(ADC_Module* NS_ADCx) {
ADC_InitType ADC_InitStructure;

TERN_(HAS_N32_CR10, ADC_DeInit(NS_ADCx));

/* ADC configuration ------------------------------------------------------*/
ADC_InitStructure.WorkMode = ADC_WORKMODE_INDEPENDENT; // Independent mode
ADC_InitStructure.MultiChEn = 1; // Multi-channel enable
ADC_InitStructure.ContinueConvEn = 1; // Continuous enable
ADC_InitStructure.MultiChEn = TERN(HAS_N32_CR10, 0, 1); // Multi-channel enable
ADC_InitStructure.ContinueConvEn = TERN(HAS_N32_CR10, 0, 1); // Continuous enable
ADC_InitStructure.ExtTrigSelect = ADC_EXT_TRIGCONV_NONE; // Non-trigger
ADC_InitStructure.DatAlign = ADC_DAT_ALIGN_R; // Right alignment
ADC_InitStructure.ChsNumber = 2; // Scan channel number
ADC_InitStructure.ChsNumber = TERN(HAS_N32_CR10, 1, 2); // Scan channel number
ADC_Init(NS_ADCx, &ADC_InitStructure);

/* ADC regular channel14 configuration */
ADC_ConfigRegularChannel(NS_ADCx, ADC2_Channel_05_PC4, 2, ADC_SAMP_TIME_55CYCLES5);
ADC_ConfigRegularChannel(NS_ADCx, ADC2_Channel_12_PC5, 1, ADC_SAMP_TIME_55CYCLES5);
#if !HAS_N32_CR10
/* ADC regular channel14 configuration */
ADC_ConfigRegularChannel(NS_ADCx, ADC2_Channel_05_PC4, 2, ADC_SAMP_TIME_55CYCLES5);
ADC_ConfigRegularChannel(NS_ADCx, ADC2_Channel_12_PC5, 1, ADC_SAMP_TIME_55CYCLES5);

/** 使能ADC DMA */
ADC_EnableDMA(NS_ADCx, 1);
/** 使能ADC DMA */
ADC_EnableDMA(NS_ADCx, 1);
#endif

/* Enable ADC */
ADC_Enable(NS_ADCx, 1);
Expand All @@ -424,21 +432,28 @@ void ADC_Initial(ADC_Module* NS_ADCx) {
while (ADC_GetCalibrationStatus(NS_ADCx));

/* Start ADC Software Conversion */
ADC_EnableSoftwareStartConv(NS_ADCx, 1);
IF_DISABLED(HAS_N32_CR10, ADC_EnableSoftwareStartConv(NS_ADCx, 1));
}

/**================================================================
* Single independent sampling
================================================================*/
uint16_t ADC_GetData(ADC_Module* NS_ADCx, uint8_t ADC_Channel) {
uint16_t dat;
TERN_(HAS_N32_CR10, uint8_t timeOut);

/** Set channel parameters */
ADC_ConfigRegularChannel(NS_ADCx, ADC_Channel, 1, ADC_SAMP_TIME_239CYCLES5);
ADC_ConfigRegularChannel(NS_ADCx, ADC_Channel, 1, TERN(HAS_N32_CR10, ADC_SAMP_TIME_71CYCLES5, ADC_SAMP_TIME_239CYCLES5));

#if HAS_N32_CR10
ADC_ClearFlag(NS_ADCx, ADC_FLAG_ENDC);
ADC_ClearFlag(NS_ADCx, ADC_FLAG_STR);
#endif

/* Start ADC Software Conversion */
TERN_(HAS_N32_CR10, timeOut = 0xFF);
ADC_EnableSoftwareStartConv(NS_ADCx, 1);
while(ADC_GetFlagStatus(NS_ADCx, ADC_FLAG_ENDC) == 0);
while((ADC_GetFlagStatus(NS_ADCx, ADC_FLAG_ENDC) == 0) TERN_(HAS_N32_CR10, && (timeOut--)));

ADC_ClearFlag(NS_ADCx, ADC_FLAG_ENDC);
ADC_ClearFlag(NS_ADCx, ADC_FLAG_STR);
Expand Down Expand Up @@ -630,8 +645,8 @@ void MarlinHAL::adc_init() {
//NS_GPIOC_PL_CFG = reg_temp; // PC4/5 analog input

enable_adc_clk(1); // Make ADC clock
ADC_DMA_init(); // DMA initialization
ADC_Initial(NS_ADC2); // ADC initialization
IF_DISABLED(HAS_N32_CR10, ADC_DMA_init()); // DMA initialization
ADC_Initial(USE_ADC); // ADC initialization

delay(2);
//NS_PINRT("get adc1 = ", adc_results[0], "\r\n");
Expand Down
4 changes: 4 additions & 0 deletions Marlin/src/HAL/STM32F1/fastio.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@

#define READ(IO) (PIN_MAP[IO].gpio_device->regs->IDR & _BV32(PIN_MAP[IO].gpio_bit) ? HIGH : LOW)
#define WRITE(IO,V) (PIN_MAP[IO].gpio_device->regs->BSRR = _BV32(PIN_MAP[IO].gpio_bit) << ((V) ? 0 : 16))
#define U8G_WRITE(IO,V) ((V)?WRITE(IO,0):WRITE(IO,1))
#define TOGGLE(IO) TBI32(PIN_MAP[IO].gpio_device->regs->ODR, PIN_MAP[IO].gpio_bit)

#define _GET_MODE(IO) gpio_get_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit)
Expand All @@ -38,13 +39,16 @@
#define _SET_OUTPUT_OD(IO) _SET_MODE(IO, GPIO_OUTPUT_OD)

#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0)
#define U8G_OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); U8G_WRITE(IO,V); }while(0)
#define OUT_WRITE_OD(IO,V) do{ _SET_OUTPUT_OD(IO); WRITE(IO,V); }while(0)
#define U8G_OUT_WRITE_OD(IO,V) do{ _SET_OUTPUT_OD(IO); U8G_WRITE(IO,V); }while(0)

#define SET_INPUT(IO) _SET_MODE(IO, GPIO_INPUT_FLOATING)
#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, GPIO_INPUT_PU)
#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, GPIO_INPUT_PD)
#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW)
#define SET_OUTPUT_OD(IO) OUT_WRITE_OD(IO, LOW)
#define U8G_SET_OUTPUT(IO) U8G_OUT_WRITE(IO, LOW)
#define SET_PWM(IO) pinMode(IO, PWM) // do{ gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, GPIO_AF_OUTPUT_PP); timer_set_mode(PIN_MAP[pin].timer_device, PIN_MAP[pin].timer_channel, TIMER_PWM); }while(0)
#define SET_PWM_OD(IO) pinMode(IO, PWM_OPEN_DRAIN)

Expand Down
14 changes: 11 additions & 3 deletions Marlin/src/inc/Conditionals-2-LCD.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,9 +284,17 @@

#define IS_RRD_FG_SC 1
#define NO_LCD_SDCARD
#define LCD_ST7920_DELAY_1 125
#define LCD_ST7920_DELAY_2 125
#define LCD_ST7920_DELAY_3 125

#ifdef VOXELAB_N32
#define LCD_ST7920_DELAY_1 0
#define LCD_ST7920_DELAY_2 80
#define LCD_ST7920_DELAY_3 450
#define HAS_N32_CR10 1
#else
#define LCD_ST7920_DELAY_1 125
#define LCD_ST7920_DELAY_2 125
#define LCD_ST7920_DELAY_3 125
#endif

#elif ANY(ANET_FULL_GRAPHICS_LCD, CTC_A10S_A13)

Expand Down
30 changes: 22 additions & 8 deletions Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,19 @@
#define ST7920_DAT(V) ((V) & 0x80)
#endif

#define ST7920_SND_BIT(...) do{ \
WRITE(ST7920_CLK_PIN, LOW); ST7920_DELAY_1; \
WRITE(ST7920_DAT_PIN, ST7920_DAT(val)); ST7920_DELAY_2; \
WRITE(ST7920_CLK_PIN, HIGH); ST7920_DELAY_3; \
val <<= 1; }while(0);
#if HAS_N32_CR10
#define ST7920_SND_BIT(...) do{ \
U8G_WRITE(ST7920_CLK_PIN, LOW); ST7920_DELAY_1; \
U8G_WRITE(ST7920_DAT_PIN, ST7920_DAT(val)); ST7920_DELAY_2; \
U8G_WRITE(ST7920_CLK_PIN, HIGH); ST7920_DELAY_3; \
val <<= 1; }while(0);
#else
#define ST7920_SND_BIT(...) do{ \
WRITE(ST7920_CLK_PIN, LOW); ST7920_DELAY_1; \
WRITE(ST7920_DAT_PIN, ST7920_DAT(val)); ST7920_DELAY_2; \
WRITE(ST7920_CLK_PIN, HIGH); ST7920_DELAY_3; \
val <<= 1; }while(0);
#endif

// Optimize this code with -O3
#pragma GCC optimize (3)
Expand All @@ -108,9 +116,15 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo
uint8_t i, y;
switch (msg) {
case U8G_DEV_MSG_INIT: {
OUT_WRITE(ST7920_CS_PIN, LOW);
OUT_WRITE(ST7920_DAT_PIN, LOW);
OUT_WRITE(ST7920_CLK_PIN, HIGH);
#if HAS_N32_CR10
U8G_OUT_WRITE(ST7920_CS_PIN, LOW);
U8G_OUT_WRITE(ST7920_DAT_PIN, LOW);
U8G_OUT_WRITE(ST7920_CLK_PIN, HIGH);
#else
OUT_WRITE(ST7920_CS_PIN, LOW);
OUT_WRITE(ST7920_DAT_PIN, LOW);
OUT_WRITE(ST7920_CLK_PIN, HIGH);
#endif

ST7920_CS();
u8g_Delay(120); // Initial delay for boot up
Expand Down
9 changes: 7 additions & 2 deletions Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,13 @@ void ST7920_SWSPI_SND_8BIT(uint8_t val);
#define U8G_DELAY() DELAY_US(10)
#endif

#define ST7920_CS() { WRITE(ST7920_CS_PIN, HIGH); U8G_DELAY(); }
#define ST7920_NCS() { WRITE(ST7920_CS_PIN, LOW); }
#if HAS_N32_CR10
#define ST7920_CS() { U8G_WRITE(ST7920_CS_PIN, HIGH); U8G_DELAY(); }
#define ST7920_NCS() { U8G_WRITE(ST7920_CS_PIN, LOW); }
#else
#define ST7920_CS() { WRITE(ST7920_CS_PIN, HIGH); U8G_DELAY(); }
#define ST7920_NCS() { WRITE(ST7920_CS_PIN, LOW); }
#endif
#define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); U8G_DELAY(); }
#define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); U8G_DELAY(); }
#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4U)); U8G_DELAY(); }
Expand Down
74 changes: 57 additions & 17 deletions Marlin/src/pins/stm32f1/pins_CREALITY_V4.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,26 @@
//
// Limit Switches
//
#ifndef X_STOP_PIN
#define X_STOP_PIN PA5
#endif
#ifndef Y_STOP_PIN
#define Y_STOP_PIN PA6
#endif
#ifndef Z_STOP_PIN
#define Z_STOP_PIN PA7
#if HAS_N32_CR10
#ifndef X_STOP_PIN
#define X_STOP_PIN PA6
#endif
#ifndef Y_STOP_PIN
#define Y_STOP_PIN PA7
#endif
#ifndef Z_STOP_PIN
#define Z_STOP_PIN PC4
#endif
#else
#ifndef X_STOP_PIN
#define X_STOP_PIN PA5
#endif
#ifndef Y_STOP_PIN
#define Y_STOP_PIN PA6
#endif
#ifndef Z_STOP_PIN
#define Z_STOP_PIN PA7
#endif
#endif

#ifndef Z_MIN_PROBE_PIN
Expand All @@ -106,7 +118,7 @@
//
// Filament Runout Sensor
//
#ifndef FIL_RUNOUT_PIN
#if !defined(FIL_RUNOUT_PIN) && !HAS_N32_CR10
#define FIL_RUNOUT_PIN PA4 // "Pulled-high"
#endif

Expand Down Expand Up @@ -148,20 +160,34 @@
//
// Temperature Sensors
//
#define TEMP_0_PIN PC5 // TH1
#define TEMP_BED_PIN PC4 // TB1
#if HAS_N32_CR10
#define TEMP_0_PIN PA5 // TH1
#define TEMP_BED_PIN PA4 // TB1
#else
#define TEMP_0_PIN PC5 // TH1
#define TEMP_BED_PIN PC4 // TB1
#endif

//
// Heaters / Fans
//
#ifndef HEATER_0_PIN
#define HEATER_0_PIN PA1 // HEATER1
#endif
#ifndef HEATER_BED_PIN
#define HEATER_BED_PIN PA2 // HOT BED
#endif
#ifndef FAN0_PIN
#define FAN0_PIN PA0 // FAN
#if HAS_N32_CR10
#ifndef HEATER_BED_PIN
#define HEATER_BED_PIN PA0 // HOT BED
#endif
#ifndef FAN0_PIN
#define FAN0_PIN PA2 // FAN
#endif
#else
#ifndef HEATER_BED_PIN
#define HEATER_BED_PIN PA2 // HOT BED
#endif
#ifndef FAN0_PIN
#define FAN0_PIN PA0 // FAN
#endif
#endif
#define FAN_SOFT_PWM_REQUIRED

Expand Down Expand Up @@ -247,7 +273,21 @@
#error "Define RET6_12864_LCD or VET6_12864_LCD to select pins for the LCD with the Creality V4 controller."
#endif

#if ENABLED(CR10_STOCKDISPLAY)
#if HAS_N32_CR10

#define LCD_PINS_RS PB12 // EXP3_07_PIN
#define LCD_PINS_EN PB15 // EXP3_08_PIN
#define LCD_PINS_D4 PB13 // EXP3_06_PIN

#define BTN_ENC PB1 // EXP3_02_PIN Z_MIN_PROBE_PIN
#define BTN_EN1 PC6 // EXP3_03_PIN EXP3_01_PIN
#define BTN_EN2 PB14 // EXP3_05_PIN

#ifndef HAS_PIN_27_BOARD
#define BEEPER_PIN PB0 // EXP3_01_PIN SERVO0_PIN
#endif

#elif ENABLED(CR10_STOCKDISPLAY)

#define LCD_PINS_RS EXP3_07_PIN
#define LCD_PINS_EN EXP3_08_PIN
Expand Down
Loading