看单片机原理图-外部FLASHW25Q64

系列文章目录

看单片机原理图-最小系统
看单片机原理图-最小系统电源电路
看单片机原理图-输入输出电路LED指示、按键输入
看单片机原理图-红外遥控、EEPROM
看单片机原理图-FLASH



前言

硬件:百问网100ASK_STM32F103_MINI开发板(STM32F103C8T6)
IDE:KEIL 5
按键GPIO口为:PA0
串口为:PA10(USART1_RX)、PA9(USART1_TX)

一、FLASH

Flash是一种非易失性存储器,在原理、技术和结构上与EEPROM有显著的不同,是一种可以快速探险可现场编程的快擦写存储器。W25Q64是大容量SPI FLASH产品,其容量为64Mb。。W25Q64将8M字节的容量分为128个块,每个块大小为64K字节,每个块又分为16个扇区,每个扇区4K个字节。W25Q64的最小擦除单位为一个扇区,也就是每次必须擦除4K个字节。所以,这需要给W25Q64开辟一个至少4K的缓存区,这样必须要求芯片有4K以上的SRAM才能有很好的操作。 W25Q64的擦写周期多达10W次,可将数据保存达20年之久,支持2.7~3.6V的电压,支持标准的SPI,还支持双输出/四输出的SPI。 有多种封装可供选择:

  • 8-pin SOIC 208-mil
  • 8-pad WSON 6x5-mm/8x6-mm
  • 16-pin SOIC 300-mil
  • 8-pad XSON 4x4-mm
  • 24-ball TFBGA 8x6-mm (6x4 ball array)
  • 24-ball TFBGA 8x6-mm (6x4/5x5 ball array)
  • 12-ball WLCSP
    在这里插入图片描述

 CS:片选信号输入
SPI片选引脚能够使能和失能器件的操作。当片选引脚为高电平时,器件没有被选中,串行数据输出引脚(DO)处于高阻抗状态。当片选引脚置为低时,器件被选中,可以进行读写操作。电源上电后,在执行一次操作之前,片选引脚必须由高电平转至低电平。

 串行数据输入、输出和IOs (DI、DO和IO0、IO1、IO2、IO3)
W25Q64JV支持标准SPI, Dual SPI和Quad SPI操作。标准SPI指令使用单向DI(输入)引脚串行地将指令、地址或数据写入串行时钟(CLK)输入引脚上升沿上的设备。标准SPI还使用单向DO(输出)在CLK下降沿从设备读取数据或状态。
Dual和Quad SPI指令使用双向IO引脚串行地将指令、地址或数据写入CLK上升沿上的设备,并从CLK下降沿上的设备读取数据或状态。

 WP(IO2):写保护输入
写保护(/WP)引脚可以用来防止状态寄存器被写入。与状态寄存器的块保护(CMP, SEC, TB, BP2, BP1和BP0)位和状态一起使用
寄存器保护(SRP)位、一个4KB扇区或整个内存阵列都可以被硬件保护。WP引脚低激活。
 GND:地信号
 CLK:串行时钟输入
SPI串行时钟输入引脚(CLK)为串行输入和输出操作提供时序
 HOLD:Hold输入
HOLD引脚允许设备在被主动选择时被暂停。当/HOLD降低时,当/CS降低时,DO引脚将处于高阻抗,DI和CLK引脚上的信号将被忽略
(不在乎)。当/HOLD调高时,设备可以恢复运行。
 VCC:电源

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例程序,用于控制并同时工作多个基本模块,包括四个按键、四个LED灯、蜂鸣器、数码管、USB转UART串口、OLED屏、EEPROM 24C08、温湿度传感器DHT11、FLASH W25Q16、红外接收头、光敏传感器ADC和DAC以及RTC模块。请注意,这只是一个简单的示例,你可能需要根据你的具体硬件和库文件进行适当的修改和配置。 ```c #include "stm32f10x.h" #include "dht11.h" #include "oled.h" #include "eeprom.h" #include "flash.h" #define LED1_PIN GPIO_Pin_0 #define LED2_PIN GPIO_Pin_1 #define LED3_PIN GPIO_Pin_2 #define LED4_PIN GPIO_Pin_3 #define KEY1_PIN GPIO_Pin_4 #define KEY2_PIN GPIO_Pin_5 #define KEY3_PIN GPIO_Pin_6 #define KEY4_PIN GPIO_Pin_7 #define BUZZER_PIN GPIO_Pin_8 // Function prototypes void GPIO_Configuration(void); void ADC_Configuration(void); void DAC_Configuration(void); void RTC_Configuration(void); void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // LED pins RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // Key pins RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = KEY1_PIN | KEY2_PIN | KEY3_PIN | KEY4_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); // Buzzer pin RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = BUZZER_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // Initialize other GPIO pins for OLED, EEPROM, infrared receiver, etc. // ... } void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // Configure ADC GPIO pins RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // ADC channel 1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // Configure ADC RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // Enable ADC ADC_Cmd(ADC1, ENABLE); } void DAC_Configuration(void) { DAC_InitTypeDef DAC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // Configure DAC GPIO pin RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // DAC channel 1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // Configure DAC RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); // Enable DAC DAC_Cmd(DAC_Channel_1, ENABLE); } void RTC_Configuration(void) { // Configure RTC // ... } int main(void) { GPIO_Configuration(); ADC_Configuration(); DAC_Configuration(); RTC_Configuration(); while(1) { // Read input from keys if(GPIO_ReadInputDataBit(GPIOB, KEY1_PIN) == RESET) { // Key1 is pressed GPIO_SetBits(GPIOA, LED1_PIN); // Perform desired operations } else { GPIO_ResetBits(GPIOA, LED1_PIN); } // Repeat the same for other keys and LEDs // ... // Read temperature and humidity from DHT11 sensor float temperature, humidity; if(DHT11_ReadData(&temperature, &humidity) == DHT11_OK) { // Process temperature and humidity data } // Display information on OLED screen OLED_Init(); OLED_Clear(); OLED_ShowString(0, 0, "Temp: " + temperature); OLED_ShowString(0, 2, "Humidity: " + humidity); OLED_Refresh(); // Write data to EEPROM uint16_t address = 0x00; uint8_t data = 0x55; EEPROM_WriteByte(address, data); // Write data to flash uint32_t flashAddress = 0x08000000; uint32_t flashData = 0xAA; FLASH_WriteWord(flashAddress, flashData); // Read ADC value from light sensor ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); uint16_t adcValue = ADC_GetConversionValue(ADC1); // Generate sound using DAC DAC_SetChannel1Data(DAC_Align_12b_R, 2048); // Change the value as per desired sound DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE); // Perform operations with RTC // ... // Delay for a certain period of time for(uint32_t i = 0; i < 1000000; i++); } } ``` 请注意,上述代码仅供参考,你需要根据你的具体硬件和库文件进行适当的修改和配置。另外,一些模块的配置和操作可能需要额外的库文件支持,请根据你使用的库文件进行相应的配置和调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值