wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 581|回復: 0
收起左側

制作出給stm32wb55燒外部nor flash(w25q32jv)的stldr檔

[復制鏈接]
ID:1160110 發表于 2025-9-9 22:02 | 顯示全部樓層 |閱讀模式
使用 P-NUCLEO-WB55
主要 的qspi驅動代碼如下,因是使用ok焊接,所以在讀和mapping的時候4線不成功,改成用1線式
pin腳使用如下:
    /**QUADSPI GPIO Configuration
    PB8     ------> QUADSPI_BK1_IO1
    PB9     ------> QUADSPI_BK1_IO0
    PA6     ------> QUADSPI_BK1_IO3
    PA7     ------> QUADSPI_BK1_IO2
    PB10     ------> QUADSPI_CLK
    PB11     ------> QUADSPI_BK1_NCS

整包source code跑ide
附件是使用QSPI_MemoryMapped 的sample code改寫 builde出 elf檔后,改附檔名為stldr,放入stm32Cube programmer的ExternalLoader ,就可以識別后做燒錄
qspi_borad.jpg qspi_programmer_write.jpg qspi_programmer_read.jpg stldr.png

  1. #include "main.h"
  2. #include "stm32wbxx_hal.h"
  3. #include "stm32wbxx_hal_qspi.h"
  4. /* USER CODE BEGIN 0 */
  5. static uint8_t QSPI_WriteEnable(void);
  6. static uint8_t QSPI_AutoPollingMemReady(uint32_t Timeout);
  7. static uint8_t QSPI_Configuration(void);
  8. static uint8_t QSPI_ResetChip(void);
  9. static HAL_StatusTypeDef QSPI_EnableQuadIfNeeded(void);
  10. #define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE
  11. #define HAL_QSPI_TIMEOUT_DEFAULT_VALUE 5000U
  12. #if defined(__ICCARM__)
  13. /* New definition from EWARM V9, compatible with EWARM8 */
  14. int iar_fputc(int ch);
  15. #define PUTCHAR_PROTOTYPE int iar_fputc(int ch)
  16. #elif defined (__CC_ARM) || defined(__ARMCC_VERSION)
  17. /* ARM Compiler 5/6 */
  18. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  19. #elif defined(__GNUC__)
  20. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  21. #endif /* __ICCARM__ */
  22. /* USER CODE END 0 */
  23. QSPI_HandleTypeDef hqspi;
  24. UART_HandleTypeDef huart1;

  25. /* USER CODE BEGIN 1 */
  26. void MX_QUADSPI_Init(void)
  27. {

  28.   /* USER CODE BEGIN QUADSPI_Init 0 */

  29.   /* USER CODE END QUADSPI_Init 0 */

  30.   /* USER CODE BEGIN QUADSPI_Init 1 */

  31.   /* USER CODE END QUADSPI_Init 1 */
  32.   /* QUADSPI parameter configuration*/
  33.   hqspi.Instance = QUADSPI;
  34.   hqspi.Init.ClockPrescaler = 2;
  35.   //hqspi.Init.ClockPrescaler = 2;
  36.   //hqspi.Init.FifoThreshold = 4;
  37.   hqspi.Init.FifoThreshold = 4;
  38.   hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
  39.   hqspi.Init.FlashSize = 21;
  40.   //hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_4_CYCLE;
  41.   hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE;
  42.   hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0;
  43.   if (HAL_QSPI_Init(&hqspi) != HAL_OK)
  44.   {
  45.     Error_Handler();
  46.   }
  47.   /* USER CODE BEGIN QUADSPI_Init 2 */

  48.   /* USER CODE END QUADSPI_Init 2 */

  49. }
  50. static void W25Qx_QSPI_Delay(uint32_t ms)
  51. {
  52.         HAL_Delay(ms);
  53. }
  54. /* QUADSPI init function */
  55. uint8_t CSP_QUADSPI_Init(void) {
  56.         //prepare QSPI peripheral for ST-Link Utility operations
  57.         if (HAL_QSPI_DeInit(&hqspi) != HAL_OK) {
  58.                 return HAL_ERROR;
  59.         }

  60.         MX_QUADSPI_Init();

  61.         if (QSPI_ResetChip() != HAL_OK) {
  62.                 return HAL_ERROR;
  63.         }

  64.         HAL_Delay(1);

  65.         if (QSPI_AutoPollingMemReady(HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
  66.                 return HAL_ERROR;
  67.         }

  68.         if (QSPI_WriteEnable() != HAL_OK) {

  69.                 return HAL_ERROR;
  70.         }
  71. #if 0
  72.         QSPI_CommandTypeDef s_command;
  73.         uint8_t value = W25Q256JV_FSR_QE;

  74.         s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  75.         s_command.Instruction = WRITE_STATUS_REG2_CMD;
  76.         s_command.AddressMode = QSPI_ADDRESS_NONE;
  77.         s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  78.         s_command.DataMode = QSPI_DATA_1_LINE;
  79.         s_command.DummyCycles = 0;
  80.         s_command.NbData = 1;
  81.         s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  82.         //s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  83.         s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;


  84.         if (HAL_QSPI_Command(&hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  85.         {
  86.                 return HAL_ERROR;
  87.         }
  88.                         /* 傳輸數據 */
  89.         if (HAL_QSPI_Transmit(&hqspi, &value, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  90.         {
  91.                 return HAL_ERROR;
  92.         }
  93. #endif

  94. #if 0
  95.           s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;                // 指令QSPI單線傳輸
  96.           s_command.Instruction       = ENTER_QPI_MODE_CMD;                                        // 指令,0x38使能QPI模式
  97.           s_command.AddressMode       = QSPI_ADDRESS_NONE;                                // 地址跳過
  98.           s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;                // 交替字節模式跳過
  99.           s_command.DummyCycles       = 0;                                                                // 空指令周期數
  100.           s_command.DataMode          = QSPI_DATA_NONE;                                        // 數據模式跳過
  101.           s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;                        // 禁止DDR模式
  102.           //s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;                // 禁止DDR模式數據延時
  103.           s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;                  // 在每個事務中發送指令

  104.           /* Send the command */
  105.           if (HAL_QSPI_Command(&hqspi, &s_command, 1000) != HAL_OK)
  106.                 {
  107.                         return HAL_ERROR;
  108.                 }

  109. #endif
  110. #if 0
  111.         if (QSPI_AutoPollingMemReady(W25Q128JV_SUBSECTOR_ERASE_MAX_TIME) != QSPI_OK)
  112.         {
  113.                                 return HAL_ERROR;
  114.         }
  115. #endif
  116.         printf("CSP_QUADSPI_Init Done1\n");
  117. #if 1
  118.         if (QSPI_Configuration() != HAL_OK) {
  119.                 return HAL_ERROR;
  120.         }
  121. #endif
  122.         QSPI_EnableQuadIfNeeded();
  123.         HAL_Delay(100);
  124.         printf("CSP_QUADSPI_Init Done2\n");
  125.         return HAL_OK;
  126. }


  127. uint8_t CSP_QSPI_Erase_Chip(void) {
  128.         QSPI_CommandTypeDef sCommand;

  129.         if (QSPI_WriteEnable() != HAL_OK) {
  130.                 return HAL_ERROR;
  131.         }

  132.         /* Erasing Sequence --------------------------------- */
  133.         sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  134.         sCommand.Instruction = CHIP_ERASE_CMD;
  135.         sCommand.AddressMode = QSPI_ADDRESS_NONE;
  136.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  137.         sCommand.DataMode = QSPI_DATA_NONE;
  138.         sCommand.DummyCycles = 0;
  139.         sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  140.         //sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  141.         sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;

  142.         if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_MAX_DELAY) != HAL_OK) {
  143.                 return HAL_ERROR;
  144.         }

  145.         if (QSPI_AutoPollingMemReady(HAL_MAX_DELAY) != HAL_OK) {
  146.                 return HAL_ERROR;
  147.         }

  148.         return HAL_OK;
  149. }

  150. uint8_t QSPI_AutoPollingMemReady(uint32_t Timeout) {

  151.         QSPI_CommandTypeDef     s_command;
  152.         QSPI_AutoPollingTypeDef s_config;
  153.         /* 配置自動輪詢模式等待存儲器準備就緒 */
  154.         s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  155.         s_command.Instruction       = READ_STATUS_REG1_CMD;
  156.         s_command.AddressMode       = QSPI_ADDRESS_NONE;
  157.         s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  158.         s_command.DataMode          = QSPI_DATA_1_LINE;
  159.         s_command.DummyCycles       = 0;
  160.         s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;
  161.         //s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  162.         s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

  163.         s_config.Match           = 0x00;
  164.         s_config.Mask            = W25Q256JV_FSR_BUSY;
  165.         s_config.MatchMode       = QSPI_MATCH_MODE_AND;
  166.         s_config.StatusBytesSize = 1;
  167.         s_config.Interval        = 0x10;
  168.         s_config.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;

  169.         if (HAL_QSPI_AutoPolling(&hqspi, &s_command, &s_config, HAL_MAX_DELAY) != HAL_OK)
  170.         {
  171.                 return HAL_ERROR;
  172.         }

  173.         return HAL_OK;
  174. }

  175. static uint8_t QSPI_WriteEnable(void) {
  176.         QSPI_CommandTypeDef     s_command;
  177.         QSPI_AutoPollingTypeDef s_config;
  178.         /* 啟用寫操作 */
  179.         s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  180.         s_command.Instruction       = WRITE_ENABLE_CMD;
  181.         s_command.AddressMode       = QSPI_ADDRESS_NONE;
  182.         s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  183.         s_command.DataMode          = QSPI_DATA_NONE;
  184.         s_command.DummyCycles       = 0;
  185.         s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;
  186.         //s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  187.         s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;
  188.         if (HAL_QSPI_Command(&hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  189.         {
  190.                 return HAL_ERROR;
  191.         }

  192.         /* 配置自動輪詢模式等待寫啟用 */
  193.         s_config.Match           = W25Q256JV_FSR_WREN;
  194.         s_config.Mask            = W25Q256JV_FSR_WREN;
  195.         s_config.MatchMode       = QSPI_MATCH_MODE_AND;
  196.         s_config.StatusBytesSize = 1;
  197.         s_config.Interval        = 0x10;
  198.         s_config.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;

  199.         s_command.Instruction    = READ_STATUS_REG1_CMD;
  200.         s_command.DataMode       = QSPI_DATA_1_LINE;
  201.         s_command.NbData         = 1;

  202.         if (HAL_QSPI_AutoPolling(&hqspi, &s_command, &s_config, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  203.         {
  204.                 return HAL_ERROR;
  205.         }

  206.         return HAL_OK;
  207. }
  208. /*Enable quad mode and set dummy cycles count*/
  209. static HAL_StatusTypeDef QSPI_EnableQuadIfNeeded(void)
  210. {
  211.     HAL_StatusTypeDef ret;
  212.     QSPI_CommandTypeDef sCommand = {0};
  213.     uint8_t sr1 = 0, sr2 = 0;

  214.     /* 1) 讀 SR1 */
  215.     sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  216.     sCommand.Instruction     = READ_STATUS_REG_CMD;
  217.     sCommand.AddressMode     = QSPI_ADDRESS_NONE;
  218.     sCommand.DataMode        = QSPI_DATA_1_LINE;
  219.     sCommand.NbData          = 1;
  220.     sCommand.SIOOMode        = QSPI_SIOO_INST_EVERY_CMD;
  221.     if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) return HAL_ERROR;
  222.     if (HAL_QSPI_Receive(&hqspi, &sr1, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) return HAL_ERROR;

  223.     /* 2) 讀 SR2 */
  224.     sCommand.Instruction = READ_STATUS_REG2_CMD;
  225.     if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) return HAL_ERROR;
  226.     if (HAL_QSPI_Receive(&hqspi, &sr2, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) return HAL_ERROR;

  227.     /* 若 QE 已經為 1,直接回傳 OK */
  228.     if (sr2 & QE_BIT) return HAL_OK;

  229.     /* 3) WREN */
  230.     ret = QSPI_WriteEnable();
  231.     if (ret != HAL_OK) return ret;

  232.     /* 4) 寫 SR1 + SR2 (把 QE bit 設為 1) */
  233.     uint8_t sr_buf[2];
  234.     sr_buf[0] = sr1;
  235.     sr_buf[1] = sr2 | QE_BIT;

  236.     sCommand.Instruction = WRITE_STATUS_REG1_CMD; /* 0x01: write SR1 + SR2 */
  237.     sCommand.DataMode    = QSPI_DATA_1_LINE;
  238.     sCommand.NbData      = 2;
  239.     sCommand.AddressMode = QSPI_ADDRESS_NONE;
  240.     if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) return HAL_ERROR;
  241.     if (HAL_QSPI_Transmit(&hqspi, sr_buf, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) return HAL_ERROR;

  242.     /* 5) poll WIP until finished */
  243.     if (QSPI_AutoPollingMemReady(HAL_MAX_DELAY) != HAL_OK) return HAL_ERROR;

  244.     /* 6) read back SR2 to ensure QE is set */
  245.     sCommand.Instruction = READ_STATUS_REG2_CMD;
  246.     sCommand.DataMode    = QSPI_DATA_1_LINE;
  247.     sCommand.NbData      = 1;
  248.     if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) return HAL_ERROR;
  249.     if (HAL_QSPI_Receive(&hqspi, &sr2, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) return HAL_ERROR;

  250.     if (sr2 & QE_BIT) return HAL_OK;
  251.     return HAL_ERROR;
  252. }

  253. uint8_t QSPI_Configuration(void) {
  254.         QSPI_CommandTypeDef sCommand = { 0 };
  255.         uint8_t reg;
  256.         HAL_StatusTypeDef ret;

  257.         /* Read Volatile Configuration register 2 --------------------------- */
  258.         sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  259.         sCommand.Instruction = READ_STATUS_REG2_CMD;
  260.         sCommand.AddressMode = QSPI_ADDRESS_NONE;
  261.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  262.         sCommand.DataMode = QSPI_DATA_1_LINE;
  263.         sCommand.DummyCycles = 0;
  264.         sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  265.         //sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  266.         sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  267.         sCommand.NbData = 1;

  268.         if ((ret = HAL_QSPI_Command(&hqspi, &sCommand,
  269.                         HAL_QPSI_TIMEOUT_DEFAULT_VALUE)) != HAL_OK) {
  270.                 return ret;
  271.         }

  272.         if ((ret = HAL_QSPI_Receive(&hqspi, ®, HAL_QPSI_TIMEOUT_DEFAULT_VALUE))
  273.                         != HAL_OK) {
  274.                 return ret;
  275.         }

  276.         /* Enable Volatile Write operations ---------------------------------------- */
  277.         sCommand.DataMode = QSPI_DATA_NONE;
  278.         sCommand.Instruction = VOLATILE_SR_WRITE_ENABLE;

  279.         if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  280.                         != HAL_OK) {
  281.                 return ret;
  282.         }

  283.         /* Write Volatile Configuration register 2 (QE = 1) -- */
  284.         sCommand.DataMode = QSPI_DATA_1_LINE;
  285.         sCommand.Instruction = WRITE_STATUS_REG2_CMD;
  286.         reg |= 2; // QE bit

  287.         if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  288.                         != HAL_OK) {
  289.                 return ret;
  290.         }

  291.         if (HAL_QSPI_Transmit(&hqspi, ®, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  292.                         != HAL_OK) {
  293.                 return ret;
  294.         }

  295.         /* Read Volatile Configuration register 3 --------------------------- */
  296.         sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  297.         sCommand.Instruction = READ_STATUS_REG3_CMD;
  298.         sCommand.AddressMode = QSPI_ADDRESS_NONE;
  299.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  300.         sCommand.DataMode = QSPI_DATA_1_LINE;
  301.         sCommand.DummyCycles = 0;
  302.         sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  303.         //sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  304.         sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  305.         sCommand.NbData = 1;

  306.         if ((ret = HAL_QSPI_Command(&hqspi, &sCommand,
  307.                         HAL_QPSI_TIMEOUT_DEFAULT_VALUE)) != HAL_OK) {
  308.                 return ret;
  309.         }

  310.         if ((ret = HAL_QSPI_Receive(&hqspi, ®, HAL_QPSI_TIMEOUT_DEFAULT_VALUE))
  311.                         != HAL_OK) {
  312.                 return ret;
  313.         }

  314.         /* Write Volatile Configuration register 2 (DRV1:2 = 00) -- */
  315.         sCommand.Instruction = WRITE_STATUS_REG3_CMD;
  316.         reg &= 0x9f; // DRV1:2 bit

  317.         if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  318.                         != HAL_OK) {
  319.                 return ret;
  320.         }

  321.         if (HAL_QSPI_Transmit(&hqspi, ®, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  322.                         != HAL_OK) {
  323.                 return ret;
  324.         }

  325.         return HAL_OK;
  326. #if 0
  327.         QSPI_CommandTypeDef sCommand;
  328.           uint8_t reg;


  329.         /*enter 4 byte address*/
  330.                 sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  331.                 sCommand.Instruction = ENTER_4_BYTE_ADD_CMD;
  332.                 sCommand.AddressMode = QSPI_ADDRESS_NONE;
  333.                 sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  334.                 sCommand.DataMode = QSPI_DATA_NONE;
  335.                 sCommand.DummyCycles = 0;
  336.                 sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  337.                 //sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  338.                 sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  339.                 sCommand.NbData = 0;

  340.                 if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  341.                                 != HAL_OK) {
  342.                         return HAL_ERROR;
  343.                 }




  344.         /*read configuration register*/
  345.         sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  346.         sCommand.Instruction = READ_CONFIGURATION_REG_CMD;
  347.         sCommand.AddressMode = QSPI_ADDRESS_NONE;
  348.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  349.         sCommand.DataMode = QSPI_DATA_1_LINE;
  350.         sCommand.DummyCycles = 0;
  351.         sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  352.         //sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  353.         sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  354.         sCommand.NbData = 1;

  355.         if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  356.                         != HAL_OK) {
  357.                 return HAL_ERROR;
  358.         }


  359.         if (HAL_QSPI_Receive(&hqspi, ®,
  360.         HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
  361.                 return HAL_ERROR;
  362.         }



  363.         if (QSPI_WriteEnable() != HAL_OK) {

  364.                         return HAL_ERROR;
  365.                 }


  366.         /*set dummy cycles*/
  367.         MODIFY_REG(reg, 0xF0, (DUMMY_CLOCK_CYCLES_READ_QUAD << POSITION_VAL(0xF0)));

  368.         sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  369.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  370.         sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  371.         //sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  372.         sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  373.         sCommand.Instruction = WRITE_VOL_CFG_REG_CMD;
  374.         sCommand.AddressMode = QSPI_ADDRESS_NONE;
  375.         sCommand.DataMode = QSPI_DATA_1_LINE;
  376.         sCommand.DummyCycles = 0;
  377.         sCommand.NbData = 1;

  378.         if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  379.                         != HAL_OK) {
  380.                 return HAL_ERROR;
  381.         }

  382.         if (HAL_QSPI_Transmit(&hqspi, ®,
  383.         HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
  384.                 Error_Handler();
  385.                 return HAL_ERROR;
  386.         }
  387.         return HAL_OK;
  388. #endif
  389. }


  390. uint8_t CSP_QSPI_EraseSector(uint32_t EraseStartAddress, uint32_t EraseEndAddress) {

  391.         QSPI_CommandTypeDef sCommand;

  392.         EraseStartAddress = EraseStartAddress
  393.                         - EraseStartAddress % MEMORY_SECTOR_SIZE;

  394.         /* Erasing Sequence -------------------------------------------------- */
  395.         sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  396.         sCommand.Instruction       = 0xD8;
  397.         sCommand.AddressMode       = QSPI_ADDRESS_1_LINE;
  398.         sCommand.AddressSize       = QSPI_ADDRESS_24_BITS;
  399.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  400.         sCommand.DataMode          = QSPI_DATA_NONE;
  401.         sCommand.DummyCycles       = 0;
  402.         sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
  403.     //s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  404.         sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

  405.         while (EraseEndAddress >= EraseStartAddress) {
  406.                 sCommand.Address = (EraseStartAddress & 0x0FFFFFFF);

  407.                 if (QSPI_WriteEnable() != HAL_OK) {
  408.                         return HAL_ERROR;
  409.                 }

  410.                 if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  411.                                 != HAL_OK) {
  412.                         return HAL_ERROR;
  413.                 }
  414.                 EraseStartAddress += MEMORY_SECTOR_SIZE;

  415.                 if (QSPI_AutoPollingMemReady(W25Q128JV_SECTOR_ERASE_MAX_TIME) != HAL_OK) {
  416.                         return HAL_ERROR;
  417.                 }
  418.         }

  419.         return HAL_OK;
  420. }

  421. uint8_t CSP_QSPI_WriteMemory(uint8_t* buffer, uint32_t address,uint32_t buffer_size) {

  422.         QSPI_CommandTypeDef sCommand;
  423.         uint32_t end_addr, current_size, current_addr;

  424.         /* Calculation of the size between the write address and the end of the page */
  425.         current_addr = 0;

  426.         //
  427.         while (current_addr <= address) {
  428.                 current_addr += MEMORY_PAGE_SIZE;
  429.         }
  430.         current_size = current_addr - address;

  431.         /* Check if the size of the data is less than the remaining place in the page */
  432.         if (current_size > buffer_size) {
  433.                 current_size = buffer_size;
  434.         }

  435.         /* Initialize the adress variables */
  436.         current_addr = address;
  437.         end_addr = address + buffer_size;

  438. #if 1
  439. #if 1
  440.         sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  441.         sCommand.Instruction = QUAD_IN_FAST_PROG_CMD;
  442.         sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
  443.         sCommand.AddressSize = QSPI_ADDRESS_24_BITS;
  444.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  445.         sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  446.         //sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  447.         sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  448.         sCommand.DataMode = QSPI_DATA_4_LINES;
  449.         sCommand.NbData = buffer_size;
  450.         sCommand.Address = address;
  451.         sCommand.DummyCycles = 0;
  452. #else
  453.         sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  454.         sCommand.Instruction = QUAD_IN_FAST_PROG_CMD;
  455.         sCommand.AddressMode = QSPI_ADDRESS_4_LINES;
  456.         sCommand.AddressSize = QSPI_ADDRESS_24_BITS;
  457.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  458.         sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  459.         //sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  460.         sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  461.         sCommand.DataMode = QSPI_DATA_4_LINES;
  462.         sCommand.NbData = buffer_size;
  463.         sCommand.Address = address;
  464.         sCommand.DummyCycles = 0;
  465. #endif
  466. #else
  467.         /* 初始化程序命令 */
  468.         sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  469.         sCommand.Instruction       = PAGE_PROG;
  470.         sCommand.AddressMode       = QSPI_ADDRESS_1_LINE;
  471.         sCommand.AddressSize       = QSPI_ADDRESS_24_BITS;
  472.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  473.         sCommand.DataMode          = QSPI_DATA_1_LINE;
  474.         sCommand.DummyCycles       = 0;
  475.         sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
  476.         //s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  477.         sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;
  478. #endif
  479.         /* Perform the write page by page */
  480.         do {
  481.                 sCommand.Address = current_addr;
  482.                 sCommand.NbData = current_size;

  483.                 if (current_size == 0) {
  484.                         return HAL_OK;
  485.                 }

  486.                 /* Enable write operations */
  487.                 if (QSPI_WriteEnable() != HAL_OK) {
  488.                         return HAL_ERROR;
  489.                 }

  490.                 /* Configure the command */
  491.                 if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  492.                                 != HAL_OK) {

  493.                         return HAL_ERROR;
  494.                 }

  495.                 /* Transmission of the data */
  496.                 if (HAL_QSPI_Transmit(&hqspi, buffer, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  497.                                 != HAL_OK) {

  498.                         return HAL_ERROR;
  499.                 }

  500.                 /* Configure automatic polling mode to wait for end of program */
  501.                 if (QSPI_AutoPollingMemReady(HAL_MAX_DELAY) != HAL_OK) {
  502.                         return HAL_ERROR;
  503.                 }

  504.                 /* Update the address and size variables for next page programming */
  505.                 current_addr += current_size;
  506.                 buffer += current_size;
  507.                 current_size =
  508.                                 ((current_addr + MEMORY_PAGE_SIZE) > end_addr) ?
  509.                                                 (end_addr - current_addr) : MEMORY_PAGE_SIZE;
  510.         } while (current_addr <= end_addr);

  511.         return HAL_OK;

  512. }


  513. uint8_t CSP_QSPI_EnableMemoryMappedMode(void) {

  514.         QSPI_CommandTypeDef sCommand;
  515.         QSPI_MemoryMappedTypeDef sMemMappedCfg;

  516.         /* Enable Memory-Mapped mode-------------------------------------------------- */
  517.         sCommand.InstructionMode    = QSPI_INSTRUCTION_1_LINE;
  518.         sCommand.Instruction        = 0x0B;                      // Fast Read
  519.         sCommand.AddressMode        = QSPI_ADDRESS_1_LINE;
  520.         sCommand.AddressSize        = QSPI_ADDRESS_24_BITS;
  521.         sCommand.AlternateByteMode  = QSPI_ALTERNATE_BYTES_NONE; // 單線不需要 Mode/Alt byte
  522.         sCommand.DataMode           = QSPI_DATA_1_LINE;
  523.         sCommand.DummyCycles        = 8;                         // 0x0B 規格書要求 8 dummy
  524.         sCommand.DdrMode            = QSPI_DDR_MODE_DISABLE;
  525.         sCommand.SIOOMode           = QSPI_SIOO_INST_EVERY_CMD;
  526.         sCommand.Address            = 0;
  527.         sCommand.NbData             = 0;                         // memory-mapped 忽略

  528.         sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
  529.         sMemMappedCfg.TimeOutPeriod     = 0;
  530. #if 0
  531. #if 1
  532.         sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  533.         sCommand.AddressSize = QSPI_ADDRESS_24_BITS;
  534.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_4_LINES;
  535.         //sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  536.         sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  537.         sCommand.AlternateBytes = 0xFF;
  538.         sCommand.AlternateBytesSize = 1;
  539.         //sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  540.         sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  541.         sCommand.AddressMode = QSPI_ADDRESS_4_LINES;
  542.         sCommand.DataMode = QSPI_DATA_4_LINES;
  543.         sCommand.NbData = 0;
  544.         sCommand.Address = 0;
  545.         sCommand.Instruction = QUAD_IN_OUT_FAST_READ_CMD;
  546.         sCommand.DummyCycles = 4;
  547.         sMemMappedCfg.TimeOutPeriod  = 0;
  548.         sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
  549. #else
  550.         sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  551.         sCommand.AddressSize = QSPI_ADDRESS_24_BITS;
  552.         sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_4_LINES;
  553.         sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  554.         sCommand.AlternateBytes = 0xFF;
  555.         sCommand.AlternateBytesSize = 1;
  556.         //sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  557.         sCommand.SIOOMode = QSPI_SIOO_INST_ONLY_FIRST_CMD;
  558.         sCommand.AddressMode = QSPI_ADDRESS_4_LINES;
  559.         sCommand.DataMode = QSPI_DATA_4_LINES;
  560.         sCommand.NbData = 0;
  561.         sCommand.Address = 0;
  562.         sCommand.Instruction = QUAD_IN_OUT_FAST_READ_CMD;
  563.         sCommand.DummyCycles = 4;
  564.         sMemMappedCfg.TimeOutPeriod  = 0;
  565.         sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
  566. #endif
  567. #endif
  568.         if (HAL_QSPI_MemoryMapped(&hqspi, &sCommand, &sMemMappedCfg) != HAL_OK) {
  569.                 return HAL_ERROR;
  570.         }
  571.         HAL_Delay(100);
  572.         return HAL_OK;
  573. }

  574. uint8_t QSPI_ResetChip() {
  575.         QSPI_CommandTypeDef s_command;
  576.         uint32_t temp = 0;
  577.         /* 初始化復位使能命令 */
  578.         s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  579.         s_command.Instruction       = RESET_ENABLE_CMD;
  580.         s_command.AddressMode       = QSPI_ADDRESS_NONE;
  581.         s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  582.         s_command.DataMode          = QSPI_DATA_NONE;
  583.         s_command.DummyCycles       = 0;
  584.         s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;
  585.         //s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  586.         s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

  587.         /* 發送命令 */
  588.         if (HAL_QSPI_Command(&hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  589.         {
  590.                 return HAL_ERROR;
  591.         }

  592.         /* 發送復位存儲器命令 */
  593.         s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  594.         s_command.Instruction = RESET_MEMORY_CMD;
  595.         s_command.AddressMode = QSPI_ADDRESS_NONE;
  596.         s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  597.         s_command.DataMode = QSPI_DATA_NONE;
  598.         s_command.DummyCycles = 0;
  599.         s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  600.         //s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  601.         s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  602.         if (HAL_QSPI_Command(&hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  603.         {
  604.                 return HAL_ERROR;
  605.         }

  606.         for (temp = 0; temp < 500000; temp++) {
  607.                 __NOP();
  608.         }
  609. #if 0
  610.         s_command.InstructionMode = QSPI_INSTRUCTION_4_LINES;
  611.         s_command.Instruction = RESET_ENABLE_CMD;

  612.         /* 發送命令 */
  613.         if (HAL_QSPI_Command(&hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  614.         {
  615.                 return HAL_ERROR;
  616.         }
  617.         W25Qx_QSPI_Delay(1);
  618.         /* 配置自動輪詢模式等待存儲器就緒 */
  619.         if (QSPI_AutoPollingMemReady(HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != QSPI_OK)
  620.         {
  621.                 return HAL_ERROR;
  622.         }
  623. #endif
  624.         return HAL_OK;
  625. }
  626. uint8_t CSP_QSPI_Read(uint8_t *pData, uint32_t ReadAddr, uint32_t Size) {
  627.         QSPI_CommandTypeDef s_command;
  628.           if(Size == 0)
  629.           {
  630.             printf("BSP_QSPI_Read Size = 0");
  631.             return HAL_ERROR;
  632.           }
  633. #if 1
  634.                 /* 初始化讀命令 */
  635.                 s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  636.                 s_command.Instruction       = 0x03;
  637.                 s_command.AddressMode       = QSPI_ADDRESS_1_LINE;
  638.                 s_command.AddressSize       = QSPI_ADDRESS_24_BITS;
  639.                 s_command.Address           = ReadAddr;
  640.                 s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  641.                 s_command.DataMode          = QSPI_DATA_1_LINE;
  642.                 s_command.DummyCycles       = 0;
  643.                 s_command.NbData            = Size;
  644.                 s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;
  645.                 //s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  646.                 s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

  647.                 /* 配置命令 */
  648.                 if (HAL_QSPI_Command(&hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  649.                 {
  650.                         return HAL_ERROR;
  651.                 }

  652.                 /* 接收數據 */
  653.                 if (HAL_QSPI_Receive(&hqspi, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  654.                 {
  655.                         return HAL_ERROR;
  656.                 }
  657. #else
  658.         /* Initialize the read command */
  659.         s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  660.         s_command.Instruction = QUAD_IN_OUT_FAST_READ_CMD;
  661.         s_command.AddressMode = QSPI_ADDRESS_4_LINES;
  662.         s_command.AddressSize = QSPI_ADDRESS_24_BITS;
  663.         s_command.Address = ReadAddr;
  664.         s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  665.         s_command.DataMode = QSPI_DATA_4_LINES;
  666.         s_command.DummyCycles = 6U;
  667.         s_command.NbData = Size;
  668.         s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  669.         //s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  670.         s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;

  671.         /* Configure the command */
  672.         if (HAL_QSPI_Command(&hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  673.                         != HAL_OK) {
  674.                 return HAL_ERROR;
  675.         }

  676.         /* Set S# timing for Read command */
  677.         MODIFY_REG(hqspi.Instance->DCR, QUADSPI_DCR_CSHT,
  678.                         QSPI_CS_HIGH_TIME_5_CYCLE);

  679.         /* Reception of the data */
  680.         if (HAL_QSPI_Receive(&hqspi, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
  681.                         != HAL_OK) {
  682.                 return HAL_ERROR;
  683.         }

  684.         /* Restore S# timing for nonRead commands */
  685.         MODIFY_REG(hqspi.Instance->DCR, QUADSPI_DCR_CSHT,
  686.                         QSPI_CS_HIGH_TIME_6_CYCLE);
  687. #endif
  688.         return HAL_OK;
  689. }
  690. uint32_t QSPI_FLASH_ReadDeviceID(void)
  691. {
  692.         QSPI_CommandTypeDef s_command;
  693.         uint32_t Temp = 0;
  694.         uint8_t pData[3];
  695.         /*##-2-讀取設備ID測試    ###########################################*/
  696.         /* 讀取制造/設備 ID */
  697.         s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  698.         s_command.Instruction       = 0x90;
  699.         s_command.AddressMode       = QSPI_ADDRESS_1_LINE;
  700.         s_command.AddressSize       = QSPI_ADDRESS_24_BITS;
  701.         s_command.Address           = 0x000000;
  702.         s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  703.         s_command.DataMode          = QSPI_DATA_1_LINE;
  704.         s_command.DummyCycles       = 0;
  705.         s_command.NbData            = 2;
  706.         s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;
  707.         //s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  708.         s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

  709.         if (HAL_QSPI_Command(&hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  710.         {
  711.                 printf("something wrong ....\r\n");
  712.     return 0;
  713.         }
  714.         if (HAL_QSPI_Receive(&hqspi, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  715.         {
  716.                 printf("something wrong ....\r\n");
  717.     return 0;
  718.         }

  719.         Temp = pData[1] |( pData[0]<<8 ) ;
  720.         return Temp;
  721. }
  722. PUTCHAR_PROTOTYPE
  723. {
  724.   /* Place your implementation of fputc here */
  725.   /* e.g. write a character to the USART1 and Loop until the end of transmission */
  726.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  727.   return ch;
  728. }
  729. /* USER CODE END 1 */
復制代碼
參考 github/WellinZHANG/External_Loader

QSPI_MemoryMapped.7z

983.25 KB, 下載次數: 0, 下載積分: 黑幣 -5

source code

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
免费在线视频观看| 嫩草在线视频| 日韩精品乱码久久久久久| 欧美日韩中文在线视频| 亚洲自拍在线观看| 精品三级在线看| 亚洲卡通欧美制服中文| 人妖欧美一区二区| 日韩美女毛片| 天堂а√在线最新版中文在线| 国产精品粉嫩av| 天天综合网在线观看| 久久综合激情网| 中文字幕视频观看| 妞干网在线观看视频| aa成人免费视频| 91国内揄拍国内精品对白| 精品少妇一区二区三区在线视频| 亚洲免费观看高清| 成人av综合在线| 媚黑女一区二区| 欧美女优在线视频| 久久天堂影院| 在线中文字幕第一页| 爱爱免费视频网站| 91丨九色丨蝌蚪丨老板| 狠狠综合久久av一区二区| 免费看日批视频| 黄色录像免费观看| 折磨小男生性器羞耻的故事| 日韩毛片在线免费看| 亚洲欧洲日本国产| 国内精品久久国产| 国产精品视频在线观看| 欧美激情视频在线免费观看 欧美视频免费一 | 在线观看福利片| 国产一级做a爰片久久| 潘金莲一级淫片aaaaa免费看| 动漫一区二区在线| 国产精品自产拍在线观| 97超级碰在线看视频免费在线看 | 十九岁完整版在线观看好看云免费| 免费毛片a线观看| 中文字幕国产欧美| 人妻中文字幕一区| 国产乱人乱偷精品视频| 日本免费在线观看视频| 国产精品自拍视频一区| 少妇aaaaa| 国产一区二区三区四区在线| 日本黄色片在线播放| 波多野结衣网页| 久久久久国产一区| 欧美一级黄色片视频| 久久久久久av无码免费网站下载| 日韩久久久久久久| 欧美第一黄网| 老牛影视免费一区二区| 国产精选一区二区| 岛国视频一区| 痴汉一区二区三区| 国产精品果冻传媒潘| 亚洲影院色在线观看免费| 国产精品久久久久秋霞鲁丝| 奇米一区二区三区四区久久| **欧美日韩vr在线| 欧洲一区二区视频| 国产成人在线播放| 国产精品久久91| 国产精品入口免费视频一| 国产精品嫩草影院一区二区| 国产精品欧美日韩一区二区| 国产精品男人爽免费视频1| 国产黄色一级片| 久久久久久久久久久免费| 国产美女性感在线观看懂色av| 亚洲欧美一区二区三区四区 | 91精品店在线| 欧美理论电影| 97影院秋霞午夜在线观看| 日本三级在线播放完整版| 视频三区在线| 国产写真视频在线观看| 成人高清免费在线| 18video性欧美19sex高清| 毛片在线网站| 国产精品xxx| 中文久久电影小说| 综合色就爱涩涩涩综合婷婷| 精品国产乱码久久久| 亚洲精品一区二区妖精| 国产精品大片| 日韩av午夜在线观看| 黄网站免费久久| 成人福利在线看| 中文字幕不卡的av| 精品国产31久久久久久| 欧美日韩小视频| 亚洲电影在线看| 久久精品中文字幕电影| 国产成人一区二区| 成人欧美一区二区三区在线观看| 含羞草久久爱69一区| 亚洲人成网站在线观看播放| 一区二区三区四区五区精品 | 欧美人乱大交xxxxx| 国产精品免费91| 天堂社区日本电影超碰| 福利在线观看| 国产高清不卡| 中文字幕av一区二区三区人| 欧美日韩国产一区精品一区| 精品一区免费av| 欧美国产1区2区| 欧美性生活大片免费观看网址| 日韩一区二区麻豆国产| 最好看的2019的中文字幕视频| 57pao成人国产永久免费| 97碰碰视频| www.一区二区.com| 日本少妇一区二区三区| 无码人妻精品中文字幕| 91免费视频播放| 蜜桃色永久入口| 成人永久免费网站| 91精选在线| 亚洲精品tv| 国产精品久久久久一区二区三区厕所| 丝袜美腿亚洲综合| 久久精品一区二区三区不卡| 色婷婷国产精品| 综合网日日天干夜夜久久| 成人美女av在线直播| 四虎精品欧美一区二区免费| gogo亚洲国模私拍人体| 国产无遮挡又黄又爽在线观看| a级片在线免费看| 美女福利网站视频在线观看| 不卡在线视频| 国产一区二区三区精品在线观看| 国产精品videosex极品| 国产成人免费高清| 色综合网色综合| 日韩中文字幕在线| 国产亚洲精品久久飘花| 美女网站视频黄色| 精品一级少妇久久久久久久| 寂寞护士中文字幕mp4| 传媒在线观看| 欧美久久久网站| 亚洲综合国产激情另类一区| 中文字幕中文字幕中文字幕亚洲无线| 91精品在线观看入口| 久久免费视频观看| 中文字幕一区综合| 欧美性xxxx图片| 精品久久久免费视频| 美女网站黄页| 91在线三级| 一区二区三区毛片免费| 久久久91精品国产一区二区三区| 欧美喷潮久久久xxxxx| 欧美最猛黑人xxxx黑人猛叫黄| 一个色的综合| 女~淫辱の触手3d动漫| 亚洲精品97久久中文字幕无码| 91大神网址| 国产精品麻豆成人av电影艾秋| 影音先锋中文字幕一区二区| 一区二区视频免费在线观看| 日韩视频欧美视频| 亚洲一卡二卡三卡| 美国美女黄色片| 久操久操久操| a毛片在线看免费观看| 久久亚洲影视| 亚洲天天做日日做天天谢日日欢| 日韩在线观看网址| 国产手机视频在线观看| 中文字幕五月天| 天堂www在线а√天堂| av今日在线| 国产日韩欧美一区| 色婷婷综合久久久| 国产精品久久久久久久久免费看| 精品中文字幕av| 天天操天天摸天天干| 夜色av.com| 久久久久久久久久久久电影| 国产成人免费视| 亚洲欧美日韩精品| 三年中国中文在线观看免费播放 | 国产精品污网站| 日韩中文字幕网| 99久热在线精品视频| 日本a在线观看| 国产对白国语对白| 成人知道污网站| 91亚洲国产成人精品一区二区三 | 国产一二在线观看| 视频在线不卡免费观看| 亚洲天堂精品在线观看| 欧美激情免费视频| 成年网站在线播放| 污污视频在线免费看| 久cao在线| 亚洲一区视频| 日韩一区二区三| 五码日韩精品一区二区三区视频| 成人免费视频网站入口::| 黄色免费av| 天天躁日日躁狠狠躁欧美| 国产精品毛片久久久久久| 欧美极品美女视频网站在线观看免费| av免费网站观看| 熟妇高潮一区二区三区| av成人 com a| 国产成人在线视频播放| 中文字幕9999| 国内自拍视频一区| 中国女人内谢69xxxx免费视频| 9765激情中文在线| 国产成人精品在线看| 色噜噜狠狠狠综合曰曰曰| 成人观看免费完整观看| 亚洲黄色一级大片| 中文日产幕无线码一区二区| 成人精品免费看| 欧美日本黄视频| 一级黄色大片儿| 羞羞影视羞羞在线| 群体交乱之放荡娇妻一区二区| 亚洲男人天堂av网| 91视频免费网站| 特级片在线观看| 日韩av免费观影| 亚洲免费中文| 中国人与牲禽动交精品| 中文字幕av不卡在线| 日韩欧美在线视频一区二区| 亚洲精品乱码日韩| 亚洲精品高清在线观看| 肥熟一91porny丨九色丨| 色哟哟一一国产精品| 五丁香在线视频| 日韩综合一区二区| 夜夜躁日日躁狠狠久久88av| 香蕉视频网站入口| 国产日韩欧美一区二区三区视频| 精品亚洲自拍| 欧美日韩一区二区在线观看视频| 国产精品波多野结衣| 亚洲黄色在线免费观看| 国产精品3区| 天天综合色天天综合| 日韩欧美电影一区二区| 性中国xxx极品hd| 性欧美video另类hd尤物| 亚洲一区二区美女| 日韩资源av在线| 精品人妻伦一区二区三区久久 | 欧美无砖专区免费| xxxxx69·hd| 欧美交a欧美精品喷水| 欧洲日韩一区二区三区| 福利在线一区二区| 丝袜理论片在线观看| 国产精品久久久久av蜜臀| 在线观看成人免费视频| 日本一级黄视频| 欧美白人猛性xxxxx交69| 国产探花一区| 亚洲国产精品久久精品怡红院| 在线播放av中文字幕| 人善交video高清| 亚洲影视综合| 97精品国产91久久久久久| 91香蕉视频网| 黄色在线免费| 亚洲国产成人自拍| 日韩av免费电影| 在线亚洲天堂| 99久久激情| 深夜福利亚洲导航| 日本成人免费在线观看| 国产精品刘玥久久一区| 国产精品国产自产拍高清av| 欧美裸体网站| 羞羞漫画网18久久app| 欧美电影《轻佻寡妇》| 色小说视频一区| 中文字幕无码日韩专区免费 | 99精品一区二区| 97中文在线观看| 国产一区二区三区四区视频| 亚洲视频一起| 亚洲国产精品久久精品怡红院| 秘密基地免费观看完整版中文| 在线视频中文字幕| 99麻豆久久久国产精品免费优播| 国产亚洲自拍偷拍| 无码精品人妻一区二区三区影院| 日韩久久电影| 欧美成人中文字幕| 黄色小视频在线免费看| 综合在线影院| 欧美精三区欧美精三区| 欧美专区第二页| www.亚洲资源| 一区二区三区久久| 日本中文字幕网址| 黄色毛片av| 91一区二区在线观看| 欧洲一区二区在线| 国产精品久久精品牛牛影视| 一区二区三区福利| 国产精品美腿一区在线看| 国产精品国产精品国产专区| av中文一区| 久久久免费电影| 免费视频网站在线观看入口| 日韩精品丝袜美腿| 精品国产区一区二区三区在线观看| 青青草原在线免费观看视频| 欧美大胆成人| 亚洲电影在线看| 国产午夜手机精彩视频| 国产精品亚洲综合在线观看| 日韩精品在线电影| 欧美极品aaaaabbbbb| 精品中文在线| 最近2019年好看中文字幕视频| 久久精品国产亚洲av麻豆色欲| 网站一区二区| 日韩在线观看av| 日韩中文字幕高清| 欧美理论在线播放| 欧美在线精品免播放器视频| 国产精品一区二区av白丝下载 | 日韩三级电影网址| 中国1级黄色片| 日韩一区网站| 久久av中文字幕| 夜夜躁很很躁日日躁麻豆| 日韩一区三区| 国产欧洲精品视频| 久久精品国产麻豆| 国产原创一区二区三区| 青青草原国产免费| 两个人hd高清在线观看| 洋洋av久久久久久久一区| 亚洲色图久久久| 日韩影视在线| 精品久久久久一区| 在线免费观看毛片| 精品国产一区二区三区久久久樱花 | 9人人澡人人爽人人精品| 伊人久久在线观看| 免费在线观看一级毛片| 日韩欧美在线第一页| 在线 丝袜 欧美 日韩 制服| 国产精品久久亚洲不卡| 搡老女人一区二区三区视频tv| 9i精品福利一区二区三区| 99精品综合| 国产精品一区二区av| 麻豆自创视频在线观看| 亚洲免费观看在线观看| 国产综合内射日韩久| 成人久久网站| 久久99久久99精品中文字幕| 高h调教冰块play男男双性文| 人人精品人人爱| 波多野结衣av一区二区全免费观看| 福利片在线看| 精品va天堂亚洲国产| 无码人妻精品一区二区50| 亚洲久久成人| 亚洲一区二区三区精品视频| 久久伊伊香蕉| 日韩欧美成人激情| 黄色在线视频网址| 国产亚洲亚洲| 久久免费视频2| 男人资源在线播放| 日韩精品极品视频| wwwxxxx国产| 国产一二三精品| 精品日韩久久久| 欧美激情不卡| 国产精品高潮视频| www.99.热| 欧美亚州韩日在线看免费版国语版| 欧美日韩在线国产| 欧美日本免费| 精品国产三级a∨在线| 18+激情视频在线| 久久久av一区| 国产剧情在线一区| 又紧又大又爽精品一区二区|