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)
上一篇:基于GD32E503主控芯片實(shí)現(xiàn)直流數(shù)控電源的設(shè)計(jì)
下一篇:STM32CUBEMX開(kāi)發(fā)GD32F303(2)----讀保護(hù)與寫(xiě)保護(hù)
- 熱門(mén)資源推薦
- 熱門(mén)放大器推薦
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- Alif 大幅增強(qiáng)邊緣 AI 處理器性能
- VS Code+PlatformIO搭建ESP32 Arduino開(kāi)發(fā)環(huán)境
- ESP32學(xué)習(xí)筆記(49)——RFID RC522使用
- Esp32環(huán)境離線(xiàn)搭建參考
- ESP32使用舵機(jī)庫(kù)時(shí)的錯(cuò)誤
- ESP32 S3接ST7789屏幕線(xiàn)序
- Arduino IDE安裝ESP32開(kāi)發(fā)環(huán)境的最簡(jiǎn)單方法
- 基于S3C44B0X和μC/OS-Ⅱ智能家居嵌入式系統(tǒng)設(shè)計(jì)
- 8位還能打,新唐推出全新工業(yè)級(jí)MCU
- LTM8053IY 5Vout 從 7Vin 到 40Vin 降壓轉(zhuǎn)換器的典型應(yīng)用電路
- 使用 Analog Devices 的 LTC6262HTS8 的參考設(shè)計(jì)
- 使用 Analog Devices 的 LTC3803ES6-5 的參考設(shè)計(jì)
- UMFT220XA-02,用于 FT220XQ 全速 USB 2.0 接口的 USB 轉(zhuǎn) 4 位 SPI/FT1248 開(kāi)發(fā)模塊
- ADA4062-2ARZ-RL運(yùn)算放大器用作陷波濾波器電路的典型應(yīng)用電路
- AD8311-EVALZ,AD8311 評(píng)估板,50dB GSM PA 控制器
- LTC2633-HZ8 雙路 8 位數(shù)模轉(zhuǎn)換器的典型應(yīng)用
- AT9919DB1,AT9919 單高電流 LED 驅(qū)動(dòng)器演示板
- 使用 RECOM Power GmbH 的 RSO-123.3D 的參考設(shè)計(jì)
- 使用外部基準(zhǔn)電流的 LT3088IST 線(xiàn)性穩(wěn)壓器的典型應(yīng)用
- 半導(dǎo)體關(guān)稅可能會(huì)使您的下一輛汽車(chē)更加昂貴
- 潮起!人形機(jī)器人成本的20%-30%——靈巧手,國(guó)產(chǎn)3大廠商正快速產(chǎn)業(yè)化!
- AB Dynamics發(fā)布用于無(wú)人駕駛測(cè)試的物體檢測(cè)系統(tǒng)
- AI重構(gòu)出行:高階輔助駕駛的破局之路
- 廣汽即將發(fā)布全新星源增程技術(shù)
- Yole表示,到2030年,數(shù)據(jù)中心芯片市場(chǎng)規(guī)模將達(dá)到5000億美元
- 綠色節(jié)能趨勢(shì)下的延時(shí)繼電器發(fā)展:低功耗設(shè)計(jì)與環(huán)保材料應(yīng)用
- 國(guó)內(nèi)車(chē)企在固態(tài)電池領(lǐng)域的挑戰(zhàn)和技術(shù)方案
- 資本熱捧 + 政策護(hù)航,2025 人形機(jī)器人能否叩開(kāi) “量產(chǎn)元年” 大門(mén)?
- 耐世特推出用于智能運(yùn)動(dòng)控制的 MotionIQ?軟件套件
- 特斯拉再一次“引火上身”?到底誰(shuí)該背鍋?
- Uber拆分滴滴成獨(dú)立公司,為何急于“扔掉”自動(dòng)駕駛?
- 因竊取商業(yè)機(jī)密,COF廠易華電10名前員工被起訴
- 韓明年將大力扶持面板產(chǎn)業(yè)
- 韓經(jīng)濟(jì)動(dòng)能大減,10天半導(dǎo)體出口額下滑34.2%!
- 基于UC3846的推挽正激DC-DC變換器的設(shè)計(jì)
- 義隆單片機(jī)PT2262無(wú)線(xiàn)解碼程序
- EMC單片機(jī)EM78P260的宏定義
- em78p153驅(qū)動(dòng)1602源程序
- 線(xiàn)性可調(diào)直流穩(wěn)壓電源的設(shè)計(jì)詳解