STM32入门学习笔记之外置FLASH读写实验(下)

(2)创建w25q128.c并输入以下代码。
/********************************************************************************************************* flash 驱 动 程 序*********************************************************************************************************/#include w25q128.h #include delay.h/***************************************************name :spi2_setspeedfunction :spi2速度设置函数paramater : speedset:0~7return :none***************************************************/void spi2_setspeed( u8 speedset ){ speedset &= 0x07 ; //限制范围 spi2->cr1 &= 0xffc7 ; spi2->cr1 |= speedset=0xfffe ) return 0 ; } spi2->dr = txdata ; //发送一个byte //等待接收完一个byte retry = 0 ; while( ( spi2->sr&0x01 )==0 ) { retry ++ ; //超时退出 if( retry>=0xfffe ) return 0 ; } return spi2->dr ; //返回收到的数据}/***************************************************name :w25qxx_initfunction :初始化w25q128芯片paramater :nonereturn :none***************************************************/void w25qxx_init(){ rcc->apb2enr |= 1crh |= 0xbbb30000 ; //pb12推挽输出+pb13/14/15复用 gpiob->odr |= 0x716 ) ) ; //发送24bit地址 spi2_readwritebyte( ( u8 )( address>>8 ) ) ; spi2_readwritebyte( ( u8 )address ) ; w25qxx_cs = 1 ; //取消片选 w25qxx_wait_busy() ; //等待擦除完成}/***************************************************name :w25qxx_readfunction :在指定地址开始读取指定长度的数据paramater : pbuffer:数据存储区 address:开始读取的地址 len:要读取的字节数return :none***************************************************/void w25qxx_read( u8 *pbuffer, u32 address, u16 len ){ u16 i ; w25qxx_cs = 0 ; //使能器件 spi2_readwritebyte( w25x_readdata ) ; //发送读取命令 spi2_readwritebyte( ( u8 )( address>>16 ) ) ; //发送24bit地址 spi2_readwritebyte( ( u8 )( address>>8 ) ) ; spi2_readwritebyte( ( u8 )address ); for( i=0; i>16 ) ) ; //发送24bit地址 spi2_readwritebyte( ( u8 )( address>>8 ) ) ; spi2_readwritebyte( ( u8 )address ) ; for( i=0; i256 ) pageremain = 256 ; //不够256个字节了 else pageremain = len ; } }}/***************************************************name :w25qxx_write_nocheckfunction :在指定地址开始写入指定长度的数据paramater : pbuffer:数据存储区 address:开始写入的地址 len:要写入的字节数return :none***************************************************/u8 w25qxx_buffer[ 4096 ] ;void w25qxx_write( u8 *pbuffer, u32 address, u16 len ){ u32 secpos ; u16 secoff ; u16 secremain ; u16 i ; u8 *w25qxx_buf ; w25qxx_buf = w25qxx_buffer ; secpos = address/4096 ; //扇区地址 secoff = address%4096 ; //在扇区内的偏移 secremain = 4096-secoff ; //扇区剩余空间大小 //不大于4096个字节 if( len<=secremain ) secremain = len ; while( 1 ) { w25qxx_read( w25qxx_buf, secpos*4096, 4096 ) ; //读出整个扇区的内容 //校验数据 for( i=0; i#include sys.h#include delay.h#include usart1.h#include lcd.h#include w25q128.hconst u8 text_buffer[] = { warship stm32f1 spi test } ;#define size sizeof( text_buffer )int main(){ u8 datatemp[ size ] ; u32 flash_size ; stm32_clock_init( 9 ) ; //stm32时钟初始化 systick_init( 72 ) ; //systick初始化 usart1_init( 72, 115200 ) ; //初始化串口1波特率115200 lcd_init() ; //lcd初始化 w25qxx_init() ; //w25qxx初始化 point_color = red ; //设置字体为红色 flash_size = 128*1024*1024 ; //flash 大小为16m字节 w25qxx_write( (u8*)text_buffer, flash_size-100, size ) ; //从倒数第100个地址处开始,写入size长度的数据 w25qxx_read( datatemp, flash_size-100, size ) ; //从倒数第100个地址处开始,读出size个字节 lcd_showstring( 0, 0, datatemp ) ; //显示读到的字符串 while( 1 ) { }}

盘点颠覆传统制造业的革命性技术TOP6
台积电扩产全面放缓!芯片大厂纷纷减产,对上游材料、设备有何影响?
5G发展的前路依旧困难重重,EXFO为5G提供最新的网络测试解决方案
小功率UPS使用技巧
孙宏斌再度接盘乐视在等一个时机,乐视网股权处理揭开序幕
STM32入门学习笔记之外置FLASH读写实验(下)
来说下51单片机中常见的几种电路
PCBA测试架到底是什么有什么作用
新思科技的软件质量与安全解决方案获得行业认可
尼桑电机的可变磁通结构及可变磁通的关键
长安这是要与吉利帝豪死磕的节奏,价格亲民、外观帅气、内饰豪华,价格比帝豪还便宜1.7万!
智慧农业物联网解决方案—农业产业园信息化建设
十种变频器维修方法,值得收藏!
Wi-Fi7与Wi-Fi6相比有哪些进步,可以实现哪些功能
浅谈嵌入式工控主板在便携式B超诊断仪中的应用优势
双十一选什么充电宝比较好?口碑好的充电宝品牌推荐
相比较而言 老年人比年轻人更能接受机器人
基于RoboMasterC板的RT-Thread使用分享—PWM扩展实验
关于MP2632单芯片解决方案的分析和介绍
国产芯片龙头股有哪些