diff --git a/Copy to SD Card root directory to update/BIGTREE_TFT24_V1.1.21.bin b/Copy to SD Card root directory to update/BIGTREE_TFT24_V1.1.21.bin deleted file mode 100644 index 40312b30a0..0000000000 Binary files a/Copy to SD Card root directory to update/BIGTREE_TFT24_V1.1.21.bin and /dev/null differ diff --git a/Copy to SD Card root directory to update/BIGTREE_TFT24_V1.1.22.bin b/Copy to SD Card root directory to update/BIGTREE_TFT24_V1.1.22.bin new file mode 100644 index 0000000000..13dcd930de Binary files /dev/null and b/Copy to SD Card root directory to update/BIGTREE_TFT24_V1.1.22.bin differ diff --git a/Copy to SD Card root directory to update/BIQU_TFT28_V1.0.21.bin b/Copy to SD Card root directory to update/BIQU_TFT28_V1.0.21.bin deleted file mode 100644 index 2255f66786..0000000000 Binary files a/Copy to SD Card root directory to update/BIQU_TFT28_V1.0.21.bin and /dev/null differ diff --git a/Copy to SD Card root directory to update/BIQU_TFT28_V1.0.22.bin b/Copy to SD Card root directory to update/BIQU_TFT28_V1.0.22.bin new file mode 100644 index 0000000000..ba4c591e78 Binary files /dev/null and b/Copy to SD Card root directory to update/BIQU_TFT28_V1.0.22.bin differ diff --git a/Copy to SD Card root directory to update/BIQU_TFT35_APP1_V2.0.22.bin b/Copy to SD Card root directory to update/BIQU_TFT35_APP1_V2.0.22.bin new file mode 100644 index 0000000000..606e38c92d Binary files /dev/null and b/Copy to SD Card root directory to update/BIQU_TFT35_APP1_V2.0.22.bin differ diff --git a/Copy to SD Card root directory to update/BIQU_TFT35_V1.0.21.bin b/Copy to SD Card root directory to update/BIQU_TFT35_V1.0.21.bin deleted file mode 100644 index 5d2a0c026c..0000000000 Binary files a/Copy to SD Card root directory to update/BIQU_TFT35_V1.0.21.bin and /dev/null differ diff --git a/Copy to SD Card root directory to update/BIQU_TFT35_V1.0.22.bin b/Copy to SD Card root directory to update/BIQU_TFT35_V1.0.22.bin new file mode 100644 index 0000000000..7ffebd1822 Binary files /dev/null and b/Copy to SD Card root directory to update/BIQU_TFT35_V1.0.22.bin differ diff --git a/Copy to SD Card root directory to update/BIQU_TFT35_V1.1.21.bin b/Copy to SD Card root directory to update/BIQU_TFT35_V1.1.21.bin deleted file mode 100644 index 0786867854..0000000000 Binary files a/Copy to SD Card root directory to update/BIQU_TFT35_V1.1.21.bin and /dev/null differ diff --git a/Copy to SD Card root directory to update/BIQU_TFT35_V1.1.22.bin b/Copy to SD Card root directory to update/BIQU_TFT35_V1.1.22.bin new file mode 100644 index 0000000000..547613baa0 Binary files /dev/null and b/Copy to SD Card root directory to update/BIQU_TFT35_V1.1.22.bin differ diff --git a/Copy to SD Card root directory to update/BIQU_TFT35_V1.2.21.bin b/Copy to SD Card root directory to update/BIQU_TFT35_V1.2.21.bin deleted file mode 100644 index ded6e35561..0000000000 Binary files a/Copy to SD Card root directory to update/BIQU_TFT35_V1.2.21.bin and /dev/null differ diff --git a/Copy to SD Card root directory to update/BIQU_TFT35_V1.2.22.bin b/Copy to SD Card root directory to update/BIQU_TFT35_V1.2.22.bin new file mode 100644 index 0000000000..3f13281919 Binary files /dev/null and b/Copy to SD Card root directory to update/BIQU_TFT35_V1.2.22.bin differ diff --git a/TFT/src/Libraries/cmsis/core_cm3.c b/TFT/src/Libraries/cmsis/Core-CM3/core_cm3.c similarity index 100% rename from TFT/src/Libraries/cmsis/core_cm3.c rename to TFT/src/Libraries/cmsis/Core-CM3/core_cm3.c diff --git a/TFT/src/Libraries/cmsis/core_cm3.h b/TFT/src/Libraries/cmsis/Core-CM3/core_cm3.h similarity index 100% rename from TFT/src/Libraries/cmsis/core_cm3.h rename to TFT/src/Libraries/cmsis/Core-CM3/core_cm3.h diff --git a/TFT/src/Libraries/cmsis/stm32f10x.h b/TFT/src/Libraries/cmsis/stm32f10x/stm32f10x.h similarity index 100% rename from TFT/src/Libraries/cmsis/stm32f10x.h rename to TFT/src/Libraries/cmsis/stm32f10x/stm32f10x.h diff --git a/TFT/src/Libraries/cmsis/system_stm32f10x.c b/TFT/src/Libraries/cmsis/stm32f10x/system_stm32f10x.c similarity index 100% rename from TFT/src/Libraries/cmsis/system_stm32f10x.c rename to TFT/src/Libraries/cmsis/stm32f10x/system_stm32f10x.c diff --git a/TFT/src/Libraries/cmsis/system_stm32f10x.h b/TFT/src/Libraries/cmsis/stm32f10x/system_stm32f10x.h similarity index 100% rename from TFT/src/Libraries/cmsis/system_stm32f10x.h rename to TFT/src/Libraries/cmsis/stm32f10x/system_stm32f10x.h diff --git a/TFT/src/Libraries/fwlib/inc/misc.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/misc.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/misc.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/misc.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_adc.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_adc.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_adc.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_adc.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_bkp.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_bkp.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_bkp.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_bkp.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_can.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_can.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_can.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_can.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_cec.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_cec.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_cec.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_cec.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_crc.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_crc.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_crc.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_crc.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_dac.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_dac.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_dac.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_dac.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_dbgmcu.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_dbgmcu.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_dbgmcu.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_dbgmcu.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_dma.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_dma.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_dma.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_dma.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_exti.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_exti.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_exti.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_exti.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_flash.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_flash.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_flash.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_flash.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_fsmc.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_fsmc.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_fsmc.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_fsmc.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_gpio.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_gpio.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_gpio.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_gpio.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_i2c.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_i2c.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_i2c.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_i2c.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_iwdg.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_iwdg.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_iwdg.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_iwdg.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_pwr.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_pwr.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_pwr.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_pwr.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_rcc.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_rcc.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_rcc.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_rcc.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_rtc.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_rtc.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_rtc.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_rtc.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_sdio.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_sdio.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_sdio.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_sdio.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_spi.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_spi.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_spi.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_spi.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_tim.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_tim.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_tim.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_tim.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_usart.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_usart.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_usart.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_usart.h diff --git a/TFT/src/Libraries/fwlib/inc/stm32f10x_wwdg.h b/TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_wwdg.h similarity index 100% rename from TFT/src/Libraries/fwlib/inc/stm32f10x_wwdg.h rename to TFT/src/Libraries/fwlib/stm32f10x/inc/stm32f10x_wwdg.h diff --git a/TFT/src/Libraries/fwlib/src/misc.c b/TFT/src/Libraries/fwlib/stm32f10x/src/misc.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/misc.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/misc.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_adc.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_adc.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_adc.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_adc.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_bkp.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_bkp.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_bkp.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_bkp.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_can.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_can.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_can.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_can.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_cec.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_cec.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_cec.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_cec.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_crc.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_crc.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_crc.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_crc.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_dac.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_dac.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_dac.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_dac.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_dbgmcu.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_dbgmcu.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_dbgmcu.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_dbgmcu.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_dma.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_dma.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_dma.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_dma.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_exti.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_exti.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_exti.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_exti.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_flash.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_flash.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_flash.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_flash.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_fsmc.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_fsmc.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_fsmc.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_fsmc.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_gpio.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_gpio.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_gpio.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_gpio.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_i2c.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_i2c.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_i2c.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_i2c.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_iwdg.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_iwdg.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_iwdg.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_iwdg.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_pwr.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_pwr.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_pwr.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_pwr.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_rcc.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_rcc.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_rcc.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_rcc.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_rtc.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_rtc.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_rtc.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_rtc.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_sdio.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_sdio.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_sdio.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_sdio.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_spi.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_spi.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_spi.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_spi.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_tim.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_tim.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_tim.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_tim.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_usart.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_usart.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_usart.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_usart.c diff --git a/TFT/src/Libraries/fwlib/src/stm32f10x_wwdg.c b/TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_wwdg.c similarity index 100% rename from TFT/src/Libraries/fwlib/src/stm32f10x_wwdg.c rename to TFT/src/Libraries/fwlib/stm32f10x/src/stm32f10x_wwdg.c diff --git a/TFT/src/Libraries/fwlib/stm32f10x_conf.h b/TFT/src/Libraries/fwlib/stm32f10x/stm32f10x_conf.h similarity index 100% rename from TFT/src/Libraries/fwlib/stm32f10x_conf.h rename to TFT/src/Libraries/fwlib/stm32f10x/stm32f10x_conf.h diff --git a/TFT/src/User/API/LCD_Encoder.c b/TFT/src/User/API/LCD_Encoder.c index f6b117550e..20e2a68ec4 100644 --- a/TFT/src/User/API/LCD_Encoder.c +++ b/TFT/src/User/API/LCD_Encoder.c @@ -1,7 +1,8 @@ #include "LCD_Encoder.h" +#include "GPIO_Init.h" #include "includes.h" -#ifdef LCD_ENCODER_SUPPORT +#if LCD_ENCODER_SUPPORT int8_t encoderDirection = 1; volatile int8_t encoderDiff; // Updated in update_buttons, added to encoderPosition every LCD update @@ -10,35 +11,29 @@ uint8_t buttons = 0; void LCD_EncoderInit(void) { - GPIO_TypeDef *encPort[] = {LCD_ENCA_PORT, LCD_ENCB_PORT, LCD_BTN_PORT}; - uint16_t encPin[] = {LCD_ENCA_PIN, LCD_ENCB_PIN, LCD_BTN_PIN}; - GPIO_InitTypeDef GPIO_InitStructure; + uint16_t encPin[] = {LCD_ENCA_PIN, LCD_ENCB_PIN, LCD_BTN_PIN}; - RCC_APB2PeriphClockCmd(LCD_ENCODER_RCC, ENABLE); - - for(u8 i = 0; i < aCount(encPort); i++) + for(u8 i = 0; i < aCount(encPin); i++) { - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; - GPIO_InitStructure.GPIO_Pin = encPin[i]; - GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; - GPIO_Init(encPort[i], &GPIO_InitStructure); + GPIO_InitSet(encPin[i], MGPIO_MODE_IPU, 0); } } bool LCD_ReadEncA(void) { - return !GPIO_ReadInputDataBit(LCD_ENCA_PORT, LCD_ENCA_PIN); + return !GPIO_GetLevel(LCD_ENCA_PIN); } + bool LCD_ReadEncB(void) { - return !GPIO_ReadInputDataBit(LCD_ENCB_PORT, LCD_ENCB_PIN); + return !GPIO_GetLevel(LCD_ENCB_PIN); } bool LCD_ReadBtn(uint8_t intervals) { static u32 nowTime = 0; - if(!GPIO_ReadInputDataBit(LCD_BTN_PORT, LCD_BTN_PIN)) + if(!GPIO_GetLevel(LCD_BTN_PIN)) { if(OS_GetTime() - nowTime > intervals) { @@ -92,7 +87,8 @@ void LCD_LoopEncoder(void) } void loopCheckMode(void) -{ +{ + if(isPrinting()) return; if(LCD_ReadBtn(LCD_CHANGE_MODE_INTERVALS)) { infoMenu.menu[++infoMenu.cur] = menuMode; diff --git a/TFT/src/User/API/Language/Language.h b/TFT/src/User/API/Language/Language.h index f72ab7b17c..141272f266 100644 --- a/TFT/src/User/API/Language/Language.h +++ b/TFT/src/User/API/Language/Language.h @@ -2,7 +2,7 @@ #define _LANGUAGE_H_ #include "stdbool.h" -#include "stm32f10x.h" +#include "variants.h" enum diff --git a/TFT/src/User/API/Language/language_jp.h b/TFT/src/User/API/Language/language_jp.h index 67a9b4e478..caf1b7f1c8 100644 --- a/TFT/src/User/API/Language/language_jp.h +++ b/TFT/src/User/API/Language/language_jp.h @@ -27,17 +27,17 @@ #define JP_FAST_SPEED "早め" #define JP_FAN_FULL_SPEED "全速" #define JP_FAN_HALF_SPEED "50%速さ" - #define JP_POWER_OFF "Power Off" + #define JP_POWER_OFF "電源OFF" #define JP_TOUCHSCREEN_ADJUST "校正する" #define JP_SCREEN_INFO "ついて" #define JP_DISCONNECT "データ接続" #define JP_BAUDRATE_115200 "115200" #define JP_BAUDRATE_250000 "250000" - #define JP_PERCENTAGE "Percentage" - #define JP_BABYSTEP "BabyStep" - #define JP_PERCENTAGE_SPEED "スビード%" - #define JP_PERCENTAGE_FLOW "押出%" - #define JP_VALUE_ZERO "Zero" + #define JP_PERCENTAGE "パーセント" + #define JP_BABYSTEP "ベビーステップ" + #define JP_PERCENTAGE_SPEED "スビード" + #define JP_PERCENTAGE_FLOW "押出" + #define JP_VALUE_ZERO "ゼロ" #define JP_1_DEGREE "1℃" #define JP_5_DEGREE "5℃" #define JP_10_DEGREE "10℃" @@ -65,28 +65,28 @@ #define JP_UNCONNECTED "プリンターに連続していない!" #define JP_DISCONNECT_INFO "SDカード PC両用" #define JP_LOADING "ロッド中..." - #define JP_POWER_FAILED "Continue printing?" + #define JP_POWER_FAILED "プリントを継続しますか?" #define JP_CONTINUE "継続" #define JP_CANNEL "キャンセル" #define JP_ADJUST_TITLE "タッチスクリーン較正" #define JP_ADJUST_INFO "赤星をタッチ" #define JP_ADJUST_OK "校正が成功しました" #define JP_ADJUST_FAILED "校正が失敗しました、も一度お試して下さい" - #define JP_WARNING "Warning" + #define JP_WARNING "注意" #define JP_STOP_PRINT "プリントを中止しますか?" - #define JP_CONFIRM "確定" + #define JP_CONFIRM "OK" #define JP_TFTSD "TFT SD" #define JP_READ_TFTSD_ERROR "TFT SDカードの読み取りがエラー発生しました!" #define JP_TFTSD_INSERTED "SDカード入りました!" #define JP_TFTSD_REMOVED "SDカード出しました!" - #define JP_U_DISK "U Disk" - #define JP_READ_U_DISK_ERROR "Read U Disk error!" + #define JP_U_DISK "USBメモリー" + #define JP_READ_U_DISK_ERROR "USBメモリー読み込みエラー!" #define JP_U_DISK_INSERTED "U Diskカード入りました!" #define JP_U_DISK_REMOVED "U Diskカード出しました!" - #define JP_ONBOARDSD "OnboardSD" - #define JP_READ_ONBOARDSD_ERROR "Onboard SDカードの読み取りがエラー発生しました!" + #define JP_ONBOARDSD "内部 mSDカード" + #define JP_READ_ONBOARDSD_ERROR "内部 mSDカードの読み取りがエラー発生しました!" #endif diff --git a/TFT/src/User/API/UI/ST7920_Simulator.c b/TFT/src/User/API/UI/ST7920_Simulator.c index 1bdd7e38b9..1bd5646954 100644 --- a/TFT/src/User/API/UI/ST7920_Simulator.c +++ b/TFT/src/User/API/UI/ST7920_Simulator.c @@ -2,6 +2,7 @@ #include "includes.h" #include "GUI.h" +#ifdef ST7920_SPI ST7920_PIXEL st7920 = {ST7920_XSTART, ST7920_YSTART, 0}; ST7920_CTRL_STATUS status = ST7920_IDLE; @@ -132,16 +133,17 @@ void menuST7920(void) while(infoMenu.menu[infoMenu.cur] == menuST7920) { - if(SPISlave.rIndex != SPISlave.wIndex) + while(SPISlave.rIndex != SPISlave.wIndex) { ST7920_ParseRecv(SPISlave.data[SPISlave.rIndex]); SPISlave.rIndex = (SPISlave.rIndex + 1) % SPI_SLAVE_MAX; } - #ifdef LCD_ENCODER_SUPPORT + #if LCD_ENCODER_SUPPORT loopCheckMode(); #endif } SPI_SlaveDeInit(); } +#endif diff --git a/TFT/src/User/API/UI/touch_process.c b/TFT/src/User/API/UI/touch_process.c index ac18a97679..4519818da1 100644 --- a/TFT/src/User/API/UI/touch_process.c +++ b/TFT/src/User/API/UI/touch_process.c @@ -1,4 +1,5 @@ #include "touch_process.h" +#include "GPIO_Init.h" #include "includes.h" #define XL1 LCD_X[0] @@ -140,7 +141,7 @@ u16 Key_value(u8 total_rect,const GUI_RECT* menuRect) { if((x>menuRect[i].x0)&&(xmenuRect[i].y0)&&(yAPB1ENR|=1<<1; //TIM3时钟使能 - TIM3->ARR=arr; //设定自动重装值 - TIM3->PSC=psc; //预分频器 - TIM3->SR = (uint16_t)~(1<<0); //清除更新中断 - TIM3->DIER|=1<<0; //允许更新中断 + RCC->APB1ENR|=1<<1; //TIM3时锟斤拷使锟斤拷 + TIM3->ARR=arr; //锟借定锟皆讹拷锟斤拷装值 + TIM3->PSC=psc; //预锟斤拷频锟斤拷 + TIM3->SR = (uint16_t)~(1<<0); //锟斤拷锟斤拷锟斤拷锟斤拷卸锟 + TIM3->DIER|=1<<0; //锟斤拷锟斤拷锟斤拷锟斤拷锟叫讹拷 TIM3->CNT =0; - TIM3->CR1 &= ~(0x01); //失能定时器3 + TIM3->CR1 &= ~(0x01); //失锟杰讹拷时锟斤拷3 } void Buzzer_Config(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(BUZZER_RCC, ENABLE); - - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Pin = BUZZER_PIN; - GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; - GPIO_Init(BUZZER_PORT, &GPIO_InitStructure); +{ + GPIO_InitSet(BUZZER_PIN, MGPIO_MODE_OUT_PP, 0); - TIM3_Config(719,100); //1Khz + TIM3_Config(999, F_CPUM-1); //1Khz } void Buzzer_DeConfig(void) { - GPIO_InitTypeDef GPIO_InitStructure; - - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; - GPIO_InitStructure.GPIO_Pin = BUZZER_PIN; - GPIO_Init(BUZZER_PORT, &GPIO_InitStructure); + GPIO_InitSet(BUZZER_PIN, MGPIO_MODE_IPN, 0); } typedef struct{ @@ -446,7 +436,7 @@ void openBuzzer(u16 h_us, u16 l_us) else buzzer.num = 500; - TIM3->CR1 |= 0x01; //使能定时器3 + TIM3->CR1 |= 0x01; //使锟杰讹拷时锟斤拷3 } void closeBuzzer(void) { @@ -454,30 +444,29 @@ void closeBuzzer(void) TIM3->CR1 &= ~(0x01); } -void TIM3_IRQHandler(void) //TIM3中断 +void TIM3_IRQHandler(void) //TIM3锟叫讹拷 { static bool flag = false; - if ((TIM3->SR&0x01) != 0 ) //检查指定的TIM中断发生与否:TIM 中断源 + if ((TIM3->SR&0x01) != 0 ) //锟斤拷锟街革拷锟斤拷锟絋IM锟叫断凤拷锟斤拷锟斤拷锟:TIM 锟叫讹拷源 { - flag = !flag; + flag = !flag; if( flag ) { - GPIO_SetBits(BUZZER_PORT, BUZZER_PIN); TIM3->ARR = buzzer.h_us; } else { - GPIO_ResetBits(BUZZER_PORT, BUZZER_PIN); TIM3->ARR = buzzer.l_us; } - + + GPIO_SetLevel(BUZZER_PIN, flag); buzzer.num--; if( buzzer.num == 0 ) { TIM3->CR1 &= ~(0x01); } - TIM3->SR = (uint16_t)~(1<<0); //清除TIMx的中断待处理位:TIM 中断源 + TIM3->SR = (uint16_t)~(1<<0); //锟斤拷锟絋IMx锟斤拷锟叫断达拷锟斤拷锟斤拷位:TIM 锟叫讹拷源 } } #endif diff --git a/TFT/src/User/API/UI/ui_draw.c b/TFT/src/User/API/UI/ui_draw.c index 414f9ab31c..0d81cc2f24 100644 --- a/TFT/src/User/API/UI/ui_draw.c +++ b/TFT/src/User/API/UI/ui_draw.c @@ -1,101 +1,9 @@ #include "ui_draw.h" #include "includes.h" - - - #ifdef STM32_HAS_FSMC -//Config for SPI Channel -#if W25Qxx_SPI == _SPI1 - #define W25QXX_SPI_NUM SPI1 - #define W25QXX_SPI_DMA_RCC_AHB RCC_AHBPeriph_DMA1 - #define W25QXX_SPI_DMA DMA1 - #define W25QXX_SPI_DMA_CHANNEL DMA1_Channel2 - #define W25QXX_SPI_DMA_IFCR_BIT 5 -#elif W25Qxx_SPI == _SPI2 - #define W25QXX_SPI_NUM SPI2 - #define W25QXX_SPI_DMA DMA1 - #define W25QXX_SPI_DMA_RCC_AHB RCC_AHBPeriph_DMA1 - #define W25QXX_SPI_DMA_CHANNEL DMA1_Channel4 - #define W25QXX_SPI_DMA_IFCR_BIT 13 -#elif W25Qxx_SPI == _SPI3 - #define W25QXX_SPI_NUM SPI3 - #define W25QXX_SPI_DMA DMA2 - #define W25QXX_SPI_DMA_RCC_AHB RCC_AHBPeriph_DMA2 - #define W25QXX_SPI_DMA_CHANNEL DMA2_Channel1 - #define W25QXX_SPI_DMA_IFCR_BIT 1 -#endif - -//SPI --> FSMC DMA (LCD_RAM) -//16bits, SPI_RX to LCD_RAM. -void LCD_DMA_Config(void) -{ - - RCC->AHBENR |= W25QXX_SPI_DMA_RCC_AHB; //开启DMA时钟 - Delay_ms(5); //等待DMA时钟稳定 - W25QXX_SPI_DMA_CHANNEL->CPAR = (u32)&W25QXX_SPI_NUM->DR; //外设地址为:SPI->DR - W25QXX_SPI_DMA_CHANNEL->CMAR = (u32)&LCD->LCD_RAM;//目标地址为LCD_RAM - W25QXX_SPI_DMA_CHANNEL->CNDTR = 0; //DMA1,传输数据量,暂时设置为0 - W25QXX_SPI_DMA_CHANNEL->CCR = 0X00000000; //复位 - W25QXX_SPI_DMA_CHANNEL->CCR |= 0<<4; //从外设读 - W25QXX_SPI_DMA_CHANNEL->CCR |= 0<<5; //普通模式 - W25QXX_SPI_DMA_CHANNEL->CCR |= 0<<6; //外设地址非增量模式 - W25QXX_SPI_DMA_CHANNEL->CCR |= 0<<7; //存储器非增量模式 - W25QXX_SPI_DMA_CHANNEL->CCR |= LCD_DATA_16BIT<<8; //外设数据宽度为16位 - W25QXX_SPI_DMA_CHANNEL->CCR |= LCD_DATA_16BIT<<10; //存储器数据宽度16位 - W25QXX_SPI_DMA_CHANNEL->CCR |= 1<<12; //中等优先级 - W25QXX_SPI_DMA_CHANNEL->CCR |= 0<<14; //非存储器到存储器模式 -} - -#define LCD_DMA_MAX_TRANS 65535 //DMA 65535 bytes one frame -// start DMA transfer from SPI->DR to FSMC -// the max bytes of one frame is LCD_DMA_MAX_TRANS 65535 -void lcd_frame_segment_display(u16 size, u32 addr) -{ - W25QXX_SPI_DMA_CHANNEL->CNDTR = size; - - W25Qxx_SPI_CS_Set(0); - W25Qxx_SPI_Read_Write_Byte(CMD_FAST_READ_DATA); - W25Qxx_SPI_Read_Write_Byte((u8)((addr)>>16)); - W25Qxx_SPI_Read_Write_Byte((u8)((addr)>>8)); - W25Qxx_SPI_Read_Write_Byte((u8)addr); - W25Qxx_SPI_Read_Write_Byte(0XFF); //8 dummy clock - - //set SPI to 16bit DMA rx only mode - W25QXX_SPI_NUM->CR1 &= ~(1<<6); - W25QXX_SPI_NUM->CR2 |= 1<<0; //enable SPI rx DMA - W25QXX_SPI_NUM->CR1 |= LCD_DATA_16BIT<<11; //16bit data frame - W25QXX_SPI_NUM->CR1 |= 1<<10; //rx only - - W25QXX_SPI_DMA_CHANNEL->CCR |= 1<<0; //enable dma channel - W25QXX_SPI_NUM->CR1 |= 1<<6; //enable SPI - while((W25QXX_SPI_DMA->ISR&(1<CCR &= (u32)(~(1<<0)); - W25QXX_SPI_DMA->IFCR |= (u32)(1<APB1RSTR |= 1<<15; //reset SPI -// RCC->APB1RSTR &= ~(1<<15); - SPI_Protocol_Init(W25Qxx_SPI, W25Qxx_SPEED); -} - -void lcd_frame_display(u16 sx,u16 sy,u16 w,u16 h, u32 addr) -{ - u32 cur=0; - u32 segmentSize; - u32 totalSize = w*h*(2-LCD_DATA_16BIT); - - LCD_SetWindow(sx,sy,sx+w-1,sy+h-1); - LCD_WR_REG(0x2C); - - for(cur = 0; cur < totalSize; cur += LCD_DMA_MAX_TRANS) - { - segmentSize = cur+LCD_DMA_MAX_TRANS<=totalSize ? LCD_DMA_MAX_TRANS : totalSize-cur; - lcd_frame_segment_display(segmentSize, addr+cur*(LCD_DATA_16BIT + 1)); - } -} +void lcd_frame_display(u16 sx,u16 sy,u16 w,u16 h, u32 addr); #else diff --git a/TFT/src/User/API/boot.c b/TFT/src/User/API/boot.c index cee97a2d00..c1ba1ca48b 100644 --- a/TFT/src/User/API/boot.c +++ b/TFT/src/User/API/boot.c @@ -57,7 +57,7 @@ bool bmpDecode(char *bmp,u32 addr) f_read(&bmpFile, magic, 2 ,&mybr); if (memcmp(magic, "BM", 2)) return false; - //****************锟斤拷取头锟斤拷息****************// + f_lseek(&bmpFile, 10); f_read(&bmpFile, &offset, sizeof(int),&mybr); @@ -71,7 +71,7 @@ bool bmpDecode(char *bmp,u32 addr) return false; bpp >>=3; bytePerLine=w*bpp; - if(bytePerLine%4 !=0) //bmp锟侥硷拷每锟叫碉拷锟街斤拷锟斤拷锟斤拷锟斤拷锟斤拷 4 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷牵锟斤拷锟斤拷锟揭拷锟斤拷锟 + if(bytePerLine%4 !=0) //bmp bytePerLine=(bytePerLine/4+1)*4; for(bnum=0;bnum<(w*h*2+4095)/4096;bnum++) diff --git a/TFT/src/User/API/boot.h b/TFT/src/User/API/boot.h index 16e3cced15..bc62bb7f3b 100644 --- a/TFT/src/User/API/boot.h +++ b/TFT/src/User/API/boot.h @@ -1,20 +1,11 @@ #ifndef _BOOT_H_ #define _BOOT_H_ -#include "stm32f10x.h" #include "variants.h" #define BMP (1<<1) #define FONT (1<<2) -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2)|| defined(TFT35_V3_0) - #define ROOT_DIR "TFT35" -#elif defined(TFT28) - #define ROOT_DIR "TFT28" -#elif defined(TFT24_V1_1) - #define ROOT_DIR "TFT24" -#endif - #define BMP_ROOT_DIR "0:"ROOT_DIR"/bmp" #define FONT_ROOT_DIR "0:"ROOT_DIR"/font" diff --git a/TFT/src/User/API/coordinate.h b/TFT/src/User/API/coordinate.h index f96fbd203e..483a950a0f 100644 --- a/TFT/src/User/API/coordinate.h +++ b/TFT/src/User/API/coordinate.h @@ -1,7 +1,7 @@ #ifndef _COORDINATE_H_ #define _COORDINATE_H_ -#include "stm32f10x.h" +#include "variants.h" #include "stdbool.h" diff --git a/TFT/src/User/API/extend.c b/TFT/src/User/API/extend.c new file mode 100644 index 0000000000..19c987552e --- /dev/null +++ b/TFT/src/User/API/extend.c @@ -0,0 +1,38 @@ +#include "extend.h" +#include "GPIO_Init.h" +#include "variants.h" +#include "includes.h" + +#ifdef PS_ON_PIN +void PS_ON_Init(void) +{ + GPIO_InitSet(PS_ON_PIN, MGPIO_MODE_OUT_PP, 0); + GPIO_SetLevel(PS_ON_PIN, PS_ACTIVE_HIGH); +} +void PS_ON_On(void) +{ + GPIO_SetLevel(PS_ON_PIN, PS_ACTIVE_HIGH); +} +void PS_ON_Off(void) +{ + GPIO_SetLevel(PS_ON_PIN, !PS_ACTIVE_HIGH); +} +#endif + +#ifdef FIL_RUNOUT_PIN +void FIL_Runout_Init(void) +{ + GPIO_InitSet(FIL_RUNOUT_PIN, FIL_RUNOUT_INVERTING ? MGPIO_MODE_IPD : MGPIO_MODE_IPU, 0); +} + +void loopFILRunoutDetect(void) +{ + if(!isPrinting() || isPause()) return ; //not print or print is pause + + if(GPIO_GetLevel(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING) + { + if(setPrintPause(true)) + popupReminder(textSelect(LABEL_WARNING), "filament runout!"); + } +} +#endif diff --git a/TFT/src/User/API/extend.h b/TFT/src/User/API/extend.h new file mode 100644 index 0000000000..e6a909c329 --- /dev/null +++ b/TFT/src/User/API/extend.h @@ -0,0 +1,10 @@ +#ifndef _EXTEND_H_ +#define _EXTEND_H_ + +void PS_ON_Init(void); +void PS_ON_On(void); +void PS_ON_Off(void); +void FIL_Runout_Init(void); +void loopFILRunoutDetect(void); + +#endif diff --git a/TFT/src/User/API/flashStore.c b/TFT/src/User/API/flashStore.c index a4b69e25ef..a7ef4a29a4 100644 --- a/TFT/src/User/API/flashStore.c +++ b/TFT/src/User/API/flashStore.c @@ -1,45 +1,69 @@ #include "flashStore.h" +#include "STM32_Flash.h" +#define PARA_SIZE 256 //bytes #define PARA_SIGN 0x20190710 -#define SIGN_ADDRESS (0x08040000 - 0x800) //保留最后一页(2KB),用来保存用户参数 extern u32 TSC_Para[7]; //触摸屏校准系数 -#define TSC_ADDRESS (0x08040000 - 0x800 + 4) - extern SETTINGS infoSettings; //用户设置 -#define SETTING_ADDRESS (0x08040000 - 0x800 + 32) +void wordToByte(u32 word, u8 *bytes) //大端模式 +{ + u8 len = 4; + u8 i = 0; + for(i = 0; i < len; i++) + { + bytes[i] = (word >> 24) & 0xFF; + word <<= 8; + } +} + +u32 byteToWord(u8 *bytes, u8 len) +{ + u32 word = 0; + u8 i = 0; + for(i = 0; i < len; i++) + { + word <<= 8; + word |= bytes[i]; + } + return word; +} bool readStoredPara(void) { - if(*((vu32*)SIGN_ADDRESS) != PARA_SIGN) return false; + u8 data[PARA_SIZE]; + u32 index = 0; + u32 paraSign = 0; + STM32_FlashRead(data, PARA_SIZE); + + paraSign = byteToWord(data + (index += 4), 4); + if(paraSign != PARA_SIGN) return false; for(int i=0; i= 1) / Note that enabling exFAT discards C89 compatibility. */ diff --git a/TFT/src/User/Fatfs/myfatfs.c b/TFT/src/User/Fatfs/myfatfs.c index 7162483103..891b39bc89 100644 --- a/TFT/src/User/Fatfs/myfatfs.c +++ b/TFT/src/User/Fatfs/myfatfs.c @@ -19,14 +19,9 @@ FATFS fatfs[_VOLUMES]; /* FATFS work area*/ */ bool mountUDisk(void) { - for(int i=0; i<100; i++) //TODO: fix here (u disk read error) - USBH_Process(&USB_OTG_Core, &USB_Host); - return (f_mount(&fatfs[VOLUMES_U_DISK], "U:", 1) == FR_OK); + return (f_mount(&fatfs[VOLUMES_U_DISK], "U:", 1)== FR_OK); } -static uint32_t date=0; -static FILINFO finfo; -static uint16_t len = 0; /* scanf gcode file in current path true: scanf ok @@ -34,8 +29,10 @@ static uint16_t len = 0; */ bool scanPrintFilesFatFs(void) { - DIR dir; - uint8_t i=0; + FILINFO finfo; + uint16_t len = 0; + DIR dir; + uint8_t i=0; clearInfoFile(); @@ -67,7 +64,9 @@ bool scanPrintFilesFatFs(void) memcpy(infoFile.file[infoFile.f_num++], finfo.fname, len); } } - + + f_closedir(&dir); + for(i=0; i < infoFile.F_num/2; i++) { char *temp = infoFile.folder[i]; @@ -104,8 +103,11 @@ void GUI_DispDate(uint16_t date, uint16_t time) */ bool Get_NewestGcode(const TCHAR* path) { - DIR dirs; - char status = 0; + uint32_t date=0; + FILINFO finfo; + uint16_t len = 0; + DIR dirs; + char status = 0; if (f_opendir(&dirs, path) != FR_OK) return false; diff --git a/TFT/src/User/Hal/lcd.c b/TFT/src/User/Hal/LCD_Init.c similarity index 51% rename from TFT/src/User/Hal/lcd.c rename to TFT/src/User/Hal/LCD_Init.c index 0378c69d3c..e36de467c6 100644 --- a/TFT/src/User/Hal/lcd.c +++ b/TFT/src/User/Hal/LCD_Init.c @@ -1,213 +1,26 @@ +#include "LCD_init.h" +#include "GPIO_Init.h" #include "includes.h" -#include "lcd.h" -#ifdef LCD_LED_SUPPORT + +#ifdef LCD_LED_PIN void LCD_LED_On() { - GPIO_SetBits(LCD_LED_PORT, LCD_LED_PIN); + GPIO_SetLevel(LCD_LED_PIN, 1); } void LCD_LED_Off() { - GPIO_ResetBits(LCD_LED_PORT, LCD_LED_PIN); + GPIO_SetLevel(LCD_LED_PIN, 0); } void LCD_LED_Init(void) { - GPIO_InitTypeDef GPIO_InitStructure; - RCC_APB2PeriphClockCmd(LCD_LED_RCC, ENABLE); - LCD_LED_Off(); - //LED-K 背光灯 - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Pin = LCD_LED_PIN; - GPIO_Init(LCD_LED_PORT, &GPIO_InitStructure); + GPIO_InitSet(LCD_LED_PIN, MGPIO_MODE_OUT_PP, 0); } #endif -#ifdef STM32_HAS_FSMC -u16 LCD_RD_DATA(void) -{ - vu16 ram; - ram=LCD->LCD_RAM; - return ram; -} - -void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue) -{ - LCD->LCD_REG = LCD_Reg; - LCD->LCD_RAM = LCD_RegValue; -} - -u16 LCD_ReadReg(u8 LCD_Reg) -{ - LCD_WR_REG(LCD_Reg); - Delay_us(5); - return LCD_RD_DATA(); -} - -void LCD_GPIO_Config(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD |RCC_APB2Periph_GPIOE ,ENABLE); - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - /* 配置FSMC相对应的数据线,FSMC-D0~D15: PD 14 15 0 1 8 9 10,PE 7 8 9 10 11 12 13 14 15*/ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_0 | GPIO_Pin_1 - | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; - GPIO_Init(GPIOD, &GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 - | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 - | GPIO_Pin_15 | GPIO_Pin_2; - GPIO_Init(GPIOE, &GPIO_InitStructure); - /* 配置FSMC相对应的控制线 - * PD4-FSMC_NOE :LCD-RD - * PD5-FSMC_NWE :LCD-WR - * PD7-FSMC_NE1 :LCD-CS - * PD11-FSMC_A23 :LCD-RS LCD-RS发送的数据代表是命令还是显示数据 - */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_11; - GPIO_Init(GPIOD, &GPIO_InitStructure); -} - -void LCD_FSMC_Config(void) -{ - FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; - FSMC_NORSRAMTimingInitTypeDef readWriteTiming,writeTiming; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); - - readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns - readWriteTiming.FSMC_AddressHoldTime = 0x00; - readWriteTiming.FSMC_DataSetupTime = 0x0f; - readWriteTiming.FSMC_BusTurnAroundDuration = 0x00; - readWriteTiming.FSMC_CLKDivision = 0x00; - readWriteTiming.FSMC_DataLatency = 0x00; - readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A - - writeTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK - writeTiming.FSMC_AddressHoldTime = 0x00; - writeTiming.FSMC_DataSetupTime = 0x03; ////数据保存时间为4个HCLK - writeTiming.FSMC_BusTurnAroundDuration = 0x00; - writeTiming.FSMC_CLKDivision = 0x00; - writeTiming.FSMC_DataLatency = 0x00; - writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A - - FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; //选择外接存储区域的地址 - FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;//配置数据线和地址线是否复用 - FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; - FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;//配置外接存储器的类型 - FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//设置FSMC接口的数据宽度 - - FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;//配置访问模式 - FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;//配置等待信号的极性 - FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;//配置是否使用非对齐方式 - FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;//配置等待信号什么时间产生 - FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;//配置是否使用等待信号 - FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;//配置是否允许突发写操作 - - FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;//配置写操作使能 - FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable ;//配置是否使用扩展模式 - - FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;//读时序 - FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序 - - FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); - /* 使能 FSMC Bank1_SRAM Bank */ - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); -} - -void LCD_HardwareConfig(void) -{ - LCD_GPIO_Config(); - LCD_FSMC_Config(); -} - -#else -//写寄存器函数 -//data:寄存器值 -void LCD_WR_REG(u16 data) -{ - LCD_RS_CLR;//写地址 - LCD_CS_CLR; - DATAOUT(data); - LCD_WR_CLR; - LCD_WR_SET; - LCD_CS_SET; -} - -//写数据函数 -//可以替代LCD_WR_DATAX宏,拿时间换空间. -//data:寄存器值 -void LCD_WR_DATA(u16 data) -{ - LCD_RS_SET; - LCD_CS_CLR; - DATAOUT(data); - LCD_WR_CLR; - LCD_WR_SET; - LCD_CS_SET; -} - -//读LCD数据 -//返回值:读到的值 -u16 LCD_RD_DATA(void) -{ - vu16 ram; - GPIOC->CRL = 0X88888888; //PB0-7 上拉输入 - GPIOC->CRH = 0X88888888; //PB8-15 上拉输入 - GPIOC->ODR = 0X0000; //全部输出0 - - LCD_RS_SET; - LCD_CS_CLR; - //读取数据(读寄存器时,并不需要读2次) - LCD_RD_CLR; - - ram = DATAIN(); - LCD_RD_SET; - LCD_CS_SET; - - GPIOC->CRL = 0X33333333; //PC0-7 上拉输出 - GPIOC->CRH = 0X33333333; //PC8-15 上拉输出 - GPIOC->ODR = 0XFFFF; //全部输出高 - return ram; -} - -void LCD_GPIO_Config(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE); - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - /*D0 - D15: PC0 - PC15 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; - GPIO_Init(GPIOC, &GPIO_InitStructure); - GPIO_SetBits(GPIOC, GPIO_Pin_All); - - /* 配置控制线 - * PB6 :LCD-RD - * PB7 :LCD-WR - * PB9 :LCD-CS - * PB8 :LCD-RS LCD-RS发送的数据代表是命令还是显示数据 - */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; - GPIO_Init(GPIOB, &GPIO_InitStructure); - GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9); -} - -void LCD_HardwareConfig(void) -{ - LCD_GPIO_Config(); -} -#endif - -#if defined(TFT35_V1_2) || defined(TFT35_V3_0) +#if defined(TFT35_V1_2) || defined(TFT35_V2_0) //ILI9488 void LCD_init_RGB(void) { @@ -525,9 +338,9 @@ void LCD_Init(void) LCD_HardwareConfig(); LCD_init_RGB(); GUI_Clear(BLACK); - Delay_ms(15); + Delay_ms(20); -#ifdef LCD_LED_SUPPORT +#ifdef LCD_LED_PIN LCD_LED_Init(); LCD_LED_On(); #endif diff --git a/TFT/src/User/Hal/LCD_Init.h b/TFT/src/User/Hal/LCD_Init.h new file mode 100644 index 0000000000..1be7372f89 --- /dev/null +++ b/TFT/src/User/Hal/LCD_Init.h @@ -0,0 +1,18 @@ +#ifndef _LCD_INIT_H_ +#define _LCD_INIT_H_ + + +#include "variants.h" + +//TFT35 V1.0 V1.1 RM68042 8bit +//TFT35 V1.2 ili9488 16bit +//TFT28 TFT24 ili9341 16bit +#if LCD_DATA_16BIT == 1 + #define LCD_WR_16BITS_DATA(c) do{ LCD_WR_DATA(c); }while(0) +#else + #define LCD_WR_16BITS_DATA(c) do{ LCD_WR_DATA(((c)>>8)&0xFF); LCD_WR_DATA((c)&0xFF); }while(0) +#endif + +void LCD_Init(void); // + +#endif diff --git a/TFT/src/User/Hal/STM32Fxx_Pins.h b/TFT/src/User/Hal/STM32Fxx_Pins.h new file mode 100644 index 0000000000..71f9f4c2d3 --- /dev/null +++ b/TFT/src/User/Hal/STM32Fxx_Pins.h @@ -0,0 +1,207 @@ +#ifndef _STM32FXX_PINS_ +#define _STM32FXX_PINS_ + +#define _GPIOA_MAP 0 +#define _GPIOB_MAP 1 +#define _GPIOC_MAP 2 +#define _GPIOD_MAP 3 +#define _GPIOE_MAP 4 +#define _GPIOF_MAP 5 +#define _GPIOG_MAP 6 +#define _GPIOH_MAP 7 +#define _GPIOI_MAP 8 +#define _GPIOJ_MAP 9 +#define _GPIOK_MAP 10 + +#define PA0 ((_GPIOA_MAP<<8) | 0) +#define PA1 ((_GPIOA_MAP<<8) | 1) +#define PA2 ((_GPIOA_MAP<<8) | 2) +#define PA3 ((_GPIOA_MAP<<8) | 3) +#define PA4 ((_GPIOA_MAP<<8) | 4) +#define PA5 ((_GPIOA_MAP<<8) | 5) +#define PA6 ((_GPIOA_MAP<<8) | 6) +#define PA7 ((_GPIOA_MAP<<8) | 7) +#define PA8 ((_GPIOA_MAP<<8) | 8) +#define PA9 ((_GPIOA_MAP<<8) | 9) +#define PA10 ((_GPIOA_MAP<<8) | 10) +#define PA11 ((_GPIOA_MAP<<8) | 11) +#define PA12 ((_GPIOA_MAP<<8) | 12) +#define PA13 ((_GPIOA_MAP<<8) | 13) +#define PA14 ((_GPIOA_MAP<<8) | 14) +#define PA15 ((_GPIOA_MAP<<8) | 15) + +#define PB0 ((_GPIOB_MAP<<8) | 0) +#define PB1 ((_GPIOB_MAP<<8) | 1) +#define PB2 ((_GPIOB_MAP<<8) | 2) +#define PB3 ((_GPIOB_MAP<<8) | 3) +#define PB4 ((_GPIOB_MAP<<8) | 4) +#define PB5 ((_GPIOB_MAP<<8) | 5) +#define PB6 ((_GPIOB_MAP<<8) | 6) +#define PB7 ((_GPIOB_MAP<<8) | 7) +#define PB8 ((_GPIOB_MAP<<8) | 8) +#define PB9 ((_GPIOB_MAP<<8) | 9) +#define PB10 ((_GPIOB_MAP<<8) | 10) +#define PB11 ((_GPIOB_MAP<<8) | 11) +#define PB12 ((_GPIOB_MAP<<8) | 12) +#define PB13 ((_GPIOB_MAP<<8) | 13) +#define PB14 ((_GPIOB_MAP<<8) | 14) +#define PB15 ((_GPIOB_MAP<<8) | 15) + +#define PC0 ((_GPIOC_MAP<<8) | 0) +#define PC1 ((_GPIOC_MAP<<8) | 1) +#define PC2 ((_GPIOC_MAP<<8) | 2) +#define PC3 ((_GPIOC_MAP<<8) | 3) +#define PC4 ((_GPIOC_MAP<<8) | 4) +#define PC5 ((_GPIOC_MAP<<8) | 5) +#define PC6 ((_GPIOC_MAP<<8) | 6) +#define PC7 ((_GPIOC_MAP<<8) | 7) +#define PC8 ((_GPIOC_MAP<<8) | 8) +#define PC9 ((_GPIOC_MAP<<8) | 9) +#define PC10 ((_GPIOC_MAP<<8) | 10) +#define PC11 ((_GPIOC_MAP<<8) | 11) +#define PC12 ((_GPIOC_MAP<<8) | 12) +#define PC13 ((_GPIOC_MAP<<8) | 13) +#define PC14 ((_GPIOC_MAP<<8) | 14) +#define PC15 ((_GPIOC_MAP<<8) | 15) + +#define PD0 ((_GPIOD_MAP<<8) | 0) +#define PD1 ((_GPIOD_MAP<<8) | 1) +#define PD2 ((_GPIOD_MAP<<8) | 2) +#define PD3 ((_GPIOD_MAP<<8) | 3) +#define PD4 ((_GPIOD_MAP<<8) | 4) +#define PD5 ((_GPIOD_MAP<<8) | 5) +#define PD6 ((_GPIOD_MAP<<8) | 6) +#define PD7 ((_GPIOD_MAP<<8) | 7) +#define PD8 ((_GPIOD_MAP<<8) | 8) +#define PD9 ((_GPIOD_MAP<<8) | 9) +#define PD10 ((_GPIOD_MAP<<8) | 10) +#define PD11 ((_GPIOD_MAP<<8) | 11) +#define PD12 ((_GPIOD_MAP<<8) | 12) +#define PD13 ((_GPIOD_MAP<<8) | 13) +#define PD14 ((_GPIOD_MAP<<8) | 14) +#define PD15 ((_GPIOD_MAP<<8) | 15) + +#define PE0 ((_GPIOE_MAP<<8) | 0) +#define PE1 ((_GPIOE_MAP<<8) | 1) +#define PE2 ((_GPIOE_MAP<<8) | 2) +#define PE3 ((_GPIOE_MAP<<8) | 3) +#define PE4 ((_GPIOE_MAP<<8) | 4) +#define PE5 ((_GPIOE_MAP<<8) | 5) +#define PE6 ((_GPIOE_MAP<<8) | 6) +#define PE7 ((_GPIOE_MAP<<8) | 7) +#define PE8 ((_GPIOE_MAP<<8) | 8) +#define PE9 ((_GPIOE_MAP<<8) | 9) +#define PE10 ((_GPIOE_MAP<<8) | 10) +#define PE11 ((_GPIOE_MAP<<8) | 11) +#define PE12 ((_GPIOE_MAP<<8) | 12) +#define PE13 ((_GPIOE_MAP<<8) | 13) +#define PE14 ((_GPIOE_MAP<<8) | 14) +#define PE15 ((_GPIOE_MAP<<8) | 15) + +#define PF0 ((_GPIOF_MAP<<8) | 0) +#define PF1 ((_GPIOF_MAP<<8) | 1) +#define PF2 ((_GPIOF_MAP<<8) | 2) +#define PF3 ((_GPIOF_MAP<<8) | 3) +#define PF4 ((_GPIOF_MAP<<8) | 4) +#define PF5 ((_GPIOF_MAP<<8) | 5) +#define PF6 ((_GPIOF_MAP<<8) | 6) +#define PF7 ((_GPIOF_MAP<<8) | 7) +#define PF8 ((_GPIOF_MAP<<8) | 8) +#define PF9 ((_GPIOF_MAP<<8) | 9) +#define PF10 ((_GPIOF_MAP<<8) | 10) +#define PF11 ((_GPIOF_MAP<<8) | 11) +#define PF12 ((_GPIOF_MAP<<8) | 12) +#define PF13 ((_GPIOF_MAP<<8) | 13) +#define PF14 ((_GPIOF_MAP<<8) | 14) +#define PF15 ((_GPIOF_MAP<<8) | 15) + +#define PG0 ((_GPIOG_MAP<<8) | 0) +#define PG1 ((_GPIOG_MAP<<8) | 1) +#define PG2 ((_GPIOG_MAP<<8) | 2) +#define PG3 ((_GPIOG_MAP<<8) | 3) +#define PG4 ((_GPIOG_MAP<<8) | 4) +#define PG5 ((_GPIOG_MAP<<8) | 5) +#define PG6 ((_GPIOG_MAP<<8) | 6) +#define PG7 ((_GPIOG_MAP<<8) | 7) +#define PG8 ((_GPIOG_MAP<<8) | 8) +#define PG9 ((_GPIOG_MAP<<8) | 9) +#define PG10 ((_GPIOG_MAP<<8) | 10) +#define PG11 ((_GPIOG_MAP<<8) | 11) +#define PG12 ((_GPIOG_MAP<<8) | 12) +#define PG13 ((_GPIOG_MAP<<8) | 13) +#define PG14 ((_GPIOG_MAP<<8) | 14) +#define PG15 ((_GPIOG_MAP<<8) | 15) + +#define PH0 ((_GPIOH_MAP<<8) | 0) +#define PH1 ((_GPIOH_MAP<<8) | 1) +#define PH2 ((_GPIOH_MAP<<8) | 2) +#define PH3 ((_GPIOH_MAP<<8) | 3) +#define PH4 ((_GPIOH_MAP<<8) | 4) +#define PH5 ((_GPIOH_MAP<<8) | 5) +#define PH6 ((_GPIOH_MAP<<8) | 6) +#define PH7 ((_GPIOH_MAP<<8) | 7) +#define PH8 ((_GPIOH_MAP<<8) | 8) +#define PH9 ((_GPIOH_MAP<<8) | 9) +#define PH10 ((_GPIOH_MAP<<8) | 10) +#define PH11 ((_GPIOH_MAP<<8) | 11) +#define PH12 ((_GPIOH_MAP<<8) | 12) +#define PH13 ((_GPIOH_MAP<<8) | 13) +#define PH14 ((_GPIOH_MAP<<8) | 14) +#define PH15 ((_GPIOH_MAP<<8) | 15) + +#define PI0 ((_GPIOI_MAP<<8) | 0) +#define PI1 ((_GPIOI_MAP<<8) | 1) +#define PI2 ((_GPIOI_MAP<<8) | 2) +#define PI3 ((_GPIOI_MAP<<8) | 3) +#define PI4 ((_GPIOI_MAP<<8) | 4) +#define PI5 ((_GPIOI_MAP<<8) | 5) +#define PI6 ((_GPIOI_MAP<<8) | 6) +#define PI7 ((_GPIOI_MAP<<8) | 7) +#define PI8 ((_GPIOI_MAP<<8) | 8) +#define PI9 ((_GPIOI_MAP<<8) | 9) +#define PI10 ((_GPIOI_MAP<<8) | 10) +#define PI11 ((_GPIOI_MAP<<8) | 11) +#define PI12 ((_GPIOI_MAP<<8) | 12) +#define PI13 ((_GPIOI_MAP<<8) | 13) +#define PI14 ((_GPIOI_MAP<<8) | 14) +#define PI15 ((_GPIOI_MAP<<8) | 15) + +#define PJ0 ((_GPIOJ_MAP<<8) | 0) +#define PJ1 ((_GPIOJ_MAP<<8) | 1) +#define PJ2 ((_GPIOJ_MAP<<8) | 2) +#define PJ3 ((_GPIOJ_MAP<<8) | 3) +#define PJ4 ((_GPIOJ_MAP<<8) | 4) +#define PJ5 ((_GPIOJ_MAP<<8) | 5) +#define PJ6 ((_GPIOJ_MAP<<8) | 6) +#define PJ7 ((_GPIOJ_MAP<<8) | 7) +#define PJ8 ((_GPIOJ_MAP<<8) | 8) +#define PJ9 ((_GPIOJ_MAP<<8) | 9) +#define PJ10 ((_GPIOJ_MAP<<8) | 10) +#define PJ11 ((_GPIOJ_MAP<<8) | 11) +#define PJ12 ((_GPIOJ_MAP<<8) | 12) +#define PJ13 ((_GPIOJ_MAP<<8) | 13) +#define PJ14 ((_GPIOJ_MAP<<8) | 14) +#define PJ15 ((_GPIOJ_MAP<<8) | 15) + +#define PK0 ((_GPIOK_MAP<<8) | 0) +#define PK1 ((_GPIOK_MAP<<8) | 1) +#define PK2 ((_GPIOK_MAP<<8) | 2) +#define PK3 ((_GPIOK_MAP<<8) | 3) +#define PK4 ((_GPIOK_MAP<<8) | 4) +#define PK5 ((_GPIOK_MAP<<8) | 5) +#define PK6 ((_GPIOK_MAP<<8) | 6) +#define PK7 ((_GPIOK_MAP<<8) | 7) +#define PK8 ((_GPIOK_MAP<<8) | 8) +#define PK9 ((_GPIOK_MAP<<8) | 9) +#define PK10 ((_GPIOK_MAP<<8) | 10) +#define PK11 ((_GPIOK_MAP<<8) | 11) +#define PK12 ((_GPIOK_MAP<<8) | 12) +#define PK13 ((_GPIOK_MAP<<8) | 13) +#define PK14 ((_GPIOK_MAP<<8) | 14) +#define PK15 ((_GPIOK_MAP<<8) | 15) + + +#define GPIO_GET_PORT(n) ((n>>8) & 0xFF) +#define GPIO_GET_PIN(n) (n & 0xFF) + +#endif diff --git a/TFT/src/User/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_bot.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_bot.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_bot.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_bot.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_core.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_core.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_core.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_core.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_scsi.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_scsi.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_scsi.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/inc/usbh_msc_scsi.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_bot.c b/TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_bot.c similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_bot.c rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_bot.c diff --git a/TFT/src/User/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_core.c b/TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_core.c similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_core.c rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_core.c diff --git a/TFT/src/User/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_scsi.c b/TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_scsi.c similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_scsi.c rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/src/usbh_msc_scsi.c diff --git a/TFT/src/User/STM32_USB_HOST_Library/Core/inc/usbh_core.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc/usbh_core.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Core/inc/usbh_core.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc/usbh_core.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Core/inc/usbh_def.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc/usbh_def.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Core/inc/usbh_def.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc/usbh_def.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Core/inc/usbh_hcs.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc/usbh_hcs.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Core/inc/usbh_hcs.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc/usbh_hcs.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Core/inc/usbh_ioreq.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc/usbh_ioreq.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Core/inc/usbh_ioreq.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc/usbh_ioreq.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Core/inc/usbh_stdreq.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc/usbh_stdreq.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Core/inc/usbh_stdreq.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc/usbh_stdreq.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Core/src/usbh_core.c b/TFT/src/User/Hal/STM32_USB_HOST_Library/Core/src/usbh_core.c similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Core/src/usbh_core.c rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Core/src/usbh_core.c diff --git a/TFT/src/User/STM32_USB_HOST_Library/Core/src/usbh_hcs.c b/TFT/src/User/Hal/STM32_USB_HOST_Library/Core/src/usbh_hcs.c similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Core/src/usbh_hcs.c rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Core/src/usbh_hcs.c diff --git a/TFT/src/User/STM32_USB_HOST_Library/Core/src/usbh_ioreq.c b/TFT/src/User/Hal/STM32_USB_HOST_Library/Core/src/usbh_ioreq.c similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Core/src/usbh_ioreq.c rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Core/src/usbh_ioreq.c diff --git a/TFT/src/User/STM32_USB_HOST_Library/Core/src/usbh_stdreq.c b/TFT/src/User/Hal/STM32_USB_HOST_Library/Core/src/usbh_stdreq.c similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Core/src/usbh_stdreq.c rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Core/src/usbh_stdreq.c diff --git a/TFT/src/User/STM32_USB_HOST_Library/Release_Notes.html b/TFT/src/User/Hal/STM32_USB_HOST_Library/Release_Notes.html similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Release_Notes.html rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Release_Notes.html diff --git a/TFT/src/User/STM32_USB_HOST_Library/Usr/inc/usb_conf.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/inc/usb_conf.h similarity index 96% rename from TFT/src/User/STM32_USB_HOST_Library/Usr/inc/usb_conf.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/inc/usb_conf.h index afdc89be95..be519f9c46 100644 --- a/TFT/src/User/STM32_USB_HOST_Library/Usr/inc/usb_conf.h +++ b/TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/inc/usb_conf.h @@ -23,7 +23,7 @@ #ifndef __USB_CONF__H__ #define __USB_CONF__H__ -#include "stm32f10x.h" +#include "variants.h" /** @addtogroup USB_OTG_DRIVER diff --git a/TFT/src/User/STM32_USB_HOST_Library/Usr/inc/usb_log.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/inc/usb_log.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Usr/inc/usb_log.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/inc/usb_log.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Usr/inc/usbh_conf.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/inc/usbh_conf.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Usr/inc/usbh_conf.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/inc/usbh_conf.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Usr/inc/usbh_usr.h b/TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/inc/usbh_usr.h similarity index 100% rename from TFT/src/User/STM32_USB_HOST_Library/Usr/inc/usbh_usr.h rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/inc/usbh_usr.h diff --git a/TFT/src/User/STM32_USB_HOST_Library/Usr/src/usb_bsp.c b/TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/src/usb_bsp.c similarity index 88% rename from TFT/src/User/STM32_USB_HOST_Library/Usr/src/usb_bsp.c rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/src/usb_bsp.c index 50600dfa13..503e2f720a 100644 --- a/TFT/src/User/STM32_USB_HOST_Library/Usr/src/usb_bsp.c +++ b/TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/src/usb_bsp.c @@ -26,6 +26,7 @@ #include "usb_hcd_int.h" #include "usbh_core.h" #include "delay.h" +#include "variants.h" #ifdef U_DISK_SUPPROT /** @@ -50,8 +51,8 @@ void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE * pdev) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - /* Configure SOF ID DM DP Pins */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_12; + /* Configure DM DP Pins */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; @@ -59,26 +60,9 @@ void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE * pdev) GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); - GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_OTG1_FS); GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_OTG1_FS); GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_OTG1_FS); - /* Configure VBUS Pin */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOA, &GPIO_InitStructure); - - /* Configure ID pin */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_Init(GPIOA, &GPIO_InitStructure); - GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_OTG1_FS); - RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE); #else // USE_USB_OTG_HS @@ -177,7 +161,7 @@ void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE * pdev) #endif // USB_OTG_HS #endif // USE_STM322xG_EVAL - Delay_init(72); + Delay_init(F_CPUM); } /** diff --git a/TFT/src/User/STM32_USB_HOST_Library/Usr/src/usbh_usr.c b/TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/src/usbh_usr.c similarity index 95% rename from TFT/src/User/STM32_USB_HOST_Library/Usr/src/usbh_usr.c rename to TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/src/usbh_usr.c index a12aabc251..57f9b6f8b4 100644 --- a/TFT/src/User/STM32_USB_HOST_Library/Usr/src/usbh_usr.c +++ b/TFT/src/User/Hal/STM32_USB_HOST_Library/Usr/src/usbh_usr.c @@ -375,10 +375,10 @@ uint8_t USBH_UDISK_Status(void) uint8_t USBH_UDISK_Read(uint8_t* buf, uint32_t sector, uint32_t cnt) { - BYTE status = USBH_MSC_OK; + BYTE status = USBH_MSC_FAIL; if (HCD_IsDeviceConnected(&USB_OTG_Core)) - { + { do { status = USBH_MSC_Read10(&USB_OTG_Core, buf, sector,512 * cnt); @@ -400,7 +400,7 @@ uint8_t USBH_UDISK_Read(uint8_t* buf, uint32_t sector, uint32_t cnt) uint8_t USBH_UDISK_Write(uint8_t* buf, uint32_t sector, uint32_t cnt) { - BYTE status = USBH_MSC_OK; + BYTE status = USBH_MSC_FAIL; if (HCD_IsDeviceConnected(&USB_OTG_Core)) { diff --git a/TFT/src/User/STM32_USB_OTG_Driver/Release_Notes.html b/TFT/src/User/Hal/STM32_USB_OTG_Driver/Release_Notes.html similarity index 100% rename from TFT/src/User/STM32_USB_OTG_Driver/Release_Notes.html rename to TFT/src/User/Hal/STM32_USB_OTG_Driver/Release_Notes.html diff --git a/TFT/src/User/STM32_USB_OTG_Driver/inc/usb_bsp.h b/TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_bsp.h similarity index 100% rename from TFT/src/User/STM32_USB_OTG_Driver/inc/usb_bsp.h rename to TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_bsp.h diff --git a/TFT/src/User/STM32_USB_OTG_Driver/inc/usb_core.h b/TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_core.h similarity index 100% rename from TFT/src/User/STM32_USB_OTG_Driver/inc/usb_core.h rename to TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_core.h diff --git a/TFT/src/User/STM32_USB_OTG_Driver/inc/usb_defines.h b/TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_defines.h similarity index 100% rename from TFT/src/User/STM32_USB_OTG_Driver/inc/usb_defines.h rename to TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_defines.h diff --git a/TFT/src/User/STM32_USB_OTG_Driver/inc/usb_hcd.h b/TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_hcd.h similarity index 100% rename from TFT/src/User/STM32_USB_OTG_Driver/inc/usb_hcd.h rename to TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_hcd.h diff --git a/TFT/src/User/STM32_USB_OTG_Driver/inc/usb_hcd_int.h b/TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_hcd_int.h similarity index 100% rename from TFT/src/User/STM32_USB_OTG_Driver/inc/usb_hcd_int.h rename to TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_hcd_int.h diff --git a/TFT/src/User/STM32_USB_OTG_Driver/inc/usb_regs.h b/TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_regs.h similarity index 100% rename from TFT/src/User/STM32_USB_OTG_Driver/inc/usb_regs.h rename to TFT/src/User/Hal/STM32_USB_OTG_Driver/inc/usb_regs.h diff --git a/TFT/src/User/STM32_USB_OTG_Driver/src/usb_core.c b/TFT/src/User/Hal/STM32_USB_OTG_Driver/src/usb_core.c similarity index 100% rename from TFT/src/User/STM32_USB_OTG_Driver/src/usb_core.c rename to TFT/src/User/Hal/STM32_USB_OTG_Driver/src/usb_core.c diff --git a/TFT/src/User/STM32_USB_OTG_Driver/src/usb_hcd.c b/TFT/src/User/Hal/STM32_USB_OTG_Driver/src/usb_hcd.c similarity index 100% rename from TFT/src/User/STM32_USB_OTG_Driver/src/usb_hcd.c rename to TFT/src/User/Hal/STM32_USB_OTG_Driver/src/usb_hcd.c diff --git a/TFT/src/User/STM32_USB_OTG_Driver/src/usb_hcd_int.c b/TFT/src/User/Hal/STM32_USB_OTG_Driver/src/usb_hcd_int.c similarity index 100% rename from TFT/src/User/STM32_USB_OTG_Driver/src/usb_hcd_int.c rename to TFT/src/User/Hal/STM32_USB_OTG_Driver/src/usb_hcd_int.c diff --git a/TFT/src/User/Hal/sd.c b/TFT/src/User/Hal/sd.c index 5d04c819f1..07b8c19671 100644 --- a/TFT/src/User/Hal/sd.c +++ b/TFT/src/User/Hal/sd.c @@ -1,6 +1,9 @@ -#include "sd.h" #include "variants.h" +#ifdef SD_SPI_SUPPORT +#include "sd.h" +#include "GPIO_Init.h" + u8 SD_Type=0; //SD卡的类型 /***************************************** SD SPI 模式底层移植的接口***********************************************/ @@ -20,32 +23,27 @@ void SD_SPI_CS_Set(u8 level) SPI_CS_Set(SD_SPI,level); } -#ifdef SD_CD_SUPPROT +#ifdef SD_CD_PIN //SD_CD insert detect void SD_CD_WP_Init(void) { - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(SD_CD_RCC, ENABLE); - GPIO_InitStructure.GPIO_Pin = SD_CD_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; - GPIO_Init(SD_CD_PORT, &GPIO_InitStructure); + GPIO_InitSet(SD_CD_PIN, MGPIO_MODE_IPU, 0); } #endif u8 SD_CD_Inserted(void) { -#ifdef SD_CD_SUPPROT - return !GPIO_ReadInputDataBit(SD_CD_PORT, SD_CD_PIN); +#ifdef SD_CD_PIN + return !GPIO_GetLevel(SD_CD_PIN); #else - return 1; + return 0; #endif } //初始化 void SD_SPI_Init(void) { -#ifdef SD_CD_SUPPROT +#ifdef SD_CD_PIN SD_CD_WP_Init(); #endif SPI_Config(SD_SPI); @@ -359,7 +357,7 @@ u8 SD_Init(void) **cnt:扇区数 **返回值:0,ok;其他,失败. *************************************************************************************/ -u8 SD_Read_Data(u8*buf,u32 sector,u32 cnt) +u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt) //读SD卡,fatfs/usb调用x { u8 r1; if(SD_Type != SD_TYPE_V2HC) sector <<= 9;//转换为字节地址 @@ -391,7 +389,7 @@ u8 SD_Read_Data(u8*buf,u32 sector,u32 cnt) **cnt:扇区数 **返回值:0,ok;其他,失败. *************************************************************************************/ -u8 SD_Write_Data(u8*buf,u32 sector,u32 cnt) +u8 SD_WriteDisk(u8*buf,u32 sector,u8 cnt) //写SD卡,fatfs/usb调用 { u8 r1; if(SD_Type!=SD_TYPE_V2HC) sector *= 512;//转换为字节地址 @@ -424,4 +422,4 @@ u8 SD_Write_Data(u8*buf,u32 sector,u32 cnt) return r1;// } - +#endif diff --git a/TFT/src/User/Hal/sd.h b/TFT/src/User/Hal/sd.h index 345f82bf4e..8f6d7c8aeb 100644 --- a/TFT/src/User/Hal/sd.h +++ b/TFT/src/User/Hal/sd.h @@ -45,16 +45,11 @@ #define SD_PARAMETER_ERROR 0x40 #define SD_RESPONSE_FAILURE 0xFF -//#define SD_CD_SUPPROT -//#define SD_CD_RCC RCC_APB2Periph_GPIOA -//#define SD_CD_PORT GPIOA -//#define SD_CD_PIN GPIO_Pin_13 - u8 SD_CD_Inserted(void); u8 SD_Init(void); //初始化 void SD_DeInit(void); -u8 SD_Read_Data(u8*buf,u32 sector,u32 cnt); //读块 -u8 SD_Write_Data(u8*buf,u32 sector,u32 cnt); //写块 +u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt); //读SD卡,fatfs/usb调用 +u8 SD_WriteDisk(u8*buf,u32 sector,u8 cnt); //写SD卡,fatfs/usb调用 u8 SD_Wait_Ready(void); //等待SD卡准备 u8 SD_Get_Ack(u8 Response); //获得应答 diff --git a/TFT/src/User/Hal/spi.c b/TFT/src/User/Hal/spi.c deleted file mode 100644 index 85eb42a01d..0000000000 --- a/TFT/src/User/Hal/spi.c +++ /dev/null @@ -1,133 +0,0 @@ -#include "spi.h" - -#ifndef SPI1_CS_RCC - #define SPI1_CS_RCC RCC_APB2Periph_GPIOA - #define SPI1_CS_PORT GPIOA - #define SPI1_CS_PIN GPIO_Pin_4 -#endif - -#ifndef SPI2_CS_RCC -#define SPI2_CS_RCC RCC_APB2Periph_GPIOB -#define SPI2_CS_PORT GPIOB -#define SPI2_CS_PIN GPIO_Pin_12 -#endif - -#ifndef SPI3_CS_RCC -#define SPI3_CS_RCC RCC_APB2Periph_GPIOA -#define SPI3_CS_PORT GPIOA -#define SPI3_CS_PIN GPIO_Pin_15 -#endif - - -static SPI_TypeDef *spi[_SPI_CNT] = {SPI1, //CS--PA4 SCK--PA5 MISO--PA6 MOSI--PA7 - SPI2, //CS--PB12 SCK--PB13 MISO--PB14 MOSI--PB15 - SPI3}; //CS--PA15 SCK--PB3 MISO--PB4 MOSI--PB5 - -GPIO_TypeDef *CS_GPIO_Port[_SPI_CNT] = {SPI1_CS_PORT, SPI2_CS_PORT, SPI3_CS_PORT}; //CS -uint16_t CS_GPIO_Pin[_SPI_CNT] = {SPI1_CS_PIN, SPI2_CS_PIN, SPI3_CS_PIN}; - -void SPI_GPIO_Init(uint8_t port, u8 DeInit) -{ - uint32_t RCC_Define[_SPI_CNT] = {RCC_APB2Periph_GPIOA | SPI1_CS_RCC, - RCC_APB2Periph_GPIOB | SPI2_CS_RCC, - RCC_APB2Periph_GPIOB | SPI3_CS_RCC}; - GPIO_TypeDef *SCK_GPIO_Port[_SPI_CNT] = {GPIOA, GPIOB, GPIOB}; //SCK - uint16_t SCK_GPIO_Pin[_SPI_CNT] = {GPIO_Pin_5, GPIO_Pin_13, GPIO_Pin_3}; - GPIO_TypeDef *MISO_GPIO_Port[_SPI_CNT] = {GPIOA, GPIOB, GPIOB}; //MISO - uint16_t MISO_GPIO_Pin[_SPI_CNT] = {GPIO_Pin_6, GPIO_Pin_14, GPIO_Pin_4}; - GPIO_TypeDef *MOSI_GPIO_Port[_SPI_CNT] = {GPIOA, GPIOB, GPIOB}; //MOSI - uint16_t MOSI_GPIO_Pin[_SPI_CNT] = {GPIO_Pin_7, GPIO_Pin_15, GPIO_Pin_5}; - - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(RCC_Define[port],ENABLE); - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - - GPIO_InitStructure.GPIO_Mode = DeInit ? GPIO_Mode_IN_FLOATING : GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Pin = SCK_GPIO_Pin[port]; //SCK - GPIO_Init(SCK_GPIO_Port[port],&GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = MISO_GPIO_Pin[port]; //MISO - GPIO_Init(MISO_GPIO_Port[port],&GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = MOSI_GPIO_Pin[port]; //MOSI - GPIO_Init(MOSI_GPIO_Port[port],&GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Mode = DeInit ? GPIO_Mode_IN_FLOATING : GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Pin = CS_GPIO_Pin[port]; //CS - GPIO_Init(CS_GPIO_Port[port],&GPIO_InitStructure); - GPIO_SetBits(CS_GPIO_Port[port],CS_GPIO_Pin[port]); -} - -// 硬件SPI协议初始化 -// baudrate的取值范围为 0-7 -// 传输速率为 2^(baudrate+1) 分频,2-256分频 -void SPI_Protocol_Init(uint8_t port, uint8_t baudrate) -{ - SPI_InitTypeDef SPI_InitStructure; - - switch(port) - { - case _SPI1: RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE); break; - case _SPI2: RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); break; - case _SPI3: RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE); break; - default: break; - } - - SPI_InitStructure.SPI_BaudRatePrescaler = baudrate<<3; - SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; - SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; - SPI_InitStructure.SPI_CRCPolynomial = 7; - SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; - SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; - SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB; - SPI_InitStructure.SPI_Mode = SPI_Mode_Master; - SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; - SPI_Init(spi[port], &SPI_InitStructure); - - SPI_Cmd(spi[port],ENABLE); -} - -void SPI_Config(uint8_t port) -{ - SPI_GPIO_Init(port, 0); - SPI_Protocol_Init(port,SPI_BaudRatePrescaler_2); -} - -void SPI_DeConfig(uint8_t port) -{ - SPI_GPIO_Init(port, 1); - switch(port) - { - case _SPI1: - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE); - break; - case _SPI2: - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE); - break; - case _SPI3: - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3,ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3,DISABLE); - break; - default: break; - } -} - -uint16_t SPI_Read_Write(uint8_t port, uint16_t d) -{ - while(SPI_I2S_GetFlagStatus(spi[port], SPI_I2S_FLAG_TXE) == RESET); - SPI_I2S_SendData(spi[port], d); - while(SPI_I2S_GetFlagStatus(spi[port], SPI_I2S_FLAG_RXNE) == RESET); - return SPI_I2S_ReceiveData(spi[port]); -} - -void SPI_CS_Set(uint8_t port, uint8_t level) -{ - if(level) - CS_GPIO_Port[port]->BSRR = CS_GPIO_Pin[port]; - else - CS_GPIO_Port[port]->BRR = CS_GPIO_Pin[port]; -} diff --git a/TFT/src/User/Hal/stm32f10x/GPIO_Init.c b/TFT/src/User/Hal/stm32f10x/GPIO_Init.c new file mode 100644 index 0000000000..0e41945b19 --- /dev/null +++ b/TFT/src/User/Hal/stm32f10x/GPIO_Init.c @@ -0,0 +1,56 @@ +#include "GPIO_Init.h" + +GPIO_TypeDef* GPIO_Port[] = {GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG}; + +void GPIO_InitSet(uint16_t io, GPIO_MODE mode, uint8_t AF) +{ + u16 port = GPIO_GET_PORT(io); + u16 pin = GPIO_GET_PIN(io); + + RCC->APB2ENR |= 1 << (port+2); //Enable GPIO Clock, GPIOA start at APB2 bit2 + + if (mode == MGPIO_MODE_IPD) + { + GPIO_Port[port]->BSRR = 1 << (pin+16); //set low + mode = MGPIO_MODE_IPU; + } + else if (mode == MGPIO_MODE_IPU) + { + GPIO_Port[port]->BSRR = 1 << pin; //set high + } + + if(pin <= 7) + { + GPIO_Port[port]->CRL &= ~(0xF << 4*(pin & 0x7)); //clear control reg bits + GPIO_Port[port]->CRL |= mode << 4*(pin & 0x7); //clear control reg bits + } + else + { + GPIO_Port[port]->CRH &= ~(0xF << 4*(pin & 0x7)); //clear control reg bits + GPIO_Port[port]->CRH |= mode << 4*(pin & 0x7); //clear control reg bits + } +} + +void GPIO_SetLevel(uint16_t io, uint8_t level) +{ + u16 port = GPIO_GET_PORT(io); + u16 pin = GPIO_GET_PIN(io); + + GPIO_Port[port]->BSRR = 1 << (level ? pin : (pin+16)); +} + +uint8_t GPIO_GetLevel(uint16_t io) +{ + u16 port = GPIO_GET_PORT(io); + u16 pin = GPIO_GET_PIN(io); + + if ((GPIO_Port[port]->IDR & (1 << pin)) != 0) + { + return 1; + } + else + { + return 0; + } +} + diff --git a/TFT/src/User/Hal/stm32f10x/GPIO_Init.h b/TFT/src/User/Hal/stm32f10x/GPIO_Init.h new file mode 100644 index 0000000000..f55b4a982a --- /dev/null +++ b/TFT/src/User/Hal/stm32f10x/GPIO_Init.h @@ -0,0 +1,28 @@ +#ifndef _GPIO_INIT_H_ +#define _GPIO_INIT_H_ + +#include "stm32f10x_conf.h" +#include "STM32Fxx_Pins.h" + +/* +bit 0:1 - 00:input(reset vale) 01:output 10MHz 10:output 2Mhz 11:output 50MHz +bit 2:3 - Input 00:Analog input 01:input floating(reset value) 10:pull up/down 11:Reserved + - Output 00:Output push-pull 01:Output open-drain 10:AF push-pull 11:AF open-drain +*/ +typedef enum +{ + MGPIO_MODE_AIN = (0<<2)|(0), + MGPIO_MODE_IPN = (1<<2)|(0), + MGPIO_MODE_IPU = (2<<2)|(0), + MGPIO_MODE_IPD = (3<<2)|(0), + MGPIO_MODE_OUT_PP = (0<<2)|(3), + MGPIO_MODE_OUT_OD = (1<<2)|(3), + MGPIO_MODE_AF_PP = (2<<2)|(3), + MGPIO_MODE_AF_OD = (3<<2)|(3), +}GPIO_MODE; + + +void GPIO_InitSet(uint16_t io, GPIO_MODE mode, uint8_t AF); +void GPIO_SetLevel(uint16_t io, uint8_t level); +uint8_t GPIO_GetLevel(uint16_t io); +#endif diff --git a/TFT/src/User/Hal/stm32f10x/STM32_Flash.c b/TFT/src/User/Hal/stm32f10x/STM32_Flash.c new file mode 100644 index 0000000000..2e3e76ab45 --- /dev/null +++ b/TFT/src/User/Hal/stm32f10x/STM32_Flash.c @@ -0,0 +1,27 @@ +#include "STM32_Flash.h" +#include "my_misc.h" +#include "stm32f10x.h" + +#define SIGN_ADDRESS (0x08040000 - 0x800) //reserve the last page (2KB) to save user parameters + +void STM32_FlashRead(u8 *data, u32 len) +{ + u32 i = 0; + for(i = 0; i < len; i++) + { + data[i] = *(vu8*)(SIGN_ADDRESS + i); + } +} + +void STM32_FlashWrite(u8 *data, u32 len) +{ + u32 i = 0; + FLASH_Unlock(); + FLASH_ErasePage(SIGN_ADDRESS); + for(i = 0; i < len; i += 2) + { + u16 data16 = data[i] | (data[MIN(i+1, len-1)] << 8); //stm32f10x needs to write at least 16 bits at a time + FLASH_ProgramHalfWord(SIGN_ADDRESS + i, data16); + } + FLASH_Lock(); +} diff --git a/TFT/src/User/Hal/stm32f10x/STM32_Flash.h b/TFT/src/User/Hal/stm32f10x/STM32_Flash.h new file mode 100644 index 0000000000..d9ddf1ff06 --- /dev/null +++ b/TFT/src/User/Hal/stm32f10x/STM32_Flash.h @@ -0,0 +1,9 @@ +#ifndef _STM32_FLASH_H_ +#define _STM32_FLASH_H_ + +#include "stm32f10x.h" + +void STM32_FlashRead(u8 *data, u32 len); +void STM32_FlashWrite(u8 *data, u32 len); + +#endif diff --git a/TFT/src/User/Hal/Serial.c b/TFT/src/User/Hal/stm32f10x/Serial.c similarity index 100% rename from TFT/src/User/Hal/Serial.c rename to TFT/src/User/Hal/stm32f10x/Serial.c diff --git a/TFT/src/User/Hal/Serial.h b/TFT/src/User/Hal/stm32f10x/Serial.h similarity index 100% rename from TFT/src/User/Hal/Serial.h rename to TFT/src/User/Hal/stm32f10x/Serial.h diff --git a/TFT/src/User/Hal/stm32f10x/lcd.c b/TFT/src/User/Hal/stm32f10x/lcd.c new file mode 100644 index 0000000000..382d60273f --- /dev/null +++ b/TFT/src/User/Hal/stm32f10x/lcd.c @@ -0,0 +1,185 @@ +#include "includes.h" +#include "lcd.h" + +#ifdef STM32_HAS_FSMC +u16 LCD_RD_DATA(void) +{ + vu16 ram; + ram=LCD->LCD_RAM; + return ram; +} + +void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue) +{ + LCD->LCD_REG = LCD_Reg; + LCD->LCD_RAM = LCD_RegValue; +} + +u16 LCD_ReadReg(u8 LCD_Reg) +{ + LCD_WR_REG(LCD_Reg); + Delay_us(5); + return LCD_RD_DATA(); +} + +void LCD_GPIO_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD |RCC_APB2Periph_GPIOE ,ENABLE); + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + /* 配置FSMC相对应的数据线,FSMC-D0~D15: PD 14 15 0 1 8 9 10,PE 7 8 9 10 11 12 13 14 15*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_0 | GPIO_Pin_1 + | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 + | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 + | GPIO_Pin_15 | GPIO_Pin_2; + GPIO_Init(GPIOE, &GPIO_InitStructure); + /* 配置FSMC相对应的控制线 + * PD4-FSMC_NOE :LCD-RD + * PD5-FSMC_NWE :LCD-WR + * PD7-FSMC_NE1 :LCD-CS + * PE2-FSMC_A23 :LCD-RS LCD-RS发送的数据代表是命令还是显示数据 + */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_11; + GPIO_Init(GPIOD, &GPIO_InitStructure); +} + +void LCD_FSMC_Config(void) +{ + FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; + FSMC_NORSRAMTimingInitTypeDef readWriteTiming,writeTiming; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); + + readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns + readWriteTiming.FSMC_AddressHoldTime = 0x00; + readWriteTiming.FSMC_DataSetupTime = 0x0f; + readWriteTiming.FSMC_BusTurnAroundDuration = 0x00; + readWriteTiming.FSMC_CLKDivision = 0x00; + readWriteTiming.FSMC_DataLatency = 0x00; + readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A + + writeTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK + writeTiming.FSMC_AddressHoldTime = 0x00; + writeTiming.FSMC_DataSetupTime = 0x03; ////数据保存时间为4个HCLK + writeTiming.FSMC_BusTurnAroundDuration = 0x00; + writeTiming.FSMC_CLKDivision = 0x00; + writeTiming.FSMC_DataLatency = 0x00; + writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A + + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; //选择外接存储区域的地址 + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;//配置数据线和地址线是否复用 + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;//配置外接存储器的类型 + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//设置FSMC接口的数据宽度 + + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;//配置访问模式 + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;//配置等待信号的极性 + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;//配置是否使用非对齐方式 + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;//配置等待信号什么时间产生 + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;//配置是否使用等待信号 + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;//配置是否允许突发写操作 + + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;//配置写操作使能 + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable ;//配置是否使用扩展模式 + + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;//读时序 + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序 + + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + /* 使能 FSMC Bank1_SRAM Bank */ + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); +} + +void LCD_HardwareConfig(void) +{ + LCD_GPIO_Config(); + LCD_FSMC_Config(); +} + +#else +//写寄存器函数 +//data:寄存器值 +void LCD_WR_REG(u16 data) +{ + LCD_RS_CLR;//写地址 + LCD_CS_CLR; + DATAOUT(data); + LCD_WR_CLR; + LCD_WR_SET; + LCD_CS_SET; +} + +//写数据函数 +//可以替代LCD_WR_DATAX宏,拿时间换空间. +//data:寄存器值 +void LCD_WR_DATA(u16 data) +{ + LCD_RS_SET; + LCD_CS_CLR; + DATAOUT(data); + LCD_WR_CLR; + LCD_WR_SET; + LCD_CS_SET; +} + +//读LCD数据 +//返回值:读到的值 +u16 LCD_RD_DATA(void) +{ + vu16 ram; + GPIOC->CRL = 0X88888888; //PB0-7 上拉输入 + GPIOC->CRH = 0X88888888; //PB8-15 上拉输入 + GPIOC->ODR = 0X0000; //全部输出0 + + LCD_RS_SET; + LCD_CS_CLR; + //读取数据(读寄存器时,并不需要读2次) + LCD_RD_CLR; + + ram = DATAIN(); + LCD_RD_SET; + LCD_CS_SET; + + GPIOC->CRL = 0X33333333; //PC0-7 上拉输出 + GPIOC->CRH = 0X33333333; //PC8-15 上拉输出 + GPIOC->ODR = 0XFFFF; //全部输出高 + return ram; +} + +void LCD_GPIO_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE); + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + /*D0 - D15: PC0 - PC15 */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_SetBits(GPIOC, GPIO_Pin_All); + + /* 配置控制线 + * PB6 :LCD-RD + * PB7 :LCD-WR + * PB9 :LCD-CS + * PB8 :LCD-RS LCD-RS发送的数据代表是命令还是显示数据 + */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; + GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9); +} + +void LCD_HardwareConfig(void) +{ + LCD_GPIO_Config(); +} +#endif + diff --git a/TFT/src/User/Hal/lcd.h b/TFT/src/User/Hal/stm32f10x/lcd.h similarity index 82% rename from TFT/src/User/Hal/lcd.h rename to TFT/src/User/Hal/stm32f10x/lcd.h index d37ee5386c..6dea65b886 100644 --- a/TFT/src/User/Hal/lcd.h +++ b/TFT/src/User/Hal/stm32f10x/lcd.h @@ -2,7 +2,7 @@ #define _LCD_H_ #include "stdint.h" -#include "Configuration.h" +#include "variants.h" #ifdef STM32_HAS_FSMC @@ -45,15 +45,6 @@ #endif -//TFT35 V1.0 V1.1 RM68042 8bit -//TFT35 V1.2 ili9488 16bit -//TFT28 TFT24 ili9341 16bit -#if LCD_DATA_16BIT == 1 - #define LCD_WR_16BITS_DATA(c) do{ LCD_WR_DATA(c); }while(0) -#else - #define LCD_WR_16BITS_DATA(c) do{ LCD_WR_DATA(((c)>>8)&0xFF); LCD_WR_DATA((c)&0xFF); }while(0) -#endif - // #define WHITE 0xFFFF @@ -71,7 +62,7 @@ #define BRRED 0XFC07 // #define GRAY 0X8430 // - -void LCD_Init(void); // +void LCD_HardwareConfig(void); +uint16_t LCD_RD_DATA(void); #endif diff --git a/TFT/src/User/Hal/stm32f10x/lcd_dma.c b/TFT/src/User/Hal/stm32f10x/lcd_dma.c new file mode 100644 index 0000000000..32f313ec05 --- /dev/null +++ b/TFT/src/User/Hal/stm32f10x/lcd_dma.c @@ -0,0 +1,96 @@ +#include "lcd_dma.h" +#include "variants.h" +#include "lcd.h" +#include "GUI.h" +#include "delay.h" +#include "w25qxx.h" + +#ifdef STM32_HAS_FSMC +//Config for SPI Channel +#if W25Qxx_SPI == _SPI1 + #define W25QXX_SPI_NUM SPI1 + #define W25QXX_SPI_DMA_RCC_AHB RCC_AHBPeriph_DMA1 + #define W25QXX_SPI_DMA DMA1 + #define W25QXX_SPI_DMA_CHANNEL DMA1_Channel2 + #define W25QXX_SPI_DMA_IFCR_BIT 5 +#elif W25Qxx_SPI == _SPI2 + #define W25QXX_SPI_NUM SPI2 + #define W25QXX_SPI_DMA DMA1 + #define W25QXX_SPI_DMA_RCC_AHB RCC_AHBPeriph_DMA1 + #define W25QXX_SPI_DMA_CHANNEL DMA1_Channel4 + #define W25QXX_SPI_DMA_IFCR_BIT 13 +#elif W25Qxx_SPI == _SPI3 + #define W25QXX_SPI_NUM SPI3 + #define W25QXX_SPI_DMA DMA2 + #define W25QXX_SPI_DMA_RCC_AHB RCC_AHBPeriph_DMA2 + #define W25QXX_SPI_DMA_CHANNEL DMA2_Channel1 + #define W25QXX_SPI_DMA_IFCR_BIT 1 +#endif + +//SPI --> FSMC DMA (LCD_RAM) +//16bits, SPI_RX to LCD_RAM. +void LCD_DMA_Config(void) +{ + RCC->AHBENR |= W25QXX_SPI_DMA_RCC_AHB; //开启DMA时钟 + Delay_ms(5); //等待DMA时钟稳定 + W25QXX_SPI_DMA_CHANNEL->CPAR = (u32)&W25QXX_SPI_NUM->DR; //外设地址为:SPI->DR + W25QXX_SPI_DMA_CHANNEL->CMAR = (u32)&LCD->LCD_RAM;//目标地址为LCD_RAM + W25QXX_SPI_DMA_CHANNEL->CNDTR = 0; //DMA1,传输数据量,暂时设置为0 + W25QXX_SPI_DMA_CHANNEL->CCR = 0X00000000; //复位 + W25QXX_SPI_DMA_CHANNEL->CCR |= 0<<4; //从外设读 + W25QXX_SPI_DMA_CHANNEL->CCR |= 0<<5; //普通模式 + W25QXX_SPI_DMA_CHANNEL->CCR |= 0<<6; //外设地址非增量模式 + W25QXX_SPI_DMA_CHANNEL->CCR |= 0<<7; //存储器非增量模式 + W25QXX_SPI_DMA_CHANNEL->CCR |= LCD_DATA_16BIT<<8; //外设数据宽度为16位 + W25QXX_SPI_DMA_CHANNEL->CCR |= LCD_DATA_16BIT<<10; //存储器数据宽度16位 + W25QXX_SPI_DMA_CHANNEL->CCR |= 1<<12; //中等优先级 + W25QXX_SPI_DMA_CHANNEL->CCR |= 0<<14; //非存储器到存储器模式 +} + +#define LCD_DMA_MAX_TRANS 65535 //DMA 65535 bytes one frame +// start DMA transfer from SPI->DR to FSMC +// the max bytes of one frame is LCD_DMA_MAX_TRANS 65535 +void lcd_frame_segment_display(u16 size, u32 addr) +{ + W25QXX_SPI_DMA_CHANNEL->CNDTR = size; + + W25Qxx_SPI_CS_Set(0); + W25Qxx_SPI_Read_Write_Byte(CMD_FAST_READ_DATA); + W25Qxx_SPI_Read_Write_Byte((u8)((addr)>>16)); + W25Qxx_SPI_Read_Write_Byte((u8)((addr)>>8)); + W25Qxx_SPI_Read_Write_Byte((u8)addr); + W25Qxx_SPI_Read_Write_Byte(0XFF); //8 dummy clock + + //set SPI to 16bit DMA rx only mode + W25QXX_SPI_NUM->CR1 &= ~(1<<6); + W25QXX_SPI_NUM->CR2 |= 1<<0; //enable SPI rx DMA + W25QXX_SPI_NUM->CR1 |= LCD_DATA_16BIT<<11; //16bit data frame + W25QXX_SPI_NUM->CR1 |= 1<<10; //rx only + + W25QXX_SPI_DMA_CHANNEL->CCR |= 1<<0; //enable dma channel + W25QXX_SPI_NUM->CR1 |= 1<<6; //enable SPI + + while((W25QXX_SPI_DMA->ISR&(1<CCR &= (u32)(~(1<<0)); + W25QXX_SPI_DMA->IFCR |= (u32)(1<AIRCR; + temp&=0X0000F8FF; + temp|=0X05FA0000; + temp|=temp1; + SCB->AIRCR=temp; +} +void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) +{ + u32 temp; + MY_NVIC_PriorityGroupConfig(NVIC_Group); + temp=NVIC_PreemptionPriority<<(4-NVIC_Group); + temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); + temp&=0xf; + NVIC->ISER[NVIC_Channel/32]|=(1<IP[NVIC_Channel]|=temp<<4; +} + +#ifdef SD_CD_PIN +//SD_CD insert detect +void SD_CD_WP_Init(void) +{ + GPIO_InitSet(SD_CD_PIN, MGPIO_MODE_IPU, 0); +} +#endif + +uint8_t SD_CD_Inserted(void) +{ +#ifdef SD_CD_PIN + return !GPIO_GetLevel(SD_CD_PIN); +#else + return 0; +#endif +} + + +SD_Error SD_Init(void) +{ + u8 clkdiv=0; + SD_Error errorstatus=SD_OK; + +#ifdef SD_CD_PIN + SD_CD_WP_Init(); +#endif + + RCC->APB2ENR|=1<<4; + RCC->APB2ENR|=1<<5; + RCC->AHBENR|=1<<10; + RCC->AHBENR|=1<<1; + + GPIOC->CRH&=0XFFF00000; + GPIOC->CRH|=0X000BBBBB; //PC.8~12 + + GPIOD->CRL&=0XFFFFF0FF; + GPIOD->CRL|=0X00000B00; //PD2 PD7 + //SDIO + SDIO->POWER=0x00000000; + SDIO->CLKCR=0x00000000; + SDIO->ARG=0x00000000; + SDIO->CMD=0x00000000; + SDIO->DTIMER=0x00000000; + SDIO->DLEN=0x00000000; + SDIO->DCTRL=0x00000000; + SDIO->ICR=0x00C007FF; + SDIO->MASK=0x00000000; + MY_NVIC_Init(0,0,SDIO_IRQn,2); + errorstatus=SD_PowerON(); + if(errorstatus==SD_OK) errorstatus=SD_InitializeCards(); + if(errorstatus==SD_OK) errorstatus=SD_GetCardInfo(&SDCardInfo); + if(errorstatus==SD_OK) errorstatus=SD_SelectDeselect((u32)(SDCardInfo.RCA<<16)); + if(errorstatus==SD_OK) errorstatus=SD_EnableWideBusOperation(1); + if((errorstatus==SD_OK)||(SDIO_MULTIMEDIA_CARD==CardType)) + { + if(SDCardInfo.CardType==SDIO_STD_CAPACITY_SD_CARD_V1_1||SDCardInfo.CardType==SDIO_STD_CAPACITY_SD_CARD_V2_0) + { + clkdiv=SDIO_TRANSFER_CLK_DIV+6; //V1.1/V2.0 72/12=6Mhz + }else clkdiv=SDIO_TRANSFER_CLK_DIV; //SDHC 72/6=12Mhz + SDIO_Clock_Set(clkdiv); //SDIO_CK=SDIOCLK/[clkdiv+2]; 48Mhz + //errorstatus=SD_SetDeviceMode(SD_DMA_MODE); + errorstatus=SD_SetDeviceMode(SD_POLLING_MODE); + } + return errorstatus; +} + +void SD_DeInit(void) +{ + +} + +void SDIO_Clock_Set(u8 clkdiv) +{ + u32 tmpreg=SDIO->CLKCR; + tmpreg&=0XFFFFFF00; + tmpreg|=clkdiv; + SDIO->CLKCR=tmpreg; +} + +void SDIO_Send_Cmd(u8 cmdindex,u8 waitrsp,u32 arg) +{ + u32 tmpreg; + SDIO->ARG=arg; + tmpreg=SDIO->CMD; + tmpreg&=0XFFFFF800; + tmpreg|=cmdindex&0X3F; + tmpreg|=waitrsp<<6; + tmpreg|=0<<8; + tmpreg|=1<<10; + SDIO->CMD=tmpreg; +} + +void SDIO_Send_Data_Cfg(u32 datatimeout,u32 datalen,u8 blksize,u8 dir) +{ + u32 tmpreg; + SDIO->DTIMER=datatimeout; + SDIO->DLEN=datalen&0X1FFFFFF; + tmpreg=SDIO->DCTRL; + tmpreg&=0xFFFFFF08; + tmpreg|=blksize<<4; + tmpreg|=0<<2; + tmpreg|=(dir&0X01)<<1; + tmpreg|=1<<0; + SDIO->DCTRL=tmpreg; +} + +SD_Error SD_PowerON(void) +{ + u8 i=0; + SD_Error errorstatus=SD_OK; + u32 response=0,count=0,validvoltage=0; + u32 SDType=SD_STD_CAPACITY; + + SDIO->CLKCR=0; + SDIO->CLKCR|=0<<9; + SDIO->CLKCR|=0<<10; + SDIO->CLKCR|=0<<13; + SDIO->CLKCR|=0<<14; + SDIO_Clock_Set(SDIO_INIT_CLK_DIV); + SDIO->POWER=0X03; + SDIO->CLKCR|=1<<8; + for(i=0;i<74;i++) + { + SDIO_Send_Cmd(SD_CMD_GO_IDLE_STATE,0,0); + errorstatus=CmdError(); + if(errorstatus==SD_OK)break; + } + if(errorstatus)return errorstatus; + SDIO_Send_Cmd(SDIO_SEND_IF_COND,1,SD_CHECK_PATTERN); + + errorstatus=CmdResp7Error(); + if(errorstatus==SD_OK) + { + CardType=SDIO_STD_CAPACITY_SD_CARD_V2_0; + SDType=SD_HIGH_CAPACITY; + } + SDIO_Send_Cmd(SD_CMD_APP_CMD,1,0); + errorstatus=CmdResp1Error(SD_CMD_APP_CMD); + if(errorstatus==SD_OK)//SD2.0/SD 1.1 + { + while((!validvoltage)&&(countRESP1; + validvoltage=(((response>>31)==1)?1:0); + count++; + } + if(count>=SD_MAX_VOLT_TRIAL) + { + errorstatus=SD_INVALID_VOLTRANGE; + return errorstatus; + } + if(response&=SD_HIGH_CAPACITY) + { + CardType=SDIO_HIGH_CAPACITY_SD_CARD; + } + }else//MMC锟斤拷 + { + //MMC锟斤拷,锟斤拷锟斤拷CMD1 SDIO_SEND_OP_COND,锟斤拷锟斤拷为:0x80FF8000 + while((!validvoltage)&&(countRESP1;; //锟矫碉拷锟斤拷应 + validvoltage=(((response>>31)==1)?1:0); + count++; + } + if(count>=SD_MAX_VOLT_TRIAL) + { + errorstatus=SD_INVALID_VOLTRANGE; + return errorstatus; + } + CardType=SDIO_MULTIMEDIA_CARD; + } + return(errorstatus); +} +//SD锟斤拷 Power OFF +//锟斤拷锟斤拷值:锟斤拷锟斤拷锟斤拷锟;(0,锟睫达拷锟斤拷) +SD_Error SD_PowerOFF(void) +{ + SDIO->POWER&=~(3<<0);//SDIO锟斤拷源锟截憋拷,时锟斤拷停止 + return SD_OK; +} +//锟斤拷始锟斤拷锟斤拷锟叫的匡拷,锟斤拷锟矫匡拷锟斤拷锟斤拷锟斤拷锟阶刺 +//锟斤拷锟斤拷值:锟斤拷锟斤拷锟斤拷锟 +SD_Error SD_InitializeCards(void) +{ + SD_Error errorstatus=SD_OK; + u16 rca = 0x01; + if((SDIO->POWER&0X03)==0)return SD_REQUEST_NOT_APPLICABLE;//锟斤拷锟斤拷源状态,确锟斤拷为锟较碉拷状态 + if(SDIO_SECURE_DIGITAL_IO_CARD!=CardType) //锟斤拷SECURE_DIGITAL_IO_CARD + { + SDIO_Send_Cmd(SD_CMD_ALL_SEND_CID,3,0); //锟斤拷锟斤拷CMD2,取锟斤拷CID,锟斤拷锟斤拷应 + errorstatus=CmdResp2Error(); //锟饺达拷R2锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; //锟斤拷应锟斤拷锟斤拷 + CID_Tab[0]=SDIO->RESP1; + CID_Tab[1]=SDIO->RESP2; + CID_Tab[2]=SDIO->RESP3; + CID_Tab[3]=SDIO->RESP4; + } + if((SDIO_STD_CAPACITY_SD_CARD_V1_1==CardType)||(SDIO_STD_CAPACITY_SD_CARD_V2_0==CardType)||(SDIO_SECURE_DIGITAL_IO_COMBO_CARD==CardType)||(SDIO_HIGH_CAPACITY_SD_CARD==CardType))//锟叫断匡拷锟斤拷锟斤拷 + { + SDIO_Send_Cmd(SD_CMD_SET_REL_ADDR,1,0); //锟斤拷锟斤拷CMD3,锟斤拷锟斤拷应 + errorstatus=CmdResp6Error(SD_CMD_SET_REL_ADDR,&rca);//锟饺达拷R6锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; //锟斤拷应锟斤拷锟斤拷 + } + if (SDIO_MULTIMEDIA_CARD==CardType) + { + SDIO_Send_Cmd(SD_CMD_SET_REL_ADDR,1,(u32)(rca<<16));//锟斤拷锟斤拷CMD3,锟斤拷锟斤拷应 + errorstatus=CmdResp2Error(); //锟饺达拷R2锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; //锟斤拷应锟斤拷锟斤拷 + } + if (SDIO_SECURE_DIGITAL_IO_CARD!=CardType) //锟斤拷SECURE_DIGITAL_IO_CARD + { + RCA = rca; + SDIO_Send_Cmd(SD_CMD_SEND_CSD,3,(u32)(rca<<16));//锟斤拷锟斤拷CMD9+锟斤拷RCA,取锟斤拷CSD,锟斤拷锟斤拷应 + errorstatus=CmdResp2Error(); //锟饺达拷R2锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; //锟斤拷应锟斤拷锟斤拷 + CSD_Tab[0]=SDIO->RESP1; + CSD_Tab[1]=SDIO->RESP2; + CSD_Tab[2]=SDIO->RESP3; + CSD_Tab[3]=SDIO->RESP4; + } + return SD_OK;//锟斤拷锟斤拷始锟斤拷锟缴癸拷 +} +//锟矫碉拷锟斤拷锟斤拷息 +//cardinfo:锟斤拷锟斤拷息锟芥储锟斤拷 +//锟斤拷锟斤拷值:锟斤拷锟斤拷状态 +SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo) +{ + SD_Error errorstatus=SD_OK; + u8 tmp=0; + cardinfo->CardType=(u8)CardType; //锟斤拷锟斤拷锟斤拷 + cardinfo->RCA=(u16)RCA; //锟斤拷RCA值 + tmp=(u8)((CSD_Tab[0]&0xFF000000)>>24); + cardinfo->SD_csd.CSDStruct=(tmp&0xC0)>>6; //CSD锟结构 + cardinfo->SD_csd.SysSpecVersion=(tmp&0x3C)>>2; //2.0协锟介还没锟斤拷锟斤拷锟解部锟斤拷(为锟斤拷锟斤拷),应锟斤拷锟角猴拷锟斤拷协锟介定锟斤拷锟 + cardinfo->SD_csd.Reserved1=tmp&0x03; //2锟斤拷锟斤拷锟斤拷位 + tmp=(u8)((CSD_Tab[0]&0x00FF0000)>>16); //锟斤拷1锟斤拷锟街斤拷 + cardinfo->SD_csd.TAAC=tmp; //锟斤拷锟捷讹拷时锟斤拷1 + tmp=(u8)((CSD_Tab[0]&0x0000FF00)>>8); //锟斤拷2锟斤拷锟街斤拷 + cardinfo->SD_csd.NSAC=tmp; //锟斤拷锟捷讹拷时锟斤拷2 + tmp=(u8)(CSD_Tab[0]&0x000000FF); //锟斤拷3锟斤拷锟街斤拷 + cardinfo->SD_csd.MaxBusClkFrec=tmp; //锟斤拷锟斤拷锟劫讹拷 + tmp=(u8)((CSD_Tab[1]&0xFF000000)>>24); //锟斤拷4锟斤拷锟街斤拷 + cardinfo->SD_csd.CardComdClasses=tmp<<4; //锟斤拷指锟斤拷锟斤拷锟斤拷锟轿 + tmp=(u8)((CSD_Tab[1]&0x00FF0000)>>16); //锟斤拷5锟斤拷锟街斤拷 + cardinfo->SD_csd.CardComdClasses|=(tmp&0xF0)>>4;//锟斤拷指锟斤拷锟斤拷锟斤拷锟轿 + cardinfo->SD_csd.RdBlockLen=tmp&0x0F; //锟斤拷锟斤拷取锟斤拷锟捷筹拷锟斤拷 + tmp=(u8)((CSD_Tab[1]&0x0000FF00)>>8); //锟斤拷6锟斤拷锟街斤拷 + cardinfo->SD_csd.PartBlockRead=(tmp&0x80)>>7; //锟斤拷锟斤拷锟街匡拷锟 + cardinfo->SD_csd.WrBlockMisalign=(tmp&0x40)>>6; //写锟斤拷锟轿 + cardinfo->SD_csd.RdBlockMisalign=(tmp&0x20)>>5; //锟斤拷锟斤拷锟轿 + cardinfo->SD_csd.DSRImpl=(tmp&0x10)>>4; + cardinfo->SD_csd.Reserved2=0; //锟斤拷锟斤拷 + if((CardType==SDIO_STD_CAPACITY_SD_CARD_V1_1)||(CardType==SDIO_STD_CAPACITY_SD_CARD_V2_0)||(SDIO_MULTIMEDIA_CARD==CardType))//锟斤拷准1.1/2.0锟斤拷/MMC锟斤拷 + { + cardinfo->SD_csd.DeviceSize=(tmp&0x03)<<10; //C_SIZE(12位) + tmp=(u8)(CSD_Tab[1]&0x000000FF); //锟斤拷7锟斤拷锟街斤拷 + cardinfo->SD_csd.DeviceSize|=(tmp)<<2; + tmp=(u8)((CSD_Tab[2]&0xFF000000)>>24); //锟斤拷8锟斤拷锟街斤拷 + cardinfo->SD_csd.DeviceSize|=(tmp&0xC0)>>6; + cardinfo->SD_csd.MaxRdCurrentVDDMin=(tmp&0x38)>>3; + cardinfo->SD_csd.MaxRdCurrentVDDMax=(tmp&0x07); + tmp=(u8)((CSD_Tab[2]&0x00FF0000)>>16); //锟斤拷9锟斤拷锟街斤拷 + cardinfo->SD_csd.MaxWrCurrentVDDMin=(tmp&0xE0)>>5; + cardinfo->SD_csd.MaxWrCurrentVDDMax=(tmp&0x1C)>>2; + cardinfo->SD_csd.DeviceSizeMul=(tmp&0x03)<<1;//C_SIZE_MULT + tmp=(u8)((CSD_Tab[2]&0x0000FF00)>>8); //锟斤拷10锟斤拷锟街斤拷 + cardinfo->SD_csd.DeviceSizeMul|=(tmp&0x80)>>7; + cardinfo->CardCapacity=(cardinfo->SD_csd.DeviceSize+1);//锟斤拷锟姐卡锟斤拷锟斤拷 + cardinfo->CardCapacity*=(1<<(cardinfo->SD_csd.DeviceSizeMul+2)); + cardinfo->CardBlockSize=1<<(cardinfo->SD_csd.RdBlockLen);//锟斤拷锟叫 + cardinfo->CardCapacity*=cardinfo->CardBlockSize; + }else if(CardType==SDIO_HIGH_CAPACITY_SD_CARD) //锟斤拷锟斤拷锟斤拷锟斤拷 + { + tmp=(u8)(CSD_Tab[1]&0x000000FF); //锟斤拷7锟斤拷锟街斤拷 + cardinfo->SD_csd.DeviceSize=(tmp&0x3F)<<16;//C_SIZE + tmp=(u8)((CSD_Tab[2]&0xFF000000)>>24); //锟斤拷8锟斤拷锟街斤拷 + cardinfo->SD_csd.DeviceSize|=(tmp<<8); + tmp=(u8)((CSD_Tab[2]&0x00FF0000)>>16); //锟斤拷9锟斤拷锟街斤拷 + cardinfo->SD_csd.DeviceSize|=(tmp); + tmp=(u8)((CSD_Tab[2]&0x0000FF00)>>8); //锟斤拷10锟斤拷锟街斤拷 + cardinfo->CardCapacity=(long long)(cardinfo->SD_csd.DeviceSize+1)*512*1024;//锟斤拷锟姐卡锟斤拷锟斤拷 + cardinfo->CardBlockSize=512; //锟斤拷锟叫★拷潭锟轿512锟街斤拷 + } + cardinfo->SD_csd.EraseGrSize=(tmp&0x40)>>6; + cardinfo->SD_csd.EraseGrMul=(tmp&0x3F)<<1; + tmp=(u8)(CSD_Tab[2]&0x000000FF); //锟斤拷11锟斤拷锟街斤拷 + cardinfo->SD_csd.EraseGrMul|=(tmp&0x80)>>7; + cardinfo->SD_csd.WrProtectGrSize=(tmp&0x7F); + tmp=(u8)((CSD_Tab[3]&0xFF000000)>>24); //锟斤拷12锟斤拷锟街斤拷 + cardinfo->SD_csd.WrProtectGrEnable=(tmp&0x80)>>7; + cardinfo->SD_csd.ManDeflECC=(tmp&0x60)>>5; + cardinfo->SD_csd.WrSpeedFact=(tmp&0x1C)>>2; + cardinfo->SD_csd.MaxWrBlockLen=(tmp&0x03)<<2; + tmp=(u8)((CSD_Tab[3]&0x00FF0000)>>16); //锟斤拷13锟斤拷锟街斤拷 + cardinfo->SD_csd.MaxWrBlockLen|=(tmp&0xC0)>>6; + cardinfo->SD_csd.WriteBlockPaPartial=(tmp&0x20)>>5; + cardinfo->SD_csd.Reserved3=0; + cardinfo->SD_csd.ContentProtectAppli=(tmp&0x01); + tmp=(u8)((CSD_Tab[3]&0x0000FF00)>>8); //锟斤拷14锟斤拷锟街斤拷 + cardinfo->SD_csd.FileFormatGrouop=(tmp&0x80)>>7; + cardinfo->SD_csd.CopyFlag=(tmp&0x40)>>6; + cardinfo->SD_csd.PermWrProtect=(tmp&0x20)>>5; + cardinfo->SD_csd.TempWrProtect=(tmp&0x10)>>4; + cardinfo->SD_csd.FileFormat=(tmp&0x0C)>>2; + cardinfo->SD_csd.ECC=(tmp&0x03); + tmp=(u8)(CSD_Tab[3]&0x000000FF); //锟斤拷15锟斤拷锟街斤拷 + cardinfo->SD_csd.CSD_CRC=(tmp&0xFE)>>1; + cardinfo->SD_csd.Reserved4=1; + tmp=(u8)((CID_Tab[0]&0xFF000000)>>24); //锟斤拷0锟斤拷锟街斤拷 + cardinfo->SD_cid.ManufacturerID=tmp; + tmp=(u8)((CID_Tab[0]&0x00FF0000)>>16); //锟斤拷1锟斤拷锟街斤拷 + cardinfo->SD_cid.OEM_AppliID=tmp<<8; + tmp=(u8)((CID_Tab[0]&0x000000FF00)>>8); //锟斤拷2锟斤拷锟街斤拷 + cardinfo->SD_cid.OEM_AppliID|=tmp; + tmp=(u8)(CID_Tab[0]&0x000000FF); //锟斤拷3锟斤拷锟街斤拷 + cardinfo->SD_cid.ProdName1=tmp<<24; + tmp=(u8)((CID_Tab[1]&0xFF000000)>>24); //锟斤拷4锟斤拷锟街斤拷 + cardinfo->SD_cid.ProdName1|=tmp<<16; + tmp=(u8)((CID_Tab[1]&0x00FF0000)>>16); //锟斤拷5锟斤拷锟街斤拷 + cardinfo->SD_cid.ProdName1|=tmp<<8; + tmp=(u8)((CID_Tab[1]&0x0000FF00)>>8); //锟斤拷6锟斤拷锟街斤拷 + cardinfo->SD_cid.ProdName1|=tmp; + tmp=(u8)(CID_Tab[1]&0x000000FF); //锟斤拷7锟斤拷锟街斤拷 + cardinfo->SD_cid.ProdName2=tmp; + tmp=(u8)((CID_Tab[2]&0xFF000000)>>24); //锟斤拷8锟斤拷锟街斤拷 + cardinfo->SD_cid.ProdRev=tmp; + tmp=(u8)((CID_Tab[2]&0x00FF0000)>>16); //锟斤拷9锟斤拷锟街斤拷 + cardinfo->SD_cid.ProdSN=tmp<<24; + tmp=(u8)((CID_Tab[2]&0x0000FF00)>>8); //锟斤拷10锟斤拷锟街斤拷 + cardinfo->SD_cid.ProdSN|=tmp<<16; + tmp=(u8)(CID_Tab[2]&0x000000FF); //锟斤拷11锟斤拷锟街斤拷 + cardinfo->SD_cid.ProdSN|=tmp<<8; + tmp=(u8)((CID_Tab[3]&0xFF000000)>>24); //锟斤拷12锟斤拷锟街斤拷 + cardinfo->SD_cid.ProdSN|=tmp; + tmp=(u8)((CID_Tab[3]&0x00FF0000)>>16); //锟斤拷13锟斤拷锟街斤拷 + cardinfo->SD_cid.Reserved1|=(tmp&0xF0)>>4; + cardinfo->SD_cid.ManufactDate=(tmp&0x0F)<<8; + tmp=(u8)((CID_Tab[3]&0x0000FF00)>>8); //锟斤拷14锟斤拷锟街斤拷 + cardinfo->SD_cid.ManufactDate|=tmp; + tmp=(u8)(CID_Tab[3]&0x000000FF); //锟斤拷15锟斤拷锟街斤拷 + cardinfo->SD_cid.CID_CRC=(tmp&0xFE)>>1; + cardinfo->SD_cid.Reserved2=1; + return errorstatus; +} +//锟斤拷锟斤拷SDIO锟斤拷锟竭匡拷锟斤拷(MMC锟斤拷锟斤拷支锟斤拷4bit模式) +//wmode:位锟斤拷模式.0,1位锟斤拷锟捷匡拷锟斤拷;1,4位锟斤拷锟捷匡拷锟斤拷;2,8位锟斤拷锟捷匡拷锟斤拷 +//锟斤拷锟斤拷值:SD锟斤拷锟斤拷锟斤拷状态 +SD_Error SD_EnableWideBusOperation(u32 wmode) +{ + SD_Error errorstatus=SD_OK; + if(SDIO_MULTIMEDIA_CARD==CardType)return SD_UNSUPPORTED_FEATURE;//MMC锟斤拷锟斤拷支锟斤拷 + else if((SDIO_STD_CAPACITY_SD_CARD_V1_1==CardType)||(SDIO_STD_CAPACITY_SD_CARD_V2_0==CardType)||(SDIO_HIGH_CAPACITY_SD_CARD==CardType)) + { + if(wmode>=2)return SD_UNSUPPORTED_FEATURE;//锟斤拷支锟斤拷8位模式 + else + { + errorstatus=SDEnWideBus(wmode); + if(SD_OK==errorstatus) + { + SDIO->CLKCR&=~(3<<11); //锟斤拷锟街帮拷锟轿伙拷锟斤拷锟斤拷锟 + SDIO->CLKCR|=(u16)wmode<<11;//1位/4位锟斤拷锟竭匡拷锟斤拷 + SDIO->CLKCR|=0<<14; //锟斤拷锟斤拷锟斤拷硬锟斤拷锟斤拷锟斤拷锟斤拷 + } + } + } + return errorstatus; +} +//锟斤拷锟斤拷SD锟斤拷锟斤拷锟斤拷模式 +//Mode: +//锟斤拷锟斤拷值:锟斤拷锟斤拷状态 +SD_Error SD_SetDeviceMode(u32 Mode) +{ + SD_Error errorstatus = SD_OK; + if((Mode==SD_DMA_MODE)||(Mode==SD_POLLING_MODE))DeviceMode=Mode; + else errorstatus=SD_INVALID_PARAMETER; + return errorstatus; +} +//选锟斤拷 +//锟斤拷锟斤拷CMD7,选锟斤拷锟斤拷缘锟街(rca)为addr锟侥匡拷,取锟斤拷锟斤拷锟斤拷锟斤拷.锟斤拷锟轿0,锟津都诧拷选锟斤拷. +//addr:锟斤拷锟斤拷RCA锟斤拷址 +SD_Error SD_SelectDeselect(u32 addr) +{ + SDIO_Send_Cmd(SD_CMD_SEL_DESEL_CARD,1,addr); //锟斤拷锟斤拷CMD7,选锟斤拷,锟斤拷锟斤拷应 + return CmdResp1Error(SD_CMD_SEL_DESEL_CARD); +} +//SD锟斤拷锟斤拷取一锟斤拷锟斤拷 +//buf:锟斤拷锟斤拷锟捷伙拷锟斤拷锟斤拷(锟斤拷锟斤拷4锟街节讹拷锟斤拷!!) +//addr:锟斤拷取锟斤拷址 +//blksize:锟斤拷锟叫 +SD_Error SD_ReadBlock(u8 *buf,long long addr,u16 blksize) +{ + SD_Error errorstatus=SD_OK; + u8 power; + u32 count=0,*tempbuff=(u32*)buf;//转锟斤拷为u32指锟斤拷 + u32 timeout=SDIO_DATATIMEOUT; + if(NULL==buf) return SD_INVALID_PARAMETER; + SDIO->DCTRL=0x0; //锟斤拷锟捷匡拷锟狡寄达拷锟斤拷锟斤拷锟斤拷(锟斤拷DMA) + if(CardType==SDIO_HIGH_CAPACITY_SD_CARD)//锟斤拷锟斤拷锟斤拷锟斤拷 + { + blksize=512; + addr>>=9; + } + SDIO_Send_Data_Cfg(SD_DATATIMEOUT,0,0,0); //锟斤拷锟紻PSM状态锟斤拷锟斤拷锟斤拷 + if(SDIO->RESP1&SD_CARD_LOCKED)return SD_LOCK_UNLOCK_FAILED;//锟斤拷锟斤拷锟斤拷 + if((blksize>0)&&(blksize<=2048)&&((blksize&(blksize-1))==0)) + { + power=convert_from_bytes_to_power_of_two(blksize); + SDIO_Send_Cmd(SD_CMD_SET_BLOCKLEN,1,blksize); //锟斤拷锟斤拷CMD16+锟斤拷锟斤拷锟斤拷锟捷筹拷锟斤拷为blksize,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_SET_BLOCKLEN); //锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; //锟斤拷应锟斤拷锟斤拷 + }else return SD_INVALID_PARAMETER; + SDIO_Send_Data_Cfg(SD_DATATIMEOUT,blksize,power,1); //blksize,锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 + SDIO_Send_Cmd(SD_CMD_READ_SINGLE_BLOCK,1,addr); //锟斤拷锟斤拷CMD17+锟斤拷addr锟斤拷址锟斤拷锟斤拷取锟斤拷锟斤拷,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_READ_SINGLE_BLOCK);//锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; //锟斤拷应锟斤拷锟斤拷 + if(DeviceMode==SD_POLLING_MODE) //锟斤拷询模式,锟斤拷询锟斤拷锟斤拷 + { + INTX_DISABLE();//锟截憋拷锟斤拷锟叫讹拷(POLLING模式,锟较斤拷锟叫断达拷锟絊DIO锟斤拷写锟斤拷锟斤拷!!!) + while(!(SDIO->STA&((1<<5)|(1<<1)|(1<<3)|(1<<10)|(1<<9))))//锟斤拷锟斤拷锟斤拷/CRC/锟斤拷时/锟斤拷锟(锟斤拷志)/锟斤拷始位锟斤拷锟斤拷 + { + if(SDIO->STA&(1<<15)) //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷,锟斤拷示锟斤拷锟劫达拷锟斤拷8锟斤拷锟斤拷 + { + for(count=0;count<8;count++) //循锟斤拷锟斤拷取锟斤拷锟斤拷 + { + *(tempbuff+count)=SDIO->FIFO; + } + tempbuff+=8; + timeout=0X7FFFFF; //锟斤拷锟斤拷锟斤拷锟斤拷锟绞憋拷锟 + }else //锟斤拷锟斤拷锟斤拷时 + { + if(timeout==0)return SD_DATA_TIMEOUT; + timeout--; + } + } + if(SDIO->STA&(1<<3)) //锟斤拷锟捷筹拷时锟斤拷锟斤拷 + { + SDIO->ICR|=1<<3; //锟斤拷锟斤拷锟斤拷志 + return SD_DATA_TIMEOUT; + }else if(SDIO->STA&(1<<1)) //锟斤拷锟捷匡拷CRC锟斤拷锟斤拷 + { + SDIO->ICR|=1<<1; //锟斤拷锟斤拷锟斤拷志 + return SD_DATA_CRC_FAIL; + }else if(SDIO->STA&(1<<5)) //锟斤拷锟斤拷fifo锟斤拷锟斤拷锟斤拷锟 + { + SDIO->ICR|=1<<5; //锟斤拷锟斤拷锟斤拷志 + return SD_RX_OVERRUN; + }else if(SDIO->STA&(1<<9)) //锟斤拷锟斤拷锟斤拷始位锟斤拷锟斤拷 + { + SDIO->ICR|=1<<9; //锟斤拷锟斤拷锟斤拷志 + return SD_START_BIT_ERR; + } + while(SDIO->STA&(1<<21)) //FIFO锟斤拷锟斤拷,锟斤拷锟斤拷锟节匡拷锟斤拷锟斤拷锟斤拷 + { + *tempbuff=SDIO->FIFO; //循锟斤拷锟斤拷取锟斤拷锟斤拷 + tempbuff++; + } + INTX_ENABLE();//锟斤拷锟斤拷锟斤拷锟叫讹拷 + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷斜锟斤拷 + }else if(DeviceMode==SD_DMA_MODE) + { + SD_DMA_Config((u32*)buf,blksize,0); + TransferError=SD_OK; + StopCondition=0; //锟斤拷锟斤拷锟,锟斤拷锟斤拷要锟斤拷锟斤拷停止锟斤拷锟斤拷指锟斤拷 + TransferEnd=0; //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟轿伙拷锟斤拷锟斤拷卸戏锟斤拷锟斤拷锟1 + SDIO->MASK|=(1<<1)|(1<<3)|(1<<8)|(1<<5)|(1<<9); //锟斤拷锟斤拷锟斤拷要锟斤拷锟叫讹拷 + SDIO->DCTRL|=1<<3; //SDIO DMA使锟斤拷 + while(((DMA2->ISR&0X2000)==RESET)&&(TransferEnd==0)&&(TransferError==SD_OK)&&timeout)timeout--;//锟饺达拷锟斤拷锟斤拷锟斤拷锟 + if(timeout==0)return SD_DATA_TIMEOUT;//锟斤拷时 + if(TransferError!=SD_OK)errorstatus=TransferError; + } + return errorstatus; +} + +u32 *tempbuff; +SD_Error SD_ReadMultiBlocks(u8 *buf,long long addr,u16 blksize,u32 nblks) +{ + SD_Error errorstatus=SD_OK; + u8 power; + u32 count=0; + u32 timeout=SDIO_DATATIMEOUT; + tempbuff=(u32*)buf;//转锟斤拷为u32指锟斤拷 + + SDIO->DCTRL=0x0; //锟斤拷锟捷匡拷锟狡寄达拷锟斤拷锟斤拷锟斤拷(锟斤拷DMA) + if(CardType==SDIO_HIGH_CAPACITY_SD_CARD)//锟斤拷锟斤拷锟斤拷锟斤拷 + { + blksize=512; + addr>>=9; + } + SDIO_Send_Data_Cfg(SD_DATATIMEOUT,0,0,0); //锟斤拷锟紻PSM状态锟斤拷锟斤拷锟斤拷 + if(SDIO->RESP1&SD_CARD_LOCKED)return SD_LOCK_UNLOCK_FAILED;//锟斤拷锟斤拷锟斤拷 + if((blksize>0)&&(blksize<=2048)&&((blksize&(blksize-1))==0)) + { + power=convert_from_bytes_to_power_of_two(blksize); + SDIO_Send_Cmd(SD_CMD_SET_BLOCKLEN,1,blksize); //锟斤拷锟斤拷CMD16+锟斤拷锟斤拷锟斤拷锟捷筹拷锟斤拷为blksize,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_SET_BLOCKLEN); //锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; //锟斤拷应锟斤拷锟斤拷 + }else return SD_INVALID_PARAMETER; + if(nblks>1) //锟斤拷锟斤拷 + { + if(nblks*blksize>SD_MAX_DATA_LENGTH) return SD_INVALID_PARAMETER;//锟叫讹拷锟角否超癸拷锟斤拷锟斤拷锟秸筹拷锟斤拷 + SDIO_Send_Data_Cfg(SD_DATATIMEOUT,nblks*blksize,power,1);//nblks*blksize,512锟斤拷锟叫,锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 + SDIO_Send_Cmd(SD_CMD_READ_MULT_BLOCK,1,addr); //锟斤拷锟斤拷CMD18+锟斤拷addr锟斤拷址锟斤拷锟斤拷取锟斤拷锟斤拷,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_READ_MULT_BLOCK);//锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; //锟斤拷应锟斤拷锟斤拷 + if(DeviceMode==SD_POLLING_MODE) + { + INTX_DISABLE();//锟截憋拷锟斤拷锟叫讹拷(POLLING模式,锟较斤拷锟叫断达拷锟絊DIO锟斤拷写锟斤拷锟斤拷!!!) + while(!(SDIO->STA&((1<<5)|(1<<1)|(1<<3)|(1<<8)|(1<<9))))//锟斤拷锟斤拷锟斤拷/CRC/锟斤拷时/锟斤拷锟(锟斤拷志)/锟斤拷始位锟斤拷锟斤拷 + { + if(SDIO->STA&(1<<15)) //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷,锟斤拷示锟斤拷锟劫达拷锟斤拷8锟斤拷锟斤拷 + { + for(count=0;count<8;count++) //循锟斤拷锟斤拷取锟斤拷锟斤拷 + { + *(tempbuff+count)=SDIO->FIFO; + } + tempbuff+=8; + timeout=0X7FFFFF; //锟斤拷锟斤拷锟斤拷锟斤拷锟绞憋拷锟 + }else //锟斤拷锟斤拷锟斤拷时 + { + if(timeout==0)return SD_DATA_TIMEOUT; + timeout--; + } + } + if(SDIO->STA&(1<<3)) //锟斤拷锟捷筹拷时锟斤拷锟斤拷 + { + SDIO->ICR|=1<<3; //锟斤拷锟斤拷锟斤拷志 + return SD_DATA_TIMEOUT; + }else if(SDIO->STA&(1<<1)) //锟斤拷锟捷匡拷CRC锟斤拷锟斤拷 + { + SDIO->ICR|=1<<1; //锟斤拷锟斤拷锟斤拷志 + return SD_DATA_CRC_FAIL; + }else if(SDIO->STA&(1<<5)) //锟斤拷锟斤拷fifo锟斤拷锟斤拷锟斤拷锟 + { + SDIO->ICR|=1<<5; //锟斤拷锟斤拷锟斤拷志 + return SD_RX_OVERRUN; + }else if(SDIO->STA&(1<<9)) //锟斤拷锟斤拷锟斤拷始位锟斤拷锟斤拷 + { + SDIO->ICR|=1<<9; //锟斤拷锟斤拷锟斤拷志 + return SD_START_BIT_ERR; + } + while(SDIO->STA&(1<<21)) //FIFO锟斤拷锟斤拷,锟斤拷锟斤拷锟节匡拷锟斤拷锟斤拷锟斤拷 + { + *tempbuff=SDIO->FIFO; //循锟斤拷锟斤拷取锟斤拷锟斤拷 + tempbuff++; + } + if(SDIO->STA&(1<<8)) //锟斤拷锟秸斤拷锟斤拷 + { + if((SDIO_STD_CAPACITY_SD_CARD_V1_1==CardType)||(SDIO_STD_CAPACITY_SD_CARD_V2_0==CardType)||(SDIO_HIGH_CAPACITY_SD_CARD==CardType)) + { + SDIO_Send_Cmd(SD_CMD_STOP_TRANSMISSION,1,0); //锟斤拷锟斤拷CMD12+锟斤拷锟斤拷锟斤拷锟斤拷 + errorstatus=CmdResp1Error(SD_CMD_STOP_TRANSMISSION);//锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; + } + } + INTX_ENABLE();//锟斤拷锟斤拷锟斤拷锟叫讹拷 + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷斜锟斤拷 + }else if(DeviceMode==SD_DMA_MODE) + { + SD_DMA_Config((u32*)buf,nblks*blksize,0); + TransferError=SD_OK; + StopCondition=1; //锟斤拷锟斤拷,锟斤拷要锟斤拷锟斤拷停止锟斤拷锟斤拷指锟斤拷 + TransferEnd=0; //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟轿伙拷锟斤拷锟斤拷卸戏锟斤拷锟斤拷锟1 + SDIO->MASK|=(1<<1)|(1<<3)|(1<<8)|(1<<5)|(1<<9); //锟斤拷锟斤拷锟斤拷要锟斤拷锟叫讹拷 + SDIO->DCTRL|=1<<3; //SDIO DMA使锟斤拷 + while(((DMA2->ISR&0X2000)==RESET)&&timeout)timeout--;//锟饺达拷锟斤拷锟斤拷锟斤拷锟 + if(timeout==0)return SD_DATA_TIMEOUT;//锟斤拷时 + while((TransferEnd==0)&&(TransferError==SD_OK)); + if(TransferError!=SD_OK)errorstatus=TransferError; + } + } + return errorstatus; +} +//SD锟斤拷写1锟斤拷锟斤拷 +//buf:锟斤拷锟捷伙拷锟斤拷锟斤拷 +//addr:写锟斤拷址 +//blksize:锟斤拷锟叫 +//锟斤拷锟斤拷值:锟斤拷锟斤拷状态 +SD_Error SD_WriteBlock(u8 *buf,long long addr, u16 blksize) +{ + SD_Error errorstatus = SD_OK; + u8 power=0,cardstate=0; + u32 timeout=0,bytestransferred=0; + u32 cardstatus=0,count=0,restwords=0; + u32 tlen=blksize; //锟杰筹拷锟斤拷(锟街斤拷) + u32*tempbuff=(u32*)buf; + if(buf==NULL)return SD_INVALID_PARAMETER;//锟斤拷锟斤拷锟斤拷锟斤拷 + SDIO->DCTRL=0x0; //锟斤拷锟捷匡拷锟狡寄达拷锟斤拷锟斤拷锟斤拷(锟斤拷DMA) + SDIO_Send_Data_Cfg(SD_DATATIMEOUT,0,0,0); //锟斤拷锟紻PSM状态锟斤拷锟斤拷锟斤拷 + if(SDIO->RESP1&SD_CARD_LOCKED)return SD_LOCK_UNLOCK_FAILED;//锟斤拷锟斤拷锟斤拷 + if(CardType==SDIO_HIGH_CAPACITY_SD_CARD) //锟斤拷锟斤拷锟斤拷锟斤拷 + { + blksize=512; + addr>>=9; + } + if((blksize>0)&&(blksize<=2048)&&((blksize&(blksize-1))==0)) + { + power=convert_from_bytes_to_power_of_two(blksize); + SDIO_Send_Cmd(SD_CMD_SET_BLOCKLEN,1,blksize); //锟斤拷锟斤拷CMD16+锟斤拷锟斤拷锟斤拷锟捷筹拷锟斤拷为blksize,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_SET_BLOCKLEN); //锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; //锟斤拷应锟斤拷锟斤拷 + }else return SD_INVALID_PARAMETER; + SDIO_Send_Cmd(SD_CMD_SEND_STATUS,1,(u32)RCA<<16); //锟斤拷锟斤拷CMD13,锟斤拷询锟斤拷锟斤拷状态,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_SEND_STATUS); //锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; + cardstatus=SDIO->RESP1; + timeout=SD_DATATIMEOUT; + while(((cardstatus&0x00000100)==0)&&(timeout>0)) //锟斤拷锟絉EADY_FOR_DATA位锟角凤拷锟斤拷位 + { + timeout--; + SDIO_Send_Cmd(SD_CMD_SEND_STATUS,1,(u32)RCA<<16);//锟斤拷锟斤拷CMD13,锟斤拷询锟斤拷锟斤拷状态,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_SEND_STATUS); //锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; + cardstatus=SDIO->RESP1; + } + if(timeout==0)return SD_ERROR; + SDIO_Send_Cmd(SD_CMD_WRITE_SINGLE_BLOCK,1,addr); //锟斤拷锟斤拷CMD24,写锟斤拷锟斤拷指锟斤拷,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_WRITE_SINGLE_BLOCK);//锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; + StopCondition=0; //锟斤拷锟斤拷写,锟斤拷锟斤拷要锟斤拷锟斤拷停止锟斤拷锟斤拷指锟斤拷 + SDIO_Send_Data_Cfg(SD_DATATIMEOUT,blksize,power,0); //blksize, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 + timeout=SDIO_DATATIMEOUT; + if (DeviceMode == SD_POLLING_MODE) + { + INTX_DISABLE();//锟截憋拷锟斤拷锟叫讹拷(POLLING模式,锟较斤拷锟叫断达拷锟絊DIO锟斤拷写锟斤拷锟斤拷!!!) + while(!(SDIO->STA&((1<<10)|(1<<4)|(1<<1)|(1<<3)|(1<<9))))//锟斤拷锟捷块发锟酵成癸拷/锟斤拷锟斤拷/CRC/锟斤拷时/锟斤拷始位锟斤拷锟斤拷 + { + if(SDIO->STA&(1<<14)) //锟斤拷锟斤拷锟斤拷锟斤拷锟,锟斤拷示锟斤拷锟劫达拷锟斤拷8锟斤拷锟斤拷 + { + if((tlen-bytestransferred)FIFO=*tempbuff; + } + }else + { + for(count=0;count<8;count++) + { + SDIO->FIFO=*(tempbuff+count); + } + tempbuff+=8; + bytestransferred+=32; + } + timeout=0X3FFFFFFF; //写锟斤拷锟斤拷锟斤拷锟绞憋拷锟 + }else + { + if(timeout==0)return SD_DATA_TIMEOUT; + timeout--; + } + } + if(SDIO->STA&(1<<3)) //锟斤拷锟捷筹拷时锟斤拷锟斤拷 + { + SDIO->ICR|=1<<3; //锟斤拷锟斤拷锟斤拷志 + return SD_DATA_TIMEOUT; + }else if(SDIO->STA&(1<<1)) //锟斤拷锟捷匡拷CRC锟斤拷锟斤拷 + { + SDIO->ICR|=1<<1; //锟斤拷锟斤拷锟斤拷志 + return SD_DATA_CRC_FAIL; + }else if(SDIO->STA&(1<<4)) //锟斤拷锟斤拷fifo锟斤拷锟斤拷锟斤拷锟 + { + SDIO->ICR|=1<<4; //锟斤拷锟斤拷锟斤拷志 + return SD_TX_UNDERRUN; + }else if(SDIO->STA&(1<<9)) //锟斤拷锟斤拷锟斤拷始位锟斤拷锟斤拷 + { + SDIO->ICR|=1<<9; //锟斤拷锟斤拷锟斤拷志 + return SD_START_BIT_ERR; + } + INTX_ENABLE();//锟斤拷锟斤拷锟斤拷锟叫讹拷 + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷斜锟斤拷 + }else if(DeviceMode==SD_DMA_MODE) + { + SD_DMA_Config((u32*)buf,blksize,1);//SDIO DMA锟斤拷锟斤拷 + TransferError=SD_OK; + StopCondition=0; //锟斤拷锟斤拷写,锟斤拷锟斤拷要锟斤拷锟斤拷停止锟斤拷锟斤拷指锟斤拷 + TransferEnd=0; //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟轿伙拷锟斤拷锟斤拷卸戏锟斤拷锟斤拷锟1 + SDIO->MASK|=(1<<1)|(1<<3)|(1<<8)|(1<<4)|(1<<9); //锟斤拷锟矫诧拷锟斤拷锟斤拷锟捷斤拷锟斤拷锟斤拷锟斤拷卸锟 + SDIO->DCTRL|=1<<3; //SDIO DMA使锟斤拷. + while(((DMA2->ISR&0X2000)==RESET)&&timeout)timeout--;//锟饺达拷锟斤拷锟斤拷锟斤拷锟 + if(timeout==0) + { + SD_Init(); //锟斤拷锟铰筹拷始锟斤拷SD锟斤拷,锟斤拷锟皆斤拷锟叫达拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟 + return SD_DATA_TIMEOUT; //锟斤拷时 + } + timeout=SDIO_DATATIMEOUT; + while((TransferEnd==0)&&(TransferError==SD_OK)&&timeout)timeout--; + if(timeout==0)return SD_DATA_TIMEOUT; //锟斤拷时 + if(TransferError!=SD_OK)return TransferError; + } + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷斜锟斤拷 + errorstatus=IsCardProgramming(&cardstate); + while((errorstatus==SD_OK)&&((cardstate==SD_CARD_PROGRAMMING)||(cardstate==SD_CARD_RECEIVING))) + { + errorstatus=IsCardProgramming(&cardstate); + } + return errorstatus; +} +//SD锟斤拷写锟斤拷锟斤拷锟 +//buf:锟斤拷锟捷伙拷锟斤拷锟斤拷 +//addr:写锟斤拷址 +//blksize:锟斤拷锟叫 +//nblks:要写锟斤拷目锟斤拷锟 +//锟斤拷锟斤拷值:锟斤拷锟斤拷状态 +SD_Error SD_WriteMultiBlocks(u8 *buf,long long addr,u16 blksize,u32 nblks) +{ + SD_Error errorstatus = SD_OK; + u8 power = 0, cardstate = 0; + u32 timeout=0,bytestransferred=0; + u32 count = 0, restwords = 0; + u32 tlen=nblks*blksize; //锟杰筹拷锟斤拷(锟街斤拷) + u32 *tempbuff = (u32*)buf; + if(buf==NULL)return SD_INVALID_PARAMETER; //锟斤拷锟斤拷锟斤拷锟斤拷 + SDIO->DCTRL=0x0; //锟斤拷锟捷匡拷锟狡寄达拷锟斤拷锟斤拷锟斤拷(锟斤拷DMA) + SDIO_Send_Data_Cfg(SD_DATATIMEOUT,0,0,0); //锟斤拷锟紻PSM状态锟斤拷锟斤拷锟斤拷 + if(SDIO->RESP1&SD_CARD_LOCKED)return SD_LOCK_UNLOCK_FAILED;//锟斤拷锟斤拷锟斤拷 + if(CardType==SDIO_HIGH_CAPACITY_SD_CARD)//锟斤拷锟斤拷锟斤拷锟斤拷 + { + blksize=512; + addr>>=9; + } + if((blksize>0)&&(blksize<=2048)&&((blksize&(blksize-1))==0)) + { + power=convert_from_bytes_to_power_of_two(blksize); + SDIO_Send_Cmd(SD_CMD_SET_BLOCKLEN,1,blksize); //锟斤拷锟斤拷CMD16+锟斤拷锟斤拷锟斤拷锟捷筹拷锟斤拷为blksize,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_SET_BLOCKLEN); //锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; //锟斤拷应锟斤拷锟斤拷 + }else return SD_INVALID_PARAMETER; + if(nblks>1) + { + if(nblks*blksize>SD_MAX_DATA_LENGTH)return SD_INVALID_PARAMETER; + if((SDIO_STD_CAPACITY_SD_CARD_V1_1==CardType)||(SDIO_STD_CAPACITY_SD_CARD_V2_0==CardType)||(SDIO_HIGH_CAPACITY_SD_CARD==CardType)) + { + //锟斤拷锟斤拷锟斤拷锟 + SDIO_Send_Cmd(SD_CMD_APP_CMD,1,(u32)RCA<<16); //锟斤拷锟斤拷ACMD55,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_APP_CMD); //锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; + SDIO_Send_Cmd(SD_CMD_SET_BLOCK_COUNT,1,nblks); //锟斤拷锟斤拷CMD23,锟斤拷锟矫匡拷锟斤拷锟斤拷,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_SET_BLOCK_COUNT);//锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; + } + SDIO_Send_Cmd(SD_CMD_WRITE_MULT_BLOCK,1,addr); //锟斤拷锟斤拷CMD25,锟斤拷锟叫粗革拷锟,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_WRITE_MULT_BLOCK); //锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; + SDIO_Send_Data_Cfg(SD_DATATIMEOUT,nblks*blksize,power,0);//blksize, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 + if(DeviceMode==SD_POLLING_MODE) + { + timeout=SDIO_DATATIMEOUT; + INTX_DISABLE();//锟截憋拷锟斤拷锟叫讹拷(POLLING模式,锟较斤拷锟叫断达拷锟絊DIO锟斤拷写锟斤拷锟斤拷!!!) + while(!(SDIO->STA&((1<<4)|(1<<1)|(1<<8)|(1<<3)|(1<<9))))//锟斤拷锟斤拷/CRC/锟斤拷锟捷斤拷锟斤拷/锟斤拷时/锟斤拷始位锟斤拷锟斤拷 + { + if(SDIO->STA&(1<<14)) //锟斤拷锟斤拷锟斤拷锟斤拷锟,锟斤拷示锟斤拷锟劫达拷锟斤拷8锟斤拷(32锟街斤拷) + { + if((tlen-bytestransferred)FIFO=*tempbuff; + } + }else //锟斤拷锟斤拷锟斤拷锟斤拷锟,锟斤拷锟皆凤拷锟斤拷锟斤拷锟斤拷8锟斤拷(32锟街斤拷)锟斤拷锟斤拷 + { + for(count=0;countFIFO=*(tempbuff+count); + } + tempbuff+=SD_HALFFIFO; + bytestransferred+=SD_HALFFIFOBYTES; + } + timeout=0X3FFFFFFF; //写锟斤拷锟斤拷锟斤拷锟绞憋拷锟 + }else + { + if(timeout==0)return SD_DATA_TIMEOUT; + timeout--; + } + } + if(SDIO->STA&(1<<3)) //锟斤拷锟捷筹拷时锟斤拷锟斤拷 + { + SDIO->ICR|=1<<3; //锟斤拷锟斤拷锟斤拷志 + return SD_DATA_TIMEOUT; + }else if(SDIO->STA&(1<<1)) //锟斤拷锟捷匡拷CRC锟斤拷锟斤拷 + { + SDIO->ICR|=1<<1; //锟斤拷锟斤拷锟斤拷志 + return SD_DATA_CRC_FAIL; + }else if(SDIO->STA&(1<<4)) //锟斤拷锟斤拷fifo锟斤拷锟斤拷锟斤拷锟 + { + SDIO->ICR|=1<<4; //锟斤拷锟斤拷锟斤拷志 + return SD_TX_UNDERRUN; + }else if(SDIO->STA&(1<<9)) //锟斤拷锟斤拷锟斤拷始位锟斤拷锟斤拷 + { + SDIO->ICR|=1<<9; //锟斤拷锟斤拷锟斤拷志 + return SD_START_BIT_ERR; + } + if(SDIO->STA&(1<<8)) //锟斤拷锟酵斤拷锟斤拷 + { + if((SDIO_STD_CAPACITY_SD_CARD_V1_1==CardType)||(SDIO_STD_CAPACITY_SD_CARD_V2_0==CardType)||(SDIO_HIGH_CAPACITY_SD_CARD==CardType)) + { + SDIO_Send_Cmd(SD_CMD_STOP_TRANSMISSION,1,0); //锟斤拷锟斤拷CMD12+锟斤拷锟斤拷锟斤拷锟斤拷 + errorstatus=CmdResp1Error(SD_CMD_STOP_TRANSMISSION);//锟饺达拷R1锟斤拷应 + if(errorstatus!=SD_OK)return errorstatus; + } + } + INTX_ENABLE();//锟斤拷锟斤拷锟斤拷锟叫讹拷 + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷斜锟斤拷 + }else if(DeviceMode==SD_DMA_MODE) + { + SD_DMA_Config((u32*)buf,nblks*blksize,1);//SDIO DMA锟斤拷锟斤拷 + TransferError=SD_OK; + StopCondition=1; //锟斤拷锟叫,锟斤拷要锟斤拷锟斤拷停止锟斤拷锟斤拷指锟斤拷 + TransferEnd=0; //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟轿伙拷锟斤拷锟斤拷卸戏锟斤拷锟斤拷锟1 + SDIO->MASK|=(1<<1)|(1<<3)|(1<<8)|(1<<4)|(1<<9); //锟斤拷锟矫诧拷锟斤拷锟斤拷锟捷斤拷锟斤拷锟斤拷锟斤拷卸锟 + SDIO->DCTRL|=1<<3; //SDIO DMA使锟斤拷. + timeout=SDIO_DATATIMEOUT; + while(((DMA2->ISR&0X2000)==RESET)&&timeout)timeout--;//锟饺达拷锟斤拷锟斤拷锟斤拷锟 + if(timeout==0) //锟斤拷时 + { + SD_Init(); //锟斤拷锟铰筹拷始锟斤拷SD锟斤拷,锟斤拷锟皆斤拷锟叫达拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟 + return SD_DATA_TIMEOUT; //锟斤拷时 + } + timeout=SDIO_DATATIMEOUT; + while((TransferEnd==0)&&(TransferError==SD_OK)&&timeout)timeout--; + if(timeout==0)return SD_DATA_TIMEOUT; //锟斤拷时 + if(TransferError!=SD_OK)return TransferError; + } + } + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷斜锟斤拷 + errorstatus=IsCardProgramming(&cardstate); + while((errorstatus==SD_OK)&&((cardstate==SD_CARD_PROGRAMMING)||(cardstate==SD_CARD_RECEIVING))) + { + errorstatus=IsCardProgramming(&cardstate); + } + return errorstatus; +} +//SDIO锟叫断凤拷锟斤拷锟斤拷 +void SDIO_IRQHandler(void) +{ + SD_ProcessIRQSrc();//锟斤拷锟斤拷锟斤拷锟斤拷SDIO锟斤拷锟斤拷卸锟 +} +//SDIO锟叫断达拷锟斤拷锟斤拷锟斤拷 +//锟斤拷锟斤拷SDIO锟斤拷锟斤拷锟斤拷锟斤拷械母锟斤拷锟斤拷卸锟斤拷锟斤拷锟 +//锟斤拷锟斤拷值:锟斤拷锟斤拷锟斤拷锟 +SD_Error SD_ProcessIRQSrc(void) +{ + if(SDIO->STA&(1<<8))//锟斤拷锟斤拷锟斤拷锟斤拷卸锟 + { + if (StopCondition==1) + { + SDIO_Send_Cmd(SD_CMD_STOP_TRANSMISSION,1,0); //锟斤拷锟斤拷CMD12,锟斤拷锟斤拷锟斤拷锟斤拷 + TransferError=CmdResp1Error(SD_CMD_STOP_TRANSMISSION); + }else TransferError = SD_OK; + SDIO->ICR|=1<<8;//锟斤拷锟斤拷锟斤拷锟叫断憋拷锟 + SDIO->MASK&=~((1<<1)|(1<<3)|(1<<8)|(1<<14)|(1<<15)|(1<<4)|(1<<5)|(1<<9));//锟截憋拷锟斤拷锟斤拷卸锟 + TransferEnd = 1; + return(TransferError); + } + if(SDIO->STA&(1<<1))//锟斤拷锟斤拷CRC锟斤拷锟斤拷 + { + SDIO->ICR|=1<<1;//锟斤拷锟斤拷卸媳锟斤拷 + SDIO->MASK&=~((1<<1)|(1<<3)|(1<<8)|(1<<14)|(1<<15)|(1<<4)|(1<<5)|(1<<9));//锟截憋拷锟斤拷锟斤拷卸锟 + TransferError = SD_DATA_CRC_FAIL; + return(SD_DATA_CRC_FAIL); + } + if(SDIO->STA&(1<<3))//锟斤拷锟捷筹拷时锟斤拷锟斤拷 + { + SDIO->ICR|=1<<3;//锟斤拷锟斤拷卸媳锟斤拷 + SDIO->MASK&=~((1<<1)|(1<<3)|(1<<8)|(1<<14)|(1<<15)|(1<<4)|(1<<5)|(1<<9));//锟截憋拷锟斤拷锟斤拷卸锟 + TransferError = SD_DATA_TIMEOUT; + return(SD_DATA_TIMEOUT); + } + if(SDIO->STA&(1<<5))//FIFO锟斤拷锟斤拷锟斤拷锟 + { + SDIO->ICR|=1<<5;//锟斤拷锟斤拷卸媳锟斤拷 + SDIO->MASK&=~((1<<1)|(1<<3)|(1<<8)|(1<<14)|(1<<15)|(1<<4)|(1<<5)|(1<<9));//锟截憋拷锟斤拷锟斤拷卸锟 + TransferError = SD_RX_OVERRUN; + return(SD_RX_OVERRUN); + } + if(SDIO->STA&(1<<4))//FIFO锟斤拷锟斤拷锟斤拷锟 + { + SDIO->ICR|=1<<4;//锟斤拷锟斤拷卸媳锟斤拷 + SDIO->MASK&=~((1<<1)|(1<<3)|(1<<8)|(1<<14)|(1<<15)|(1<<4)|(1<<5)|(1<<9));//锟截憋拷锟斤拷锟斤拷卸锟 + TransferError = SD_TX_UNDERRUN; + return(SD_TX_UNDERRUN); + } + if(SDIO->STA&(1<<9))//锟斤拷始位锟斤拷锟斤拷 + { + SDIO->ICR|=1<<9;//锟斤拷锟斤拷卸媳锟斤拷 + SDIO->MASK&=~((1<<1)|(1<<3)|(1<<8)|(1<<14)|(1<<15)|(1<<4)|(1<<5)|(1<<9));//锟截憋拷锟斤拷锟斤拷卸锟 + TransferError = SD_START_BIT_ERR; + return(SD_START_BIT_ERR); + } + return(SD_OK); +} + +//锟斤拷锟紺MD0锟斤拷执锟斤拷状态 +//锟斤拷锟斤拷值:sd锟斤拷锟斤拷锟斤拷锟斤拷 +SD_Error CmdError(void) +{ + SD_Error errorstatus = SD_OK; + u32 timeout=SDIO_CMD0TIMEOUT; + while(timeout--) + { + if(SDIO->STA&(1<<7))break; //锟斤拷锟斤拷锟窖凤拷锟斤拷(锟斤拷锟斤拷锟斤拷应) + } + if(timeout==0)return SD_CMD_RSP_TIMEOUT; + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷 + return errorstatus; +} +//锟斤拷锟絉7锟斤拷应锟侥达拷锟斤拷状态 +//锟斤拷锟斤拷值:sd锟斤拷锟斤拷锟斤拷锟斤拷 +SD_Error CmdResp7Error(void) +{ + SD_Error errorstatus=SD_OK; + u32 status; + u32 timeout=SDIO_CMD0TIMEOUT; + while(timeout--) + { + status=SDIO->STA; + if(status&((1<<0)|(1<<2)|(1<<6)))break;//CRC锟斤拷锟斤拷/锟斤拷锟斤拷锟斤拷应锟斤拷时/锟窖撅拷锟秸碉拷锟斤拷应(CRC校锟斤拷晒锟) + } + if((timeout==0)||(status&(1<<2))) //锟斤拷应锟斤拷时 + { + errorstatus=SD_CMD_RSP_TIMEOUT; //锟斤拷前锟斤拷锟斤拷锟斤拷2.0锟斤拷锟捷匡拷,锟斤拷锟竭诧拷支锟斤拷锟借定锟侥碉拷压锟斤拷围 + SDIO->ICR|=1<<2; //锟斤拷锟斤拷锟斤拷锟斤拷锟接︼拷锟绞憋拷锟街 + return errorstatus; + } + if(status&1<<6) //锟缴癸拷锟斤拷锟秸碉拷锟斤拷应 + { + errorstatus=SD_OK; + SDIO->ICR|=1<<6; //锟斤拷锟斤拷锟接︼拷锟街 + } + return errorstatus; +} +//锟斤拷锟絉1锟斤拷应锟侥达拷锟斤拷状态 +//cmd:锟斤拷前锟斤拷锟斤拷 +//锟斤拷锟斤拷值:sd锟斤拷锟斤拷锟斤拷锟斤拷 +SD_Error CmdResp1Error(u8 cmd) +{ + u32 status; + while(1) + { + status=SDIO->STA; + if(status&((1<<0)|(1<<2)|(1<<6)))break;//CRC锟斤拷锟斤拷/锟斤拷锟斤拷锟斤拷应锟斤拷时/锟窖撅拷锟秸碉拷锟斤拷应(CRC校锟斤拷晒锟) + } + if(status&(1<<2)) //锟斤拷应锟斤拷时 + { + SDIO->ICR=1<<2; //锟斤拷锟斤拷锟斤拷锟斤拷锟接︼拷锟绞憋拷锟街 + return SD_CMD_RSP_TIMEOUT; + } + if(status&(1<<0)) //CRC锟斤拷锟斤拷 + { + SDIO->ICR=1<<0; //锟斤拷锟斤拷锟街 + return SD_CMD_CRC_FAIL; + } + if(SDIO->RESPCMD!=cmd)return SD_ILLEGAL_CMD;//锟斤拷锟筋不匹锟斤拷 + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷 + return (SD_Error)(SDIO->RESP1&SD_OCR_ERRORBITS);//锟斤拷锟截匡拷锟斤拷应 +} +//锟斤拷锟絉3锟斤拷应锟侥达拷锟斤拷状态 +//锟斤拷锟斤拷值:锟斤拷锟斤拷状态 +SD_Error CmdResp3Error(void) +{ + u32 status; + while(1) + { + status=SDIO->STA; + if(status&((1<<0)|(1<<2)|(1<<6)))break;//CRC锟斤拷锟斤拷/锟斤拷锟斤拷锟斤拷应锟斤拷时/锟窖撅拷锟秸碉拷锟斤拷应(CRC校锟斤拷晒锟) + } + if(status&(1<<2)) //锟斤拷应锟斤拷时 + { + SDIO->ICR|=1<<2; //锟斤拷锟斤拷锟斤拷锟斤拷锟接︼拷锟绞憋拷锟街 + return SD_CMD_RSP_TIMEOUT; + } + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷 + return SD_OK; +} +//锟斤拷锟絉2锟斤拷应锟侥达拷锟斤拷状态 +//锟斤拷锟斤拷值:锟斤拷锟斤拷状态 +SD_Error CmdResp2Error(void) +{ + SD_Error errorstatus=SD_OK; + u32 status; + u32 timeout=SDIO_CMD0TIMEOUT; + while(timeout--) + { + status=SDIO->STA; + if(status&((1<<0)|(1<<2)|(1<<6)))break;//CRC锟斤拷锟斤拷/锟斤拷锟斤拷锟斤拷应锟斤拷时/锟窖撅拷锟秸碉拷锟斤拷应(CRC校锟斤拷晒锟) + } + if((timeout==0)||(status&(1<<2))) //锟斤拷应锟斤拷时 + { + errorstatus=SD_CMD_RSP_TIMEOUT; + SDIO->ICR|=1<<2; //锟斤拷锟斤拷锟斤拷锟斤拷锟接︼拷锟绞憋拷锟街 + return errorstatus; + } + if(status&1<<0) //CRC锟斤拷锟斤拷 + { + errorstatus=SD_CMD_CRC_FAIL; + SDIO->ICR|=1<<0; //锟斤拷锟斤拷锟接︼拷锟街 + } + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷 + return errorstatus; +} +//锟斤拷锟絉6锟斤拷应锟侥达拷锟斤拷状态 +//cmd:之前锟斤拷锟酵碉拷锟斤拷锟斤拷 +//prca:锟斤拷锟斤拷锟截碉拷RCA锟斤拷址 +//锟斤拷锟斤拷值:锟斤拷锟斤拷状态 +SD_Error CmdResp6Error(u8 cmd,u16*prca) +{ + SD_Error errorstatus=SD_OK; + u32 status; + u32 rspr1; + while(1) + { + status=SDIO->STA; + if(status&((1<<0)|(1<<2)|(1<<6)))break;//CRC锟斤拷锟斤拷/锟斤拷锟斤拷锟斤拷应锟斤拷时/锟窖撅拷锟秸碉拷锟斤拷应(CRC校锟斤拷晒锟) + } + if(status&(1<<2)) //锟斤拷应锟斤拷时 + { + SDIO->ICR|=1<<2; //锟斤拷锟斤拷锟斤拷锟斤拷锟接︼拷锟绞憋拷锟街 + return SD_CMD_RSP_TIMEOUT; + } + if(status&1<<0) //CRC锟斤拷锟斤拷 + { + SDIO->ICR|=1<<0; //锟斤拷锟斤拷锟接︼拷锟街 + return SD_CMD_CRC_FAIL; + } + if(SDIO->RESPCMD!=cmd) //锟叫讹拷锟角凤拷锟斤拷应cmd锟斤拷锟斤拷 + { + return SD_ILLEGAL_CMD; + } + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷斜锟斤拷 + rspr1=SDIO->RESP1; //锟矫碉拷锟斤拷应 + if(SD_ALLZERO==(rspr1&(SD_R6_GENERAL_UNKNOWN_ERROR|SD_R6_ILLEGAL_CMD|SD_R6_COM_CRC_FAILED))) + { + *prca=(u16)(rspr1>>16); //锟斤拷锟斤拷16位锟矫碉拷,rca + return errorstatus; + } + if(rspr1&SD_R6_GENERAL_UNKNOWN_ERROR)return SD_GENERAL_UNKNOWN_ERROR; + if(rspr1&SD_R6_ILLEGAL_CMD)return SD_ILLEGAL_CMD; + if(rspr1&SD_R6_COM_CRC_FAILED)return SD_COM_CRC_FAILED; + return errorstatus; +} + +//SDIO使锟杰匡拷锟斤拷锟斤拷模式 +//enx:0,锟斤拷使锟斤拷;1,使锟斤拷; +//锟斤拷锟斤拷值:锟斤拷锟斤拷状态 +SD_Error SDEnWideBus(u8 enx) +{ + SD_Error errorstatus = SD_OK; + u32 scr[2]={0,0}; + u8 arg=0X00; + if(enx)arg=0X02; + else arg=0X00; + if(SDIO->RESP1&SD_CARD_LOCKED)return SD_LOCK_UNLOCK_FAILED;//SD锟斤拷锟斤拷锟斤拷LOCKED状态 + errorstatus=FindSCR(RCA,scr); //锟矫碉拷SCR锟侥达拷锟斤拷锟斤拷锟斤拷 + if(errorstatus!=SD_OK)return errorstatus; + if((scr[1]&SD_WIDE_BUS_SUPPORT)!=SD_ALLZERO) //支锟街匡拷锟斤拷锟斤拷 + { + SDIO_Send_Cmd(SD_CMD_APP_CMD,1,(u32)RCA<<16); //锟斤拷锟斤拷CMD55+RCA,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_APP_CMD); + if(errorstatus!=SD_OK)return errorstatus; + SDIO_Send_Cmd(SD_CMD_APP_SD_SET_BUSWIDTH,1,arg);//锟斤拷锟斤拷ACMD6,锟斤拷锟斤拷应,锟斤拷锟斤拷:10,4位;00,1位. + errorstatus=CmdResp1Error(SD_CMD_APP_SD_SET_BUSWIDTH); + return errorstatus; + }else return SD_REQUEST_NOT_APPLICABLE; //锟斤拷支锟街匡拷锟斤拷锟斤拷锟斤拷锟斤拷 +} +//锟斤拷榭拷欠锟斤拷锟斤拷锟街达拷锟叫达拷锟斤拷锟 +//pstatus:锟斤拷前状态. +//锟斤拷锟斤拷值:锟斤拷锟斤拷锟斤拷锟 +SD_Error IsCardProgramming(u8 *pstatus) +{ + vu32 respR1 = 0, status = 0; + SDIO_Send_Cmd(SD_CMD_SEND_STATUS,1,(u32)RCA<<16); //锟斤拷锟斤拷CMD13 + status=SDIO->STA; + while(!(status&((1<<0)|(1<<6)|(1<<2))))status=SDIO->STA;//锟饺达拷锟斤拷锟斤拷锟斤拷锟 + if(status&(1<<0)) //CRC锟斤拷锟绞э拷锟 + { + SDIO->ICR|=1<<0; //锟斤拷锟斤拷锟斤拷锟斤拷锟 + return SD_CMD_CRC_FAIL; + } + if(status&(1<<2)) //锟斤拷锟筋超时 + { + SDIO->ICR|=1<<2; //锟斤拷锟斤拷锟斤拷锟斤拷锟 + return SD_CMD_RSP_TIMEOUT; + } + if(SDIO->RESPCMD!=SD_CMD_SEND_STATUS)return SD_ILLEGAL_CMD; + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷斜锟斤拷 + respR1=SDIO->RESP1; + *pstatus=(u8)((respR1>>9)&0x0000000F); + return SD_OK; +} +//锟斤拷取锟斤拷前锟斤拷状态 +//pcardstatus:锟斤拷状态 +//锟斤拷锟斤拷值:锟斤拷锟斤拷锟斤拷锟 +SD_Error SD_SendStatus(uint32_t *pcardstatus) +{ + SD_Error errorstatus = SD_OK; + if(pcardstatus==NULL) + { + errorstatus=SD_INVALID_PARAMETER; + return errorstatus; + } + SDIO_Send_Cmd(SD_CMD_SEND_STATUS,1,RCA<<16); //锟斤拷锟斤拷CMD13,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_SEND_STATUS); //锟斤拷询锟斤拷应状态 + if(errorstatus!=SD_OK)return errorstatus; + *pcardstatus=SDIO->RESP1;//锟斤拷取锟斤拷应值 + return errorstatus; +} +//锟斤拷锟斤拷SD锟斤拷锟斤拷状态 +//锟斤拷锟斤拷值:SD锟斤拷状态 +SDCardState SD_GetState(void) +{ + u32 resp1=0; + if(SD_SendStatus(&resp1)!=SD_OK)return SD_CARD_ERROR; + else return (SDCardState)((resp1>>9) & 0x0F); +} +//锟斤拷锟斤拷SD锟斤拷锟斤拷SCR锟侥达拷锟斤拷值 +//rca:锟斤拷锟斤拷缘锟街 +//pscr:锟斤拷锟捷伙拷锟斤拷锟斤拷(锟芥储SCR锟斤拷锟斤拷) +//锟斤拷锟斤拷值:锟斤拷锟斤拷状态 +SD_Error FindSCR(u16 rca,u32 *pscr) +{ + u32 index = 0; + SD_Error errorstatus = SD_OK; + u32 tempscr[2]={0,0}; + SDIO_Send_Cmd(SD_CMD_SET_BLOCKLEN,1,8); //锟斤拷锟斤拷CMD16,锟斤拷锟斤拷应,锟斤拷锟斤拷Block Size为8锟街斤拷 + errorstatus=CmdResp1Error(SD_CMD_SET_BLOCKLEN); + if(errorstatus!=SD_OK)return errorstatus; + SDIO_Send_Cmd(SD_CMD_APP_CMD,1,(u32)rca<<16); //锟斤拷锟斤拷CMD55,锟斤拷锟斤拷应 + errorstatus=CmdResp1Error(SD_CMD_APP_CMD); + if(errorstatus!=SD_OK)return errorstatus; + SDIO_Send_Data_Cfg(SD_DATATIMEOUT,8,3,1); //8锟斤拷锟街节筹拷锟斤拷,block为8锟街斤拷,SD锟斤拷锟斤拷SDIO. + SDIO_Send_Cmd(SD_CMD_SD_APP_SEND_SCR,1,0); //锟斤拷锟斤拷ACMD51,锟斤拷锟斤拷应,锟斤拷锟斤拷为0 + errorstatus=CmdResp1Error(SD_CMD_SD_APP_SEND_SCR); + if(errorstatus!=SD_OK)return errorstatus; + while(!(SDIO->STA&(SDIO_FLAG_RXOVERR|SDIO_FLAG_DCRCFAIL|SDIO_FLAG_DTIMEOUT|SDIO_FLAG_DBCKEND|SDIO_FLAG_STBITERR))) + { + if(SDIO->STA&(1<<21))//锟斤拷锟斤拷FIFO锟斤拷锟捷匡拷锟斤拷 + { + *(tempscr+index)=SDIO->FIFO; //锟斤拷取FIFO锟斤拷锟斤拷 + index++; + if(index>=2)break; + } + } + if(SDIO->STA&(1<<3)) //锟斤拷锟斤拷锟斤拷锟捷筹拷时 + { + SDIO->ICR|=1<<3; //锟斤拷锟斤拷锟斤拷 + return SD_DATA_TIMEOUT; + } + else if(SDIO->STA&(1<<1)) //锟窖凤拷锟斤拷/锟斤拷锟秸碉拷锟斤拷锟捷匡拷CRC校锟斤拷锟斤拷锟 + { + SDIO->ICR|=1<<1; //锟斤拷锟斤拷锟斤拷 + return SD_DATA_CRC_FAIL; + } + else if(SDIO->STA&(1<<5)) //锟斤拷锟斤拷FIFO锟斤拷锟 + { + SDIO->ICR|=1<<5; //锟斤拷锟斤拷锟斤拷 + return SD_RX_OVERRUN; + } + else if(SDIO->STA&(1<<9)) //锟斤拷始位锟斤拷锟斤拷锟斤拷 + { + SDIO->ICR|=1<<9; //锟斤拷锟斤拷锟斤拷 + return SD_START_BIT_ERR; + } + SDIO->ICR=0X5FF; //锟斤拷锟斤拷锟斤拷 + //锟斤拷锟斤拷锟斤拷顺锟斤拷8位为锟斤拷位锟斤拷锟斤拷锟斤拷. + *(pscr+1)=((tempscr[0]&SD_0TO7BITS)<<24)|((tempscr[0]&SD_8TO15BITS)<<8)|((tempscr[0]&SD_16TO23BITS)>>8)|((tempscr[0]&SD_24TO31BITS)>>24); + *(pscr)=((tempscr[1]&SD_0TO7BITS)<<24)|((tempscr[1]&SD_8TO15BITS)<<8)|((tempscr[1]&SD_16TO23BITS)>>8)|((tempscr[1]&SD_24TO31BITS)>>24); + return errorstatus; +} +//锟矫碉拷NumberOfBytes锟斤拷2为锟阶碉拷指锟斤拷. +//NumberOfBytes:锟街斤拷锟斤拷. +//锟斤拷锟斤拷值:锟斤拷2为锟阶碉拷指锟斤拷值 +u8 convert_from_bytes_to_power_of_two(u16 NumberOfBytes) +{ + u8 count=0; + while(NumberOfBytes!=1) + { + NumberOfBytes>>=1; + count++; + } + return count; +} +//锟斤拷锟斤拷SDIO DMA +//mbuf:锟芥储锟斤拷锟斤拷址 +//bufsize:锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 +//dir:锟斤拷锟斤拷;1,锟芥储锟斤拷-->SDIO(写锟斤拷锟斤拷);0,SDIO-->锟芥储锟斤拷(锟斤拷锟斤拷锟斤拷); +void SD_DMA_Config(u32*mbuf,u32 bufsize,u8 dir) +{ + DMA2->IFCR|=(0XF<<12); //锟斤拷锟紻MA2通锟斤拷4锟侥革拷锟街憋拷锟 + DMA2_Channel4->CCR&=~(1<<0); //锟截憋拷DMA 通锟斤拷4 + DMA2_Channel4->CCR&=~(0X7FF<<4); //锟斤拷锟街帮拷锟斤拷锟斤拷锟,DIR,CIRC,PINC,MINC,PSIZE,MSIZE,PL,MEM2MEM + DMA2_Channel4->CCR|=dir<<4; //锟接存储锟斤拷锟斤拷 + DMA2_Channel4->CCR|=0<<5; //锟斤拷通模式 + DMA2_Channel4->CCR|=0<<6; //锟斤拷锟斤拷锟街凤拷锟斤拷锟斤拷锟侥J + DMA2_Channel4->CCR|=1<<7; //锟芥储锟斤拷锟斤拷锟斤拷模式 + DMA2_Channel4->CCR|=2<<8; //锟斤拷锟斤拷锟斤拷锟捷匡拷锟斤拷为32位 + DMA2_Channel4->CCR|=2<<10; //锟芥储锟斤拷锟斤拷锟捷匡拷锟斤拷32位 + DMA2_Channel4->CCR|=2<<12; //锟斤拷锟斤拷锟饺硷拷 + DMA2_Channel4->CNDTR=bufsize/4; //DMA2,锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 + DMA2_Channel4->CPAR=(u32)&SDIO->FIFO;//DMA2 锟斤拷锟斤拷锟街 + DMA2_Channel4->CMAR=(u32)mbuf; //DMA2,锟芥储锟斤拷锟斤拷址 + DMA2_Channel4->CCR|=1<<0; //锟斤拷锟斤拷DMA通锟斤拷 +} +//锟斤拷SD锟斤拷 +//buf:锟斤拷锟斤拷锟捷伙拷锟斤拷锟斤拷 +//sector:锟斤拷锟斤拷锟斤拷址 +//cnt:锟斤拷锟斤拷锟斤拷锟斤拷 +//锟斤拷锟斤拷值:锟斤拷锟斤拷状态;0,锟斤拷锟斤拷;锟斤拷锟斤拷,锟斤拷锟斤拷锟斤拷锟; +u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt) +{ + u8 sta=SD_OK; + long long lsector=sector; + u8 n; + lsector<<=9; + if((u32)buf%4!=0) + { + for(n=0;nPR = 1<<12; } + +#endif diff --git a/TFT/src/User/Hal/spi_slave.h b/TFT/src/User/Hal/stm32f10x/spi_slave.h similarity index 100% rename from TFT/src/User/Hal/spi_slave.h rename to TFT/src/User/Hal/stm32f10x/spi_slave.h diff --git a/TFT/src/User/Hal/stm32f10x/usart.c b/TFT/src/User/Hal/stm32f10x/usart.c new file mode 100644 index 0000000000..1eaeed0390 --- /dev/null +++ b/TFT/src/User/Hal/stm32f10x/usart.c @@ -0,0 +1,111 @@ +#include "usart.h" +#include "GPIO_Init.h" + +static USART_TypeDef *usart[_USART_CNT] = { + USART1, //TX--PA9 RX--PA10 + USART2, //TX--PA2 RX--PA3 + USART3, //TX--PB10 RX--PB11 + UART4, //TX--PC10 RX--PC11 + UART5}; //TX--PC12 RX--PD2 + +static const uint16_t uart_tx[_USART_CNT] = {PA9, PA2, PB10, PC10, PC12}; //TX +static const uint16_t uart_rx[_USART_CNT] = {PA10, PA3, PB11, PC11, PD2}; //RX + +void USART_GPIO_Init(uint8_t port) +{ + GPIO_InitSet(uart_tx[port], MGPIO_MODE_AF_PP, 0); + GPIO_InitSet(uart_rx[port], MGPIO_MODE_IPU, 0); +} + +void USART_GPIO_DeInit(uint8_t port) +{ + //set tx/rx to input + GPIO_InitSet(uart_tx[port], MGPIO_MODE_IPN, 0); + GPIO_InitSet(uart_rx[port], MGPIO_MODE_IPN, 0); +} + +void USART_Protocol_Init(uint8_t port,uint32_t baud) +{ + USART_InitTypeDef USART_InitStructure; + switch(port) + { + case _USART1: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); break; + case _USART2: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); break; + case _USART3: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); break; + case _UART4: RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); break; + case _UART5: RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); break; + } + USART_InitStructure.USART_BaudRate = baud; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_Init(usart[port],&USART_InitStructure); + + USART_Cmd(usart[port],ENABLE); +} + +void USART_IRQ_Init(uint8_t port, uint16_t usart_it) +{ + uint32_t IRQ_Channel[_USART_CNT] = {USART1_IRQn, USART2_IRQn, USART3_IRQn, UART4_IRQn, UART5_IRQn}; + + NVIC_InitTypeDef NVIC_InitStructure; + NVIC_InitStructure.NVIC_IRQChannel = IRQ_Channel[port]; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_Init(&NVIC_InitStructure); + + USART_ITConfig(usart[port], usart_it, ENABLE); + USART_ClearITPendingBit(usart[port], usart_it); +} + +void USART_Config(uint8_t port, uint32_t baud, uint16_t usart_it) +{ + USART_Protocol_Init(port, baud); + USART_IRQ_Init(port, usart_it); + USART_GPIO_Init(port); //所有初始化完成后,再使能IO, 否则上电后会自动发送一个 0xFF +} + +void USART_DeConfig(uint8_t port) +{ + USART_GPIO_DeInit(port); + switch(port) + { + case _USART1: + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); + break; + case _USART2: + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, DISABLE); + break; + case _USART3: + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, DISABLE); + break; + case _UART4: + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, DISABLE); + break; + case _UART5: + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, DISABLE); + break; + } +} + +void USART_Write(uint8_t port, uint8_t d) +{ + while((usart[port]->SR & USART_FLAG_TC) == (uint16_t)RESET); + usart[port]->DR = ((u16)d & (uint16_t)0x01FF); +} +void USART_Puts(uint8_t port, uint8_t *str) +{ + while (*str) + { + while((usart[port]->SR & USART_FLAG_TC) == (uint16_t)RESET); + usart[port]->DR = ((u16)*str++ & (uint16_t)0x01FF); + } +} diff --git a/TFT/src/User/Hal/usart.h b/TFT/src/User/Hal/stm32f10x/usart.h similarity index 100% rename from TFT/src/User/Hal/usart.h rename to TFT/src/User/Hal/stm32f10x/usart.h diff --git a/TFT/src/User/Hal/sw_spi.c b/TFT/src/User/Hal/sw_spi.c index 082452abfd..4171e45cb1 100644 --- a/TFT/src/User/Hal/sw_spi.c +++ b/TFT/src/User/Hal/sw_spi.c @@ -1,95 +1,33 @@ #include "sw_spi.h" +#include "GPIO_Init.h" -void GPIO_RCC_Set(GPIO_TypeDef *port) +void SW_SPI_Config(_SW_SPI *sw_spi, _SPI_MODE mode, u8 dataSize, +uint16_t cs, +uint16_t sck, +uint16_t miso, +uint16_t mosi) { - if(port == GPIOA) - { - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); - } - else if(port == GPIOB) - { - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); - } - else if(port == GPIOC) - { - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); - } - else if(port == GPIOD) - { - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); - } - else if(port == GPIOE) - { - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); - } - else if(port == GPIOF) - { - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); - } - else if(port == GPIOG) - { - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); - } -} - - -void SW_SPI_Config(_SW_SPI *sw_spi, _SPI_MODE mode, -GPIO_TypeDef *cs_port, uint16_t cs_pin, -GPIO_TypeDef *sck_port, uint16_t sck_pin, -GPIO_TypeDef *miso_port, uint16_t miso_pin, -GPIO_TypeDef *mosi_port, uint16_t mosi_pin) -{ -// uint32_t RCC_Define[_SPI_CNT] = {RCC_APB2Periph_GPIOA, -// RCC_APB2Periph_GPIOB, -// RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB}; - GPIO_InitTypeDef GPIO_InitStructure; - - sw_spi->cs_port = cs_port; - sw_spi->cs_pin = cs_pin; - sw_spi->sck_port = sck_port; - sw_spi->sck_pin = sck_pin; - sw_spi->miso_port = miso_port; - sw_spi->miso_pin = miso_pin; - sw_spi->mosi_port = mosi_port; - sw_spi->mosi_pin = mosi_pin; - sw_spi->mode = mode; - - GPIO_RCC_Set(sw_spi->cs_port); - GPIO_RCC_Set(sw_spi->sck_port); - GPIO_RCC_Set(sw_spi->miso_port); - GPIO_RCC_Set(sw_spi->mosi_port); - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - - if(sw_spi->mode == _SPI_MODE0 || sw_spi->mode == _SPI_MODE1) - GPIO_ResetBits(sw_spi->sck_port, sw_spi->sck_pin); - else - GPIO_SetBits(sw_spi->sck_port, sw_spi->sck_pin); - GPIO_InitStructure.GPIO_Pin = sw_spi->sck_pin; //SCK - GPIO_Init(sw_spi->sck_port, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = sw_spi->mosi_pin; //MOSI - GPIO_Init(sw_spi->mosi_port, &GPIO_InitStructure); - GPIO_SetBits(sw_spi->mosi_port, sw_spi->mosi_pin); - - GPIO_InitStructure.GPIO_Pin = sw_spi->cs_pin; //CS - GPIO_Init(sw_spi->cs_port, &GPIO_InitStructure); - GPIO_SetBits(sw_spi->cs_port, sw_spi->cs_pin); + sw_spi->cs = cs; + sw_spi->sck = sck; + sw_spi->miso = miso; + sw_spi->mosi = mosi; + sw_spi->mode = mode; + sw_spi->dataSize = dataSize; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; - GPIO_InitStructure.GPIO_Pin = sw_spi->miso_pin; //MISO - GPIO_Init(sw_spi->miso_port, &GPIO_InitStructure); + GPIO_InitSet(sw_spi->cs, MGPIO_MODE_OUT_PP, 0); //CS + GPIO_InitSet(sw_spi->sck, MGPIO_MODE_OUT_PP, 0); //SCK + GPIO_InitSet(sw_spi->miso, MGPIO_MODE_IPN, 0); //MISO + GPIO_InitSet(sw_spi->mosi, MGPIO_MODE_OUT_PP, 0); //MOSI } -#define SCK_HIGH() GPIO_SetBits(sw_spi->sck_port, sw_spi->sck_pin) -#define SCK_LOW() GPIO_ResetBits(sw_spi->sck_port, sw_spi->sck_pin) -#define MOSI_WRITE(n) do{if(n) GPIO_SetBits(sw_spi->mosi_port, sw_spi->mosi_pin); else GPIO_ResetBits(sw_spi->mosi_port, sw_spi->mosi_pin);}while(0) -#define MISO_READ() GPIO_ReadInputDataBit(sw_spi->miso_port, sw_spi->miso_pin) +#define SCK_HIGH() GPIO_SetLevel(sw_spi->sck, 1) +#define SCK_LOW() GPIO_SetLevel(sw_spi->sck, 0) +#define MOSI_WRITE(n) GPIO_SetLevel(sw_spi->mosi, n) +#define MISO_READ() GPIO_GetLevel(sw_spi->miso) uint16_t SW_SPI_Read_Write(_SW_SPI *sw_spi, uint16_t d) { - uint8_t data_bits = 8; + uint8_t data_bits = sw_spi->dataSize; uint8_t i=0; uint16_t rcv=0; switch(sw_spi->mode) @@ -144,8 +82,5 @@ uint16_t SW_SPI_Read_Write(_SW_SPI *sw_spi, uint16_t d) void SW_SPI_CS_Set(_SW_SPI *sw_spi, uint8_t level) { - if(level) - GPIO_SetBits(sw_spi->cs_port, sw_spi->cs_pin); - else - GPIO_ResetBits(sw_spi->cs_port, sw_spi->cs_pin); + GPIO_SetLevel(sw_spi->cs, level); } diff --git a/TFT/src/User/Hal/sw_spi.h b/TFT/src/User/Hal/sw_spi.h index 00cf828d06..4314c775d4 100644 --- a/TFT/src/User/Hal/sw_spi.h +++ b/TFT/src/User/Hal/sw_spi.h @@ -1,7 +1,7 @@ #ifndef _SW_SPI_H_ #define _SW_SPI_H_ -#include "stm32f10x_conf.h" +#include "variants.h" typedef enum { @@ -13,23 +13,19 @@ typedef enum typedef struct { - GPIO_TypeDef *cs_port; - uint16_t cs_pin; - GPIO_TypeDef *sck_port; - uint16_t sck_pin; - GPIO_TypeDef *miso_port; - uint16_t miso_pin; - GPIO_TypeDef *mosi_port; - uint16_t mosi_pin; - _SPI_MODE mode; + uint16_t cs; + uint16_t sck; + uint16_t miso; + uint16_t mosi; + _SPI_MODE mode; + uint8_t dataSize; }_SW_SPI; - -void SW_SPI_Config(_SW_SPI *sw_spi, _SPI_MODE mode, - GPIO_TypeDef *cs_port, uint16_t cs_pin, - GPIO_TypeDef *sck_port, uint16_t sck_pin, - GPIO_TypeDef *miso_port, uint16_t miso_pin, - GPIO_TypeDef *mosi_port, uint16_t mosi_pin); +void SW_SPI_Config(_SW_SPI *sw_spi, _SPI_MODE mode, u8 dataSize, +uint16_t cs, +uint16_t sck, +uint16_t miso, +uint16_t mosi); uint16_t SW_SPI_Read_Write(_SW_SPI *sw_spi, uint16_t d); void SW_SPI_CS_Set(_SW_SPI *sw_spi, uint8_t level); diff --git a/TFT/src/User/Hal/usart.c b/TFT/src/User/Hal/usart.c deleted file mode 100644 index a111b09b3e..0000000000 --- a/TFT/src/User/Hal/usart.c +++ /dev/null @@ -1,120 +0,0 @@ -#include "usart.h" - -static USART_TypeDef *usart[_USART_CNT] = {USART1, //TX--PA9 RX--PA10 - USART2, //TX--PA2 RX--PA3 - USART3, //TX--PB10 RX--PB11 - UART4, //TX--PC10 RX--PC11 - UART5}; //TX--PC12 RX--PD2 - -void USART_GPIO_Init(uint8_t port, uint8_t deInit) -{ - uint32_t RCC_Define[_USART_CNT] = {RCC_APB2Periph_GPIOA, - RCC_APB2Periph_GPIOA, - RCC_APB2Periph_GPIOB, - RCC_APB2Periph_GPIOC, - RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD}; - GPIO_TypeDef *TX_GPIO_Port[_USART_CNT] = {GPIOA, GPIOA, GPIOB, GPIOC, GPIOC}; //TX - uint16_t TX_GPIO_Pin[_USART_CNT] = {GPIO_Pin_9, GPIO_Pin_2, GPIO_Pin_10, GPIO_Pin_10, GPIO_Pin_12}; - GPIO_TypeDef *RX_GPIO_Port[_USART_CNT] = {GPIOA, GPIOA, GPIOB, GPIOC, GPIOD}; //RX - uint16_t RX_GPIO_Pin[_USART_CNT] = {GPIO_Pin_10, GPIO_Pin_3, GPIO_Pin_11, GPIO_Pin_11, GPIO_Pin_2}; - - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(RCC_Define[port],ENABLE); - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - - GPIO_InitStructure.GPIO_Mode = deInit ? GPIO_Mode_IN_FLOATING : GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Pin = TX_GPIO_Pin[port]; - GPIO_Init(TX_GPIO_Port[port],&GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Mode = deInit ? GPIO_Mode_IN_FLOATING : GPIO_Mode_IPU; - GPIO_InitStructure.GPIO_Pin = RX_GPIO_Pin[port]; - GPIO_Init(RX_GPIO_Port[port],&GPIO_InitStructure); -} - -void USART_Protocol_Init(uint8_t port,uint32_t baud) -{ - USART_InitTypeDef USART_InitStructure; - switch(port) - { - case _USART1: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); break; - case _USART2: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); break; - case _USART3: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); break; - case _UART4: RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); break; - case _UART5: RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); break; - } - USART_InitStructure.USART_BaudRate = baud; - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_InitStructure.USART_Parity = USART_Parity_No; - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - USART_Init(usart[port],&USART_InitStructure); - - USART_Cmd(usart[port],ENABLE); -} - -void USART_IRQ_Init(uint8_t port, uint16_t usart_it) -{ - uint32_t IRQ_Channel[_USART_CNT] = {USART1_IRQn, USART2_IRQn, USART3_IRQn, UART4_IRQn, UART5_IRQn}; - - NVIC_InitTypeDef NVIC_InitStructure; - NVIC_InitStructure.NVIC_IRQChannel = IRQ_Channel[port]; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_Init(&NVIC_InitStructure); - - USART_ITConfig(usart[port], usart_it, ENABLE); - USART_ClearITPendingBit(usart[port], usart_it); -} - -void USART_Config(uint8_t port, uint32_t baud, uint16_t usart_it) -{ - USART_Protocol_Init(port, baud); - USART_IRQ_Init(port, usart_it); - USART_GPIO_Init(port, 0); //所有初始化完成后,再使能IO, 否则上电后会自动发送一个 0xFF -} - -void USART_DeConfig(uint8_t port) -{ - USART_GPIO_Init(port, 1); - switch(port) - { - case _USART1: - RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); - break; - case _USART2: - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, DISABLE); - break; - case _USART3: - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, DISABLE); - break; - case _UART4: - RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, DISABLE); - break; - case _UART5: - RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, DISABLE); - break; - } -} - -void USART_Write(uint8_t port, uint8_t d) -{ - while((usart[port]->SR & USART_FLAG_TC) == (uint16_t)RESET); - usart[port]->DR = ((u16)d & (uint16_t)0x01FF); -} -void USART_Puts(uint8_t port, uint8_t *str) -{ - while (*str) - { - while((usart[port]->SR & USART_FLAG_TC) == (uint16_t)RESET); - usart[port]->DR = ((u16)*str++ & (uint16_t)0x01FF); - } -} diff --git a/TFT/src/User/Hal/xpt2046.c b/TFT/src/User/Hal/xpt2046.c index 8da57ff25b..f1db218b13 100644 --- a/TFT/src/User/Hal/xpt2046.c +++ b/TFT/src/User/Hal/xpt2046.c @@ -1,5 +1,5 @@ #include "xpt2046.h" - +#include "GPIO_Init.h" /***************************************** XPT2046 SPI 模式底层移植的接口********************************************/ //XPT2046 SPI相关 - 使用模拟SPI _SW_SPI xpt2046; @@ -20,17 +20,13 @@ u8 XPT2046_ReadWriteByte(u8 TxData) void XPT2046_Init(void) { //PA15-TPEN - GPIO_InitTypeDef GPIO_InitStructure; - RCC_APB2PeriphClockCmd(XPT2046_GPIO_RCC, ENABLE); - GPIO_InitStructure.GPIO_Pin = XPT2046_TPEN_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; - GPIO_Init(XPT2046_TPEN_PORT, &GPIO_InitStructure); + GPIO_InitSet(XPT2046_TPEN, MGPIO_MODE_IPN, 0); - SW_SPI_Config(&xpt2046, _SPI_MODE3, - XPT2046_CS_PORT, XPT2046_CS_PIN, //CS - XPT2046_SCK_PORT, XPT2046_SCK_PIN, //SCK - XPT2046_MISO_PORT, XPT2046_MISO_PIN, //MISO - XPT2046_MOSI_PORT, XPT2046_MOSI_PIN //MOSI + SW_SPI_Config(&xpt2046, _SPI_MODE3, 8, // 8bit + XPT2046_CS, //CS + XPT2046_SCK, //SCK + XPT2046_MISO, //MISO + XPT2046_MOSI //MOSI ); XPT2046_CS_Set(1); } @@ -38,7 +34,7 @@ void XPT2046_Init(void) //读笔中断 u8 XPT2046_Read_Pen(void) { - return GPIO_ReadInputDataBit(XPT2046_TPEN_PORT, XPT2046_TPEN_PIN); + return GPIO_GetLevel(XPT2046_TPEN); } /******************************************************************************************************************/ diff --git a/TFT/src/User/Menu/BabyStep.c b/TFT/src/User/Menu/BabyStep.c index 1e88a607aa..5b315acb84 100644 --- a/TFT/src/User/Menu/BabyStep.c +++ b/TFT/src/User/Menu/BabyStep.c @@ -58,11 +58,11 @@ static float baby_step_value=0.0; void showBabyStep(void) { - GUI_DispFloat(CENTER_X - 3*BYTE_WIDTH/2, CENTER_Y, baby_step_value,1,2,1,RIGHT); + GUI_DispFloat(CENTER_X - 3*BYTE_WIDTH/2, CENTER_Y, baby_step_value, 1, 2, 1, RIGHT); } void babyStepReDraw(void) { - GUI_DispFloat(CENTER_X - 3*BYTE_WIDTH/2, CENTER_Y, baby_step_value,1,2,1,RIGHT); + GUI_DispFloat(CENTER_X - 3*BYTE_WIDTH/2, CENTER_Y, baby_step_value, 1, 2, 1, RIGHT); } diff --git a/TFT/src/User/Menu/Mode.c b/TFT/src/User/Menu/Mode.c index 8ba6f06925..b2c71c456c 100644 --- a/TFT/src/User/Menu/Mode.c +++ b/TFT/src/User/Menu/Mode.c @@ -7,7 +7,7 @@ void Serial_ReSourceDeInit(void) memset(&infoHost, 0, sizeof(infoHost)); resetInfoFile(); SD_DeInit(); -#ifdef BUZZER_SUPPORT +#ifdef BUZZER_PIN Buzzer_DeConfig(); #endif Serial_DeConfig(); @@ -15,7 +15,7 @@ void Serial_ReSourceDeInit(void) void Serial_ReSourceInit(void) { -#ifdef BUZZER_SUPPORT +#ifdef BUZZER_PIN Buzzer_Config(); #endif Serial_Config(infoSettings.baudrate); @@ -46,13 +46,15 @@ void infoMenuSelect(void) break; } + #ifdef ST7920_SPI case LCD12864: infoMenu.menu[infoMenu.cur] = menuST7920; - break; + break; + #endif } } -#ifdef LCD_ENCODER_SUPPORT +#if LCD_ENCODER_SUPPORT void menuMode(void) { RADIO modeRadio = { diff --git a/TFT/src/User/Menu/Popup.c b/TFT/src/User/Menu/Popup.c index d1b24b3980..6f39d5a7f7 100644 --- a/TFT/src/User/Menu/Popup.c +++ b/TFT/src/User/Menu/Popup.c @@ -81,8 +81,11 @@ void menuPopup(void) } } - - - - - +void popupReminder(u8* info, u8* context) +{ + popupDrawPage(&bottomSingleBtn , info, context, textSelect(LABEL_CONFIRM), NULL); + if(infoMenu.menu[infoMenu.cur] != menuPopup) + { + infoMenu.menu[++infoMenu.cur] = menuPopup; + } +} diff --git a/TFT/src/User/Menu/Popup.h b/TFT/src/User/Menu/Popup.h index c792d69ab6..23443206ab 100644 --- a/TFT/src/User/Menu/Popup.h +++ b/TFT/src/User/Menu/Popup.h @@ -40,6 +40,6 @@ extern WINDOW window; void windowSetButton(const BUTTON *btn); void windowReDrawButton(uint8_t positon, uint8_t is_press); void popupDrawPage(BUTTON *btn, const uint8_t *title, const uint8_t *context, const uint8_t *yes, const uint8_t *no); -void menuPopup(void); +void popupReminder(u8* info, u8* context); #endif diff --git a/TFT/src/User/Menu/PowerFailed.c b/TFT/src/User/Menu/PowerFailed.c index 414a680222..01de7a8406 100644 --- a/TFT/src/User/Menu/PowerFailed.c +++ b/TFT/src/User/Menu/PowerFailed.c @@ -27,9 +27,11 @@ FIL fpPowerFailed; bool powerFailedCreate(char *path) { UINT br; + create_ok = false; - if(infoFile.source != TFT_SD) return false; + if(infoFile.source != TFT_SD) return false;//support SD Card only now + if(f_open(&fpPowerFailed, powerFailedFileName, FA_OPEN_ALWAYS | FA_WRITE) != FR_OK) return false; f_write(&fpPowerFailed, path, MAX_PATH_LEN, &br); @@ -40,7 +42,6 @@ bool powerFailedCreate(char *path) return true; } - void powerFailedCache(u32 offset) { UINT br; @@ -86,17 +87,20 @@ void powerFailedCache(u32 offset) void powerFailedClose(void) { + FRESULT rst; if(create_ok==false) return; - f_close(&fpPowerFailed); + rst = f_close(&fpPowerFailed); +// printf("close:%d\r\n", rst); } void powerFailedDelete(void) -{ +{ + FRESULT rst; if(create_ok==false) return; - f_close(&fpPowerFailed); - f_unlink(powerFailedFileName); + rst = f_unlink(powerFailedFileName); +// printf("unlink:%d\r\n", rst); clearPowerFailed(); } diff --git a/TFT/src/User/Menu/PowerFailed.h b/TFT/src/User/Menu/PowerFailed.h index bbd4d3b55e..c092258781 100644 --- a/TFT/src/User/Menu/PowerFailed.h +++ b/TFT/src/User/Menu/PowerFailed.h @@ -1,7 +1,7 @@ #ifndef _POWERFAILED_H_ #define _POWERFAILED_H_ -#include "stm32f10x.h" +#include "variants.h" #include "heat.h" #include "coordinate.h" #include "ff.h" diff --git a/TFT/src/User/Menu/Print.c b/TFT/src/User/Menu/Print.c index 19ef881819..41d99b11e6 100644 --- a/TFT/src/User/Menu/Print.c +++ b/TFT/src/User/Menu/Print.c @@ -118,7 +118,7 @@ void menuPrintFromSource(void) u8 update=0; GUI_Clear(BK_COLOR); - GUI_DispString((LCD_WIDTH - my_strlen(textSelect(LABEL_LOADING))*BYTE_WIDTH)/2, LCD_HEIGHT/2 - BYTE_HEIGHT, textSelect(LABEL_LOADING),1); + GUI_DispStringInRect(0, 0, LCD_WIDTH, LCD_HEIGHT, textSelect(LABEL_LOADING), 1); if (mountFS() == true && scanPrintFiles() == true) { @@ -127,15 +127,15 @@ void menuPrintFromSource(void) } else { - GUI_DispString((LCD_WIDTH-my_strlen(textSelect(labelVolumeError[infoFile.source]))*BYTE_WIDTH)/2, LCD_HEIGHT/2, textSelect(labelVolumeError[infoFile.source]),1); + GUI_DispStringInRect(0, 0, LCD_WIDTH, LCD_HEIGHT, textSelect(labelVolumeError[infoFile.source]), 1); Delay_ms(1000); infoMenu.cur--; } while(infoMenu.menu[infoMenu.cur] == menuPrintFromSource) { - Scroll_DispString(&titleScroll,1,LEFT); //锟斤拷锟斤拷锟斤拷示路锟斤拷锟斤拷 - Scroll_DispString(&gcodeScroll,1,CENTER); //锟斤拷锟斤拷锟斤拷示锟侥硷拷锟斤拷 + Scroll_DispString(&titleScroll,1,LEFT); // + Scroll_DispString(&gcodeScroll,1,CENTER); // key_num = menuKeyGetValue(); diff --git a/TFT/src/User/Menu/Printing.c b/TFT/src/User/Menu/Printing.c index 967570b09c..27faa2cd01 100644 --- a/TFT/src/User/Menu/Printing.c +++ b/TFT/src/User/Menu/Printing.c @@ -179,9 +179,12 @@ void resumeToPause(bool is_pause) bool setPrintPause(bool is_pause) { - if(!isPrinting()) return false; - if(infoPrinting.pause == is_pause) return false; + static bool pauseLock = false; + if(pauseLock) return false; + if(!isPrinting()) return false; + if(infoPrinting.pause == is_pause) return false; + pauseLock = true; switch (infoFile.source) { case BOARD_SD: @@ -238,6 +241,7 @@ bool setPrintPause(bool is_pause) break; } resumeToPause(is_pause); + pauseLock = false; return true; } @@ -266,7 +270,7 @@ void reDrawTime(void) min = infoPrinting.time%3600/60, sec = infoPrinting.time%60; - GUI_DispChar(progressRect.x0 + 2 * BYTE_WIDTH, TIME_Y, hour/10%10+'0',0); + GUI_DispChar(progressRect.x0 + 2 * BYTE_WIDTH, TIME_Y, hour/10%10+'0',1); GUI_DispChar(progressRect.x0 + 3 * BYTE_WIDTH, TIME_Y, hour%10+'0', 1); GUI_DispChar(progressRect.x0 + 5 * BYTE_WIDTH, TIME_Y, min/10+'0',1); GUI_DispChar(progressRect.x0 + 6 * BYTE_WIDTH, TIME_Y, min%10+'0',1); @@ -432,6 +436,7 @@ void completePrinting(void) break; } infoPrinting.printing = false; + powerFailedClose(); powerFailedDelete(); endGcodeExecute(); } diff --git a/TFT/src/User/Menu/Printing.h b/TFT/src/User/Menu/Printing.h index 7e99a88a20..6f3dfcdd93 100644 --- a/TFT/src/User/Menu/Printing.h +++ b/TFT/src/User/Menu/Printing.h @@ -1,6 +1,6 @@ #ifndef _PRINTING_H_ #define _PRINTING_H_ -#include "stm32f10x.h" +#include "variants.h" #include "stdbool.h" #include "ff.h" diff --git a/TFT/src/User/Menu/Settings.c b/TFT/src/User/Menu/Settings.c index 6f2588cca5..e3dcbec581 100644 --- a/TFT/src/User/Menu/Settings.c +++ b/TFT/src/User/Menu/Settings.c @@ -31,13 +31,13 @@ void menuDisconnect(void) GUI_Clear(BLACK); GUI_DispStringInRect(20, 0, LCD_WIDTH-20, LCD_HEIGHT, textSelect(LABEL_DISCONNECT_INFO), 0); - GPIOA->CRH &= 0xFFFFF00F; - GPIOA->CRH |= 0x00000440;// PA9/PA10 +// GPIOA->CRH &= 0xFFFFF00F; +// GPIOA->CRH |= 0x00000440;// PA9/PA10 - while(!isPress()); - while(isPress()); - GPIOA->CRH &= 0xFFFFF00F; - GPIOA->CRH |= 0x000008B0; +// while(!isPress()); +// while(isPress()); +// GPIOA->CRH &= 0xFFFFF00F; +// GPIOA->CRH |= 0x000008B0; infoMenu.cur--; } diff --git a/TFT/src/User/Menu/menu.c b/TFT/src/User/Menu/menu.c index a0f01d0b52..df7cdf4950 100644 --- a/TFT/src/User/Menu/menu.c +++ b/TFT/src/User/Menu/menu.c @@ -211,7 +211,6 @@ void itemDrawIconPress(u8 positon, u8 is_press) ICON_ReadDisplay(rect->x0, rect->y0, curMenuItems->items[positon].icon); } - //Get button value KEY_VALUES menuKeyGetValue(void) { @@ -222,12 +221,10 @@ KEY_VALUES menuKeyGetValue(void) void loopProcess(void) { getGcodeFromFile(); //Get Gcode command from the file to be printed - - parseQueueCmd(); //Parse Gcode command before Send - - sendQueueCmd(); //Process and send Gcode commands in the queue + + sendQueueCmd(); //Parse and send Gcode commands in the queue - parseACK(); //Parsing the received slave response information + parseACK(); //Parse the received slave response information loopCheckHeater(); //Temperature related settings @@ -247,8 +244,11 @@ void loopProcess(void) USBH_Process(&USB_OTG_Core, &USB_Host); #endif -#ifdef LCD_ENCODER_SUPPORT - if(!isPrinting()) - loopCheckMode(); +#if LCD_ENCODER_SUPPORT + loopCheckMode(); +#endif + +#ifdef FIL_RUNOUT_PIN + loopFILRunoutDetect(); #endif } diff --git a/TFT/src/User/delay.c b/TFT/src/User/delay.c index 74eaffa4d0..9ec3874fdb 100644 --- a/TFT/src/User/delay.c +++ b/TFT/src/User/delay.c @@ -1,4 +1,4 @@ -#include "stm32f10x.h" +#include "variants.h" static u16 fac_ms=0; static u8 fac_us=0; diff --git a/TFT/src/User/includes.h b/TFT/src/User/includes.h index ef5e0ac840..140011e202 100644 --- a/TFT/src/User/includes.h +++ b/TFT/src/User/includes.h @@ -10,13 +10,15 @@ #include #include "my_misc.h" -#include "stm32f10x.h" +#include "variants.h" #include "os_timer.h" #include "delay.h" #include "boot.h" #include "lcd.h" +#include "lcd_init.h" +#include "lcd_dma.h" #include "GUI.h" #include "language.h" @@ -48,6 +50,7 @@ #include "flashStore.h" #include "parseACK.h" +#include "extend.h" //menu #include "menu.h" diff --git a/TFT/src/User/main.c b/TFT/src/User/main.c index f4cf65091f..05726f82bb 100644 --- a/TFT/src/User/main.c +++ b/TFT/src/User/main.c @@ -3,12 +3,11 @@ HOST infoHost; // Information interaction with Marlin MENU infoMenu; // Menu structure - void Hardware_GenericInit(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); - Delay_init(72); - OS_TimerInit(9999,71); // System clock timer, cycle 10ms + Delay_init(F_CPUM); + OS_TimerInit(9999, F_CPUM-1); // System clock timer, cycle 10ms #ifdef DISABLE_DEBUG RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); @@ -24,10 +23,18 @@ void Hardware_GenericInit(void) W25Qxx_Init(); LCD_Init(); -#ifdef LCD_ENCODER_SUPPORT +#if LCD_ENCODER_SUPPORT LCD_EncoderInit(); #endif - + +#ifdef PS_ON_PIN + PS_ON_Init(); +#endif + +#ifdef FIL_RUNOUT_PIN + FIL_Runout_Init(); +#endif + if(readStoredPara() == false) { TSC_Calibration(); @@ -42,7 +49,7 @@ void Hardware_GenericInit(void) int main(void) { - SCB->VTOR = FLASH_BASE | 0x6000; + SCB->VTOR = VECT_TAB_FLASH; Hardware_GenericInit(); diff --git a/TFT/src/User/variants.h b/TFT/src/User/variants.h index 64d01af32f..7c948e1bed 100644 --- a/TFT/src/User/variants.h +++ b/TFT/src/User/variants.h @@ -1,24 +1,33 @@ #ifndef _VARIANTS_H_ #define _VARIANTS_H_ +#define USE_STDPERIPH_DRIVER /* * hardware source * TIM4 for os timer * TIM3 for buzzer timer */ -//MCU type (STM32F103VC - HD, STM32F105 - CL) -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) - #define STM32F10X_HD -#elif defined(TFT24_V1_1) - #define STM32F10X_CL -#endif - +//MCU type (STM32F103VC - HD, STM32F105 - CL, STM32F207VC) //HSE crystal frequency #if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2)|| defined(TFT28) + #define VECT_TAB_FLASH 0x08006000 + #define HSE_VALUE ((uint32_t)16000000) //16Mhz + #define F_CPUM 72 + #define STM32F10X_HD + #include "stm32f10x.h" +#elif defined(TFT35_V2_0) + #define VECT_TAB_FLASH 0x08003000 #define HSE_VALUE ((uint32_t)16000000) //16Mhz + #define F_CPUM 72 + #define STM32F10X_HD + #include "stm32f10x.h" #elif defined(TFT24_V1_1) + #define VECT_TAB_FLASH 0x08006000 #define HSE_VALUE ((uint32_t)8000000) //8Mhz + #define F_CPUM 72 + #define STM32F10X_CL + #include "stm32f10x.h" #endif //LCD interface @@ -26,7 +35,7 @@ #define RM68042 #define STM32_HAS_FSMC #define LCD_DATA_16BIT 0 -#elif defined(TFT35_V1_2) +#elif defined(TFT35_V1_2) || defined(TFT35_V2_0) #define ILI9488 #define STM32_HAS_FSMC #define LCD_DATA_16BIT 1 @@ -36,142 +45,123 @@ #define LCD_DATA_16BIT 1 #elif defined(TFT24_V1_1) #define ILI9341 -// #define STM32_HAS_FSMC #define LCD_DATA_16BIT 1 #endif //LCD Backlight pin (PWM can adjust brightness) -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) - //don't support LCD Backlight pin -#elif defined(TFT24_V1_1) - #define LCD_LED_SUPPORT - #define LCD_LED_RCC RCC_APB2Periph_GPIOA - #define LCD_LED_PORT GPIOA - #define LCD_LED_PIN GPIO_Pin_8 +#if defined(TFT24_V1_1) + #define LCD_LED_PIN PA8 #endif -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) || defined(TFT24_V1_1) +#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) || defined(TFT24_V1_1) || defined(TFT35_V2_0) #define SERIAL_PORT _USART1 //default usart port #endif //XPT2046 Software SPI Pins (touch screen ic) //need CS/SCK/MISO/MOSI for Software SPI, and TPEN for pen interrupt #if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) - #define XPT2046_GPIO_RCC RCC_APB2Periph_GPIOC - #define XPT2046_CS_PORT GPIOC - #define XPT2046_CS_PIN GPIO_Pin_0 - #define XPT2046_SCK_PORT GPIOC - #define XPT2046_SCK_PIN GPIO_Pin_1 - #define XPT2046_MISO_PORT GPIOC - #define XPT2046_MISO_PIN GPIO_Pin_2 - #define XPT2046_MOSI_PORT GPIOC - #define XPT2046_MOSI_PIN GPIO_Pin_3 - #define XPT2046_TPEN_PORT GPIOC - #define XPT2046_TPEN_PIN GPIO_Pin_4 -#elif defined(TFT24_V1_1) - #define XPT2046_GPIO_RCC RCC_APB2Periph_GPIOA - #define XPT2046_CS_PORT GPIOA - #define XPT2046_CS_PIN GPIO_Pin_3 - #define XPT2046_SCK_PORT GPIOA - #define XPT2046_SCK_PIN GPIO_Pin_2 - #define XPT2046_MISO_PORT GPIOA - #define XPT2046_MISO_PIN GPIO_Pin_1 - #define XPT2046_MOSI_PORT GPIOA - #define XPT2046_MOSI_PIN GPIO_Pin_0 - #define XPT2046_TPEN_PORT GPIOA - #define XPT2046_TPEN_PIN GPIO_Pin_15 + #define XPT2046_CS PC0 + #define XPT2046_SCK PC1 + #define XPT2046_MISO PC2 + #define XPT2046_MOSI PC3 + #define XPT2046_TPEN PC4 +#elif defined(TFT24_V1_1) + #define XPT2046_CS PA3 + #define XPT2046_SCK PA2 + #define XPT2046_MISO PA1 + #define XPT2046_MOSI PA0 + #define XPT2046_TPEN PA15 +#elif defined(TFT35_V2_0) + #define XPT2046_CS PC0 + #define XPT2046_SCK PB3 + #define XPT2046_MISO PB4 + #define XPT2046_MOSI PB5 + #define XPT2046_TPEN PC1 #else #error "xpt2046 need to Implement here by yourself." #endif //SD Card SPI pins #if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) + #define SD_SPI_SUPPORT #define SD_LOW_SPEED 7 #define SD_HIGH_SPEED 0 #define SD_SPI _SPI2 - #define SPI2_CS_RCC RCC_APB2Periph_GPIOB - #define SPI2_CS_PORT GPIOB - #define SPI2_CS_PIN GPIO_Pin_12 + #define SPI2_CS_PIN PB12 #elif defined(TFT24_V1_1) + #define SD_SPI_SUPPORT #define SD_LOW_SPEED 7 #define SD_HIGH_SPEED 1 #define SD_SPI _SPI1 - #define SPI1_CS_RCC RCC_APB2Periph_GPIOA - #define SPI1_CS_PORT GPIOA - #define SPI1_CS_PIN GPIO_Pin_4 + #define SPI1_CS_PIN PA4 +#elif defined(TFT35_V2_0) + #define SD_SDIO_SUPPORT #endif //SD Card CD detect pin -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) - //don't support SD CD(insert/remove) detect -#elif defined(TFT28) - #define SD_CD_SUPPROT - #define SD_CD_RCC RCC_APB2Periph_GPIOB - #define SD_CD_PORT GPIOB - #define SD_CD_PIN GPIO_Pin_0 -#elif defined(TFT24_V1_1) - #define SD_CD_SUPPROT - #define SD_CD_RCC RCC_APB2Periph_GPIOA - #define SD_CD_PORT GPIOA - #define SD_CD_PIN GPIO_Pin_13 +#if defined(TFT28) + #define SD_CD_PIN PB0 +#elif defined(TFT24_V1_1) + #define SD_CD_PIN PA13 +#elif defined(TFT35_V2_0) + #define SD_CD_PIN PC6 #endif //W25Qxx SPI pins -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) +#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) || defined(TFT35_V2_0) #define W25Qxx_SPEED 1 #define W25Qxx_SPI _SPI1 - #define SPI1_CS_RCC RCC_APB2Periph_GPIOA - #define SPI1_CS_PORT GPIOA - #define SPI1_CS_PIN GPIO_Pin_4 + #define SPI1_CS_PIN PA4 #elif defined(TFT24_V1_1) #define W25Qxx_SPEED 0 #define W25Qxx_SPI _SPI3 - #define SPI3_CS_RCC RCC_APB2Periph_GPIOD - #define SPI3_CS_PORT GPIOD - #define SPI3_CS_PIN GPIO_Pin_2 + #define SPI3_CS_PIN PD2 #endif //ST7920 Simulator SPI pins -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) - //don't support ST7920 Simulator -#elif defined(TFT24_V1_1) - #define ST7920_SPI _SPI2 +#if defined(TFT24_V1_1) + #define ST7920_SPI _SPI2 #endif //buzzer support -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) - //don't support buzzer -#elif defined(TFT24_V1_1) - #define BUZZER_SUPPORT - #define BUZZER_RCC RCC_APB2Periph_GPIOA - #define BUZZER_PORT GPIOA - #define BUZZER_PIN GPIO_Pin_14 +#if defined(TFT24_V1_1) + #define BUZZER_PIN PA14 +#elif defined(TFT35_V2_0) + #define BUZZER_PIN PB2 #endif //LCD Encoder support -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) - //don't support LCD Encoder -#elif defined(TFT24_V1_1) - #define LCD_ENCODER_SUPPORT +#if defined(TFT24_V1_1) //PB0:ENC-A PB1:ENC-B PB2:BTN - #define LCD_ENCODER_RCC RCC_APB2Periph_GPIOB - #define LCD_ENCA_PORT GPIOB - #define LCD_ENCA_PIN GPIO_Pin_0 - #define LCD_ENCB_PORT GPIOB - #define LCD_ENCB_PIN GPIO_Pin_1 - #define LCD_BTN_PORT GPIOB - #define LCD_BTN_PIN GPIO_Pin_2 + #define LCD_ENCA_PIN PB0 + #define LCD_ENCB_PIN PB1 + #define LCD_BTN_PIN PB2 #endif +#define LCD_ENCODER_SUPPORT (defined(LCD_ENCA_PIN) && defined(LCD_ENCB_PIN) && defined(LCD_BTN_PIN)) //U disk support -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) -#elif defined(TFT24_V1_1) +#if defined(TFT24_V1_1) #define U_DISK_SUPPROT #define USE_USB_OTG_FS #endif +//extend function(PS_ON, filament_detect) +#define PS_ACTIVE_HIGH true // Set 'false' for ATX (1), 'true' for X-Box (2) +#define FIL_RUNOUT_INVERTING true // Set to false to invert the logic of the sensor. +#if defined(TFT35_V2_0) + #define PS_ON_PIN PE5 + #define FIL_RUNOUT_PIN PE6 +#endif + +//Debug disable, free pins for other function +#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) || defined(TFT35_V2_0) + #define DISABLE_JTAG //free JTAG(PB3/PB4) for SPI3 +#elif defined(TFT24_V1_1) + #define DISABLE_DEBUG // +#endif + //LCD resolution, font and icon size -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) +#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT35_V2_0) #define LCD_WIDTH 480 #define LCD_HEIGHT 320 #define BYTE_HEIGHT 24 @@ -189,17 +179,18 @@ #define TITLE_END_Y 40 #endif -//Debug disable, free pins for other function -#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2) || defined(TFT28) - #define DISABLE_JTAG //free JTAG(PB3/PB4) for SPI3 +#if defined(TFT35_V1_0) || defined(TFT35_V1_1) || defined(TFT35_V1_2)|| defined(TFT35_V2_0) + #define ROOT_DIR "TFT35" +#elif defined(TFT28) + #define ROOT_DIR "TFT28" #elif defined(TFT24_V1_1) - #define DISABLE_DEBUG // + #define ROOT_DIR "TFT24" #endif //hardware version config #ifndef HARDWARE_VERSION #if defined(TFT35_V1_0) - #define HARDWARE_VERSION "TFT35_V1.0" + #define HARDWARE_VERSION "TFT35_V1.0" #elif defined(TFT35_V1_1) #define HARDWARE_VERSION "TFT35_V1.1" #elif defined(TFT35_V1_2) @@ -208,6 +199,8 @@ #define HARDWARE_VERSION "TFT28" #elif defined(TFT24_V1_1) #define HARDWARE_VERSION "TFT24_V1.1" + #elif defined(TFT35_V2_0) + #define HARDWARE_VERSION "TFT35_V2.0" #endif #endif diff --git a/buildroot/boards/STM32F207VC.json b/buildroot/boards/STM32F207VC.json new file mode 100644 index 0000000000..e3b9ade71b --- /dev/null +++ b/buildroot/boards/STM32F207VC.json @@ -0,0 +1,51 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m3", + "extra_flags": "-DSTM32F207xC", + "f_cpu": "120000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x1EAF", + "0x0004" + ] + ], + "ldscript": "BIGTREE_TFT35_V1.ld", + "mcu": "stm32f207vct6", + "variant": "stm32f2" + }, + "debug": { + "jlink_device": "STM32F207VC", + "openocd_target": "stm32f2x", + "svd_path": "STM32F207xx.svd" + }, + "frameworks": [ + "arduino", + "libopencm3", + "stm32cube" + ], + "name": "STM32F207VC (48k RAM. 256k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 49152, + "maximum_size": 262144, + "protocol": "cmsis-dap", + "protocols": [ + "cmsis-dap", + "jlink", + "stlink", + "blackmagic", + "serial", + "dfu" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f2-series/stm32f207/stm32f207vc.html", + "vendor": "Generic" +} diff --git a/buildroot/ldscripts/stm32f10x_0x3000_iap.ld b/buildroot/ldscripts/stm32f10x_0x3000_iap.ld new file mode 100644 index 0000000000..aa272e5169 --- /dev/null +++ b/buildroot/ldscripts/stm32f10x_0x3000_iap.ld @@ -0,0 +1,170 @@ +/* +***************************************************************************** +** +** File : stm32_flash.ld +** +** Abstract : Linker script for STM32F103VC Device with +** 256KByte FLASH, 48KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Environment : Atollic TrueSTUDIO(R) +** +** Distribution: The file is distributed 揳s is, without any warranty +** of any kind. +** +** (c)Copyright Atollic AB. +** You may use this file as-is or modify it according to the needs of your +** project. Distribution of this file (unmodified or modified) is not +** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the +** rights to distribute the assembled, compiled & linked contents of this +** file as part of an application binary file, provided that it is built +** using the Atollic TrueSTUDIO(R) toolchain. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x2000C000; /* end of 64K RAM */ + +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x2000; /* required amount of heap */ +_Min_Stack_Size = 0x2000; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08003000, LENGTH = 256K - 12K + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K + MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .ARM.attributes : { *(.ARM.attributes) } > FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(.fini_array*)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = .; + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : AT ( _sidata ) + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + PROVIDE ( end = _ebss ); + PROVIDE ( _end = _ebss ); + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + /* MEMORY_bank1 section, code must be located here explicitly */ + /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ + .memory_b1_text : + { + *(.mb1text) /* .mb1text sections (code) */ + *(.mb1text*) /* .mb1text* sections (code) */ + *(.mb1rodata) /* read-only data (constants) */ + *(.mb1rodata*) + } >MEMORY_B1 + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +} diff --git a/buildroot/ldscripts/BIGTREE_TFT35_V1.ld b/buildroot/ldscripts/stm32f10x_0x6000_iap.ld similarity index 100% rename from buildroot/ldscripts/BIGTREE_TFT35_V1.ld rename to buildroot/ldscripts/stm32f10x_0x6000_iap.ld diff --git a/buildroot/ldscripts/stm32f2xx_0x8000_iap.ld b/buildroot/ldscripts/stm32f2xx_0x8000_iap.ld new file mode 100644 index 0000000000..68ff959993 --- /dev/null +++ b/buildroot/ldscripts/stm32f2xx_0x8000_iap.ld @@ -0,0 +1,170 @@ +/* +***************************************************************************** +** +** File : stm32_flash.ld +** +** Abstract : Linker script for STM32F103VC Device with +** 256KByte FLASH, 48KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Environment : Atollic TrueSTUDIO(R) +** +** Distribution: The file is distributed 揳s is, without any warranty +** of any kind. +** +** (c)Copyright Atollic AB. +** You may use this file as-is or modify it according to the needs of your +** project. Distribution of this file (unmodified or modified) is not +** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the +** rights to distribute the assembled, compiled & linked contents of this +** file as part of an application binary file, provided that it is built +** using the Atollic TrueSTUDIO(R) toolchain. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x2000C000; /* end of 64K RAM */ + +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x2000; /* required amount of heap */ +_Min_Stack_Size = 0x2000; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08008000, LENGTH = 256K - 32K + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K + MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .ARM.attributes : { *(.ARM.attributes) } > FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(.fini_array*)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = .; + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : AT ( _sidata ) + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + PROVIDE ( end = _ebss ); + PROVIDE ( _end = _ebss ); + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + /* MEMORY_bank1 section, code must be located here explicitly */ + /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ + .memory_b1_text : + { + *(.mb1text) /* .mb1text sections (code) */ + *(.mb1text*) /* .mb1text* sections (code) */ + *(.mb1rodata) /* read-only data (constants) */ + *(.mb1rodata*) + } >MEMORY_B1 + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } +} diff --git a/buildroot/scripts/stm32f10x_0x3000_iap.py b/buildroot/scripts/stm32f10x_0x3000_iap.py new file mode 100644 index 0000000000..556dd2d52b --- /dev/null +++ b/buildroot/scripts/stm32f10x_0x3000_iap.py @@ -0,0 +1,8 @@ +Import("env") + +# Relocate firmware from 0x08000000 to 0x08003000 +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + env['CPPDEFINES'].remove(define) +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08003000")) +env.Replace(LDSCRIPT_PATH="buildroot/ldscripts/stm32f10x_0x3000_iap.ld") diff --git a/buildroot/scripts/iap.py b/buildroot/scripts/stm32f10x_0x6000_iap.py similarity index 76% rename from buildroot/scripts/iap.py rename to buildroot/scripts/stm32f10x_0x6000_iap.py index bcdaa2eca1..90ea1176f1 100644 --- a/buildroot/scripts/iap.py +++ b/buildroot/scripts/stm32f10x_0x6000_iap.py @@ -5,4 +5,4 @@ if define[0] == "VECT_TAB_ADDR": env['CPPDEFINES'].remove(define) env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08006000")) -env.Replace(LDSCRIPT_PATH="buildroot/ldscripts/BIGTREE_TFT35_V1.ld") +env.Replace(LDSCRIPT_PATH="buildroot/ldscripts/stm32f10x_0x6000_iap.ld") diff --git a/platformio.ini b/platformio.ini index ba44521832..7153fc6362 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,20 +15,16 @@ build_dir = .pioenvs lib_dir = .piolib libdeps_dir = .piolibdeps boards_dir = buildroot/boards -env_default = BIGTREE_TFT35_V1_2 +env_default = BIGTREE_TFT35_V2_0 [common] -default_src_filter = + - -extra_scripts = pre:buildroot/scripts/custom_filename.py - buildroot/scripts/iap.py +default_src_filter = + - - build_flags = -fmax-errors=5 -g -ggdb -DUSE_STDPERIPH_DRIVER= -D__STATIC_INLINE= - -ITFT/src/Libraries/cmsis - -ITFT/src/Libraries/fwlib - -ITFT/src/Libraries/fwlib/inc + -ITFT/src/Libraries/cmsis/Core-CM3 -ITFT/src/User/Fatfs -ITFT/src/User/Hal -ITFT/src/User/Menu @@ -38,25 +34,34 @@ build_flags = -fmax-errors=5 -ITFT/src/User/API/Gcode -ITFT/src/User/API/Language -ITFT/src/User/API/Vfs - -ITFT/src/User/STM32_USB_HOST_Library/Core/inc - -ITFT/src/User/STM32_USB_HOST_Library/Class/MSC/inc - -ITFT/src/User/STM32_USB_HOST_Library/Usr/inc - -ITFT/src/User/STM32_USB_OTG_Driver/inc - -DSOFTWARE_VERSION=21 + -ITFT/src/User/Hal + -ITFT/src/User/Hal/STM32_USB_HOST_Library/Core/inc + -ITFT/src/User/Hal/STM32_USB_HOST_Library/Class/MSC/inc + -ITFT/src/User/Hal/STM32_USB_HOST_Library/Usr/inc + -ITFT/src/User/Hal/STM32_USB_OTG_Driver/inc + -DSOFTWARE_VERSION=22 + +[stm32f10x] +default_src_filter = + + + +build_flags = -ITFT/src/Libraries/cmsis/stm32f10x + -ITFT/src/Libraries/fwlib/stm32f10x + -ITFT/src/Libraries/fwlib/stm32f10x/inc + -ITFT/src/User/Hal/stm32f10x # -# BIGTREE_TFT35_V1.2 +# BIGTREE_TFT35_V1.0 # -[env:BIGTREE_TFT35_V1_2] +[env:BIGTREE_TFT35_V1_0] platform = ststm32 framework = stm32cube board = STM32F103VC upload_protocol = cmsis-dap -src_filter = ${common.default_src_filter} + -extra_scripts = ${common.extra_scripts} -build_flags = ${common.build_flags} - -DHARDWARE="BIQU_TFT35_V1.2" - -DTFT35_V1_2= +src_filter = ${common.default_src_filter} +${stm32f10x.default_src_filter} + +extra_scripts = pre:buildroot/scripts/custom_filename.py + buildroot/scripts/stm32f10x_0x6000_iap.py +build_flags = ${common.build_flags} ${stm32f10x.build_flags} + -DHARDWARE="BIQU_TFT35_V1.0" + -DTFT35_V1_0= # # BIGTREE_TFT35_V1.1 @@ -66,25 +71,42 @@ platform = ststm32 framework = stm32cube board = STM32F103VC upload_protocol = cmsis-dap -src_filter = ${common.default_src_filter} + -extra_scripts = ${common.extra_scripts} -build_flags = ${common.build_flags} +src_filter = ${common.default_src_filter} +${stm32f10x.default_src_filter} + +extra_scripts = pre:buildroot/scripts/custom_filename.py + buildroot/scripts/stm32f10x_0x6000_iap.py +build_flags = ${common.build_flags} ${stm32f10x.build_flags} -DHARDWARE="BIQU_TFT35_V1.1" -DTFT35_V1_1= # -# BIGTREE_TFT35_V1.0 +# BIGTREE_TFT35_V1.2 # -[env:BIGTREE_TFT35_V1_0] +[env:BIGTREE_TFT35_V1_2] platform = ststm32 framework = stm32cube board = STM32F103VC upload_protocol = cmsis-dap -src_filter = ${common.default_src_filter} + -extra_scripts = ${common.extra_scripts} -build_flags = ${common.build_flags} - -DHARDWARE="BIQU_TFT35_V1.0" - -DTFT35_V1_0= +src_filter = ${common.default_src_filter} +${stm32f10x.default_src_filter} + +extra_scripts = pre:buildroot/scripts/custom_filename.py + buildroot/scripts/stm32f10x_0x6000_iap.py +build_flags = ${common.build_flags} ${stm32f10x.build_flags} + -DHARDWARE="BIQU_TFT35_V1.2" + -DTFT35_V1_2= + +# +# BIGTREE_TFT35_V2.0 +# +[env:BIGTREE_TFT35_V2_0] +platform = ststm32 +framework = stm32cube +board = STM32F103VC +upload_protocol = cmsis-dap +src_filter = ${common.default_src_filter} +${stm32f10x.default_src_filter} + +extra_scripts = pre:buildroot/scripts/custom_filename.py + buildroot/scripts/stm32f10x_0x3000_iap.py +build_flags = ${common.build_flags} ${stm32f10x.build_flags} + -DHARDWARE="BIQU_TFT35_APP1_V2.0" + -DTFT35_V2_0= # # BIGTREE_TFT28 @@ -94,13 +116,14 @@ platform = ststm32 framework = stm32cube board = STM32F103VC upload_protocol = cmsis-dap -src_filter = ${common.default_src_filter} + -extra_scripts = ${common.extra_scripts} -build_flags = ${common.build_flags} +src_filter = ${common.default_src_filter} +${stm32f10x.default_src_filter} + +extra_scripts = pre:buildroot/scripts/custom_filename.py + buildroot/scripts/stm32f10x_0x6000_iap.py +build_flags = ${common.build_flags} ${stm32f10x.build_flags} -DHARDWARE="BIQU_TFT28_V1.0" -DTFT28= - # +# # BIGTREE_TFT24_V1_1 # [env:BIGTREE_TFT24_V1_1] @@ -108,8 +131,9 @@ platform = ststm32 framework = stm32cube board = STM32F105RC upload_protocol = cmsis-dap -src_filter = ${common.default_src_filter} + -extra_scripts = ${common.extra_scripts} -build_flags = ${common.build_flags} +src_filter = ${common.default_src_filter} +${stm32f10x.default_src_filter} + +extra_scripts = pre:buildroot/scripts/custom_filename.py + buildroot/scripts/stm32f10x_0x6000_iap.py +build_flags = ${common.build_flags} ${stm32f10x.build_flags} -DHARDWARE="BIGTREE_TFT24_V1.1" - -DTFT24_V1_1= \ No newline at end of file + -DTFT24_V1_1=