日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

GD32F303固件庫(kù)開(kāi)發(fā)(16)----移植兆易創(chuàng)新SPI Nor Flash之GD25Q64Flash

發(fā)布者:superstar11最新更新時(shí)間:2024-12-05 來(lái)源: elecfans關(guān)鍵字:GD32F303  固件庫(kù)開(kāi)發(fā)  SPI  Nor  Flash 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

    pData += current_size;

    current_size = ((current_addr + W25Q128FV_PAGE_SIZE) > end_addr) ? (end_addr - current_addr) : W25Q128FV_PAGE_SIZE;

  } while (current_addr < end_addr);



    return W25Qx_OK;

}

對(duì)flash的0x1000地址進(jìn)行寫(xiě)數(shù)據(jù),指令如下。


BSP_W25Qx_Write(wData2,0x1000,0x000a);


在這里插入圖片描述

keil配置

microlib 進(jìn)行了高度優(yōu)化以使代碼變得很小。 它的功能比缺省 C 庫(kù)少,并且根本不具備某些 ISO C 特性。 某些庫(kù)函數(shù)的運(yùn)行速度也比較慢,如果要使用printf(),必須開(kāi)啟。

在這里插入圖片描述

使能GPIO

void GPIO_Init(void)

{

    rcu_periph_clock_enable(RCU_GPIOA);

    rcu_periph_clock_enable(RCU_GPIOD);

    rcu_periph_clock_enable(RCU_SPI0);


    rcu_periph_clock_enable(RCU_AF);        


        /* SPI0 GPIO config:SCK/PA5, MISO/PA6, MOSI/PA7 */

    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);

    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);

    /* PD14 as NSS */

        gpio_init(GPIOD, GPIO_MODE_IPD, GPIO_OSPEED_MAX, GPIO_PIN_14);    

    gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_MAX, GPIO_PIN_14);    




}

SPI初始化

SPI掛載在APB2線(xiàn)上。

在這里插入圖片描述

下面將SPI0分頻256倍,那么速率為120M/256=468.75KHz。


void SPI_Init(void)

{

    spi_parameter_struct spi_init_struct;


    /* SPI0 parameter config */

    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;//雙工模式

    spi_init_struct.device_mode          = SPI_MASTER;//作為master,提供SCLK

    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;//8bit模式

    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;//mode0

    spi_init_struct.nss                  = SPI_NSS_SOFT;

    spi_init_struct.prescale             = SPI_PSC_256;// 分頻比

    spi_init_struct.endian               = SPI_ENDIAN_MSB;//高位在前

    spi_init(SPI0, &spi_init_struct);


    SET_SPI0_NSS_HIGH


        /* SPI enable */

    spi_enable(SPI0);    

}

使能串口

void UART_Init(void)

{


  /* 使能GPI0A,用PA9、PA10為串口 */

    rcu_periph_clock_enable(RCU_GPIOA);


    /*使能串口0的時(shí)鐘 */

    rcu_periph_clock_enable(RCU_USART0);


    /*配置USARTx_Tx(PA9)為復(fù)用推挽輸出*/

    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);


    /*配置USARTx_RxPA9)為浮空輸入 */

    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);


    /* USART 配置 */

    usart_deinit(USART0);//重置串口0

    usart_baudrate_set(USART0, 115200U);//設(shè)置串口0的波特率為115200

    usart_word_length_set(USART0, USART_WL_8BIT);          // 幀數(shù)據(jù)字長(zhǎng)

        usart_stop_bit_set(USART0, USART_STB_1BIT);               // 停止位1位

    usart_parity_config(USART0, USART_PM_NONE);           // 無(wú)奇偶校驗(yàn)位

    usart_receive_config(USART0, USART_RECEIVE_ENABLE);//使能接收器

    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//使能發(fā)送器

    usart_enable(USART0);//使能USART



}

開(kāi)啟串口DMA接收

void UART_DMA_Init(void)

{

    dma_parameter_struct dma_init_struct;

    // 時(shí)鐘開(kāi)啟

    rcu_periph_clock_enable(RCU_DMA0);

    /* USART0 DMA 接收配置*/

    dma_deinit(DMA0, DMA_CH4);

    dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;        /* 外設(shè)到內(nèi)存 */

    dma_init_struct.memory_addr = (uint32_t)ReceiveBuff;            /* 設(shè)置內(nèi)存接收基地址 */

    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;    /* 內(nèi)存地址遞增 */

    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;        /* 8位內(nèi)存數(shù)據(jù) */

    dma_init_struct.number = sizeof(ReceiveBuff);

    dma_init_struct.periph_addr = ((uint32_t)0x40013804);        /* 外設(shè)基地址,USART數(shù)據(jù)寄存器地址 */

    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;    /* 外設(shè)地址不遞增 */

    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;    /* 8位外設(shè)數(shù)據(jù) */

    dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;            /* 最高DMA通道優(yōu)先級(jí) */

    dma_init(DMA0, DMA_CH4, &dma_init_struct);                     /* 按照結(jié)構(gòu)體的配置初始化DMA */  



    dma_circulation_enable(DMA0, DMA_CH4);            /* 關(guān)閉DMA循環(huán)模式 */

    dma_memory_to_memory_disable(DMA0, DMA_CH4);    /* DMA內(nèi)存到內(nèi)存模式不開(kāi)啟 */

        dma_channel_enable(DMA0, DMA_CH4);                /* 使能DMA傳輸 */


        usart_dma_receive_config(USART0, USART_DENR_ENABLE);    /* USART0 DMA接收模式開(kāi)啟 */




}

串口中斷設(shè)置

void UART_nvic_Init(void)

{

    nvic_irq_enable(USART0_IRQn, 0, 0);        /* USART中斷設(shè)置,搶占優(yōu)先級(jí)0,子優(yōu)先級(jí)0 */

    usart_interrupt_enable(USART0, USART_INT_IDLE);            /* 使能USART0空閑中斷 */

}

W25Qx.c

/*********************************************************************************************************

*

* File                : ws_W25Qx.c

* Hardware Environment: 

* Build Environment   : RealView MDK-ARM  Version: 4.20

* Version             : V1.0

* By                  : 

*

*                                  (c) Copyright 2005-2011, WaveShare

*                                       http://www.waveshare.net

*                                          All Rights Reserved

*

*********************************************************************************************************/


#include 'W25Qx.h'

#include 'systick.h'



/**

  * @brief spi數(shù)據(jù)傳輸函數(shù)

  * @param spi_per spi外設(shè)

  * @param byte 發(fā)送字節(jié)

  * @return 接收字節(jié)

  */

uint8_t spi_SendRcvByte(uint32_t spi_per,uint8_t byte)

{

    uint8_t data;

    while(RESET == spi_i2s_flag_get(spi_per, SPI_FLAG_TBE));

    spi_i2s_data_transmit(spi_per, byte);


    while(SET == spi_i2s_flag_get(spi_per, SPI_FLAG_TRANS));

    while(RESET == spi_i2s_flag_get(spi_per, SPI_FLAG_RBNE));

    data=spi_i2s_data_receive(spi_per);

    while(SET == spi_i2s_flag_get(spi_per, SPI_FLAG_TRANS));

    return data;

}






//void spi_write_byte(uint32_t spi_periph, uint8_t data)

//{

//    while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TBE));//發(fā)送緩沖區(qū)空標(biāo)志

//    spi_i2s_data_transmit(spi_periph, data);


//}


//uint8_t spi_read_byte(uint32_t spi_periph)

//{

//    uint8_t read_i=0;

//    while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RBNE));//接收緩沖區(qū)非空標(biāo)志

//    read_i=spi_i2s_data_receive(spi_periph);

//    while(SET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TRANS));

//    return read_i;

//}


/**

  * @brief  Initializes the W25Q128FV interface.

  * @retval None

  */

uint8_t BSP_W25Qx_Init(void)

    /* Reset W25Qxxx */

    BSP_W25Qx_Reset();


    return BSP_W25Qx_GetStatus();

}


/**

  * @brief  This function reset the W25Qx.

  * @retval None

  */

static void    BSP_W25Qx_Reset(void)

{

    uint8_t cmd[2] = {RESET_ENABLE_CMD,RESET_MEMORY_CMD};


    W25Qx_Enable();

    /* Send the reset command */




    for(int i=0;i< 2;i++){

    spi_SendRcvByte(SPI0,cmd[i]);

}



//    HAL_SPI_Transmit(&hspi1, cmd, 2, W25Qx_TIMEOUT_VALUE);    

    W25Qx_Disable();


}


/**

  * @brief  Reads current status of the W25Q128FV.

  * @retval W25Q128FV memory status

  */

static uint8_t BSP_W25Qx_GetStatus(void)

{

    uint8_t cmd[] = {READ_STATUS_REG1_CMD};

    uint8_t status;


    W25Qx_Enable();

    /* Send the read status command */

//    spi_write_byte(SPI0, cmd[0]);

    //HAL_SPI_Transmit(&hspi1, cmd, 1, W25Qx_TIMEOUT_VALUE);    

    /* Reception of the data */

//    status=spi_read_byte(SPI0);

    //HAL_SPI_Receive(&hspi1,&status, 1, W25Qx_TIMEOUT_VALUE);



    spi_SendRcvByte(SPI0,cmd[0]);

    status=spi_SendRcvByte(SPI0,0x00);




    W25Qx_Disable();


    /* Check the value of the register */

  if((status & W25Q128FV_FSR_BUSY) != 0)

  {

    return W25Qx_BUSY;

  }

    else

    {

        return W25Qx_OK;

    }        

}


/**

  * @brief  This function send a Write Enable and wait it is effective.

  * @retval None

  */

uint8_t BSP_W25Qx_WriteEnable(void)

{

    uint8_t cmd[] = {WRITE_ENABLE_CMD};

//    uint32_t tickstart = HAL_GetTick();

uint32_t tickstart=0;

    /*Select the FLASH: Chip Select low */

    W25Qx_Enable();

    /* Send the read ID command */

//    HAL_SPI_Transmit(&hspi1, cmd, 1, W25Qx_TIMEOUT_VALUE);    

    spi_SendRcvByte(SPI0,cmd[0]);

    /*Deselect the FLASH: Chip Select high */

    W25Qx_Disable();


    /* Wait the end of Flash writing */

    while(BSP_W25Qx_GetStatus() == W25Qx_BUSY)

[1] [2] [3] [4] [5] [6]
關(guān)鍵字:GD32F303  固件庫(kù)開(kāi)發(fā)  SPI  Nor  Flash 引用地址:GD32F303固件庫(kù)開(kāi)發(fā)(16)----移植兆易創(chuàng)新SPI Nor Flash之GD25Q64Flash

上一篇:基于GD32E503主控芯片實(shí)現(xiàn)直流數(shù)控電源的設(shè)計(jì)
下一篇:STM32CUBEMX開(kāi)發(fā)GD32F303(2)----讀保護(hù)與寫(xiě)保護(hù)

小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車(chē)開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved