STM32CUBEIDE(16)----内部Flash读写

概述本例程主要讲解如何对芯片自带flash进行读写,用芯片内部flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是stm32f103rbt6,128k大小的flash。 最近在弄st和gd的课程,需要gd样片的可以加群申请:615061293 。
视频教学[https://www.bilibili.com/video/bv19d4y1y7px/]
csdn课程课程更加详细。
[https://download.csdn.net/course/detail/35611]
硬件准备使用stm32cubemx生成例程,这里使用nucleo-f103rb开发板
查看原理图,pa2和pa3设置为开发板的串口。
配置串口。
查看原理图,pa8设置为pwm输出管脚,pa0设置为定时器输入捕获管脚。
配置时钟树配置时钟为64m。
串口重定向在main.c中,添加头文件,若不添加会出现 identifier file is undefined报错。
/* user code begin includes */#include stdio.h/* user code end includes */函数声明和串口重定向:
/* user code begin pfp *//* retarget the c library printf function to the usart */int fputc(int ch, file *f){ hal_uart_transmit(&huart2 , (uint8_t *)&ch, 1, 0xffff); return ch;}/* user code end pfp */flash定义对于stm32f103,有低、钟、高密度的flash类型。
低密度
中密度
高密度
对于stm32f103rb,flash大小为128kb,固为中密度的flash。
变量定义/* user code begin 0 */uint32_t writeflashdata[3] = {0x11111111,0x22222222,0x33333333};//数据uint32_t addr = 0x0801fc00;/* user code end 0 */如果要对flash进行写入数据,需要执行以下四步:
解锁flash擦除flash写入flash锁住flash擦除只能是按页或者整块擦除。 stm32f103rbt6的flash容量是128kb,所以只有128页,每页1kb。 我们可以写入到页127中,即0x0801fc00-0x0801ffff中。 由于单片机是32位,故连续写入多个uint32_t的数据时,地址应该依次增加4。
/* user code begin 4 *//*flash写入程序*/void writeflashtest(uint32_t l,uint32_t data[],uint32_t addr){ uint32_t i=0; /* 1/4解锁flash*/ hal_flash_unlock(); /* 2/4擦除flash*/ /*初始化flash_eraseinittypedef*/ /*擦除方式页擦除flash_typeerase_pages,块擦除flash_typeerase_masserase*/ /*擦除页数*/ /*擦除地址*/ flash_eraseinittypedef flashset; flashset.typeerase = flash_typeerase_pages; flashset.pageaddress = addr; flashset.nbpages = 1; /*设置pageerror,调用擦除函数*/ uint32_t pageerror = 0; hal_flashex_erase(&flashset, &pageerror); /* 3/4对flash烧写*/ for(i=0;i< l;i++) { hal_flash_program(flash_typeprogram_word, addr+4*i, data[i]); } /* 4/4锁住flash*/ hal_flash_lock();}/*flash读取打印程序*/void printflashtest(uint32_t l,uint32_t addr){ uint32_t i=0; for(i=0;i< l;i++) { printf(naddr is:0x%x, data is:0x%x, addr+i*4, *(__io uint32_t*)(addr+i*4)); }}/* user code end 4 */主程序
/* user code begin while */ while (1) { /* user code end while */ /* user code begin 3 */ writeflashtest(3,writeflashdata,addr); printflashtest(3,addr); hal_delay(5000); } /* user code end 3 */演示效果
通过stm32cubeide查看地址也可以看到,值正确写入。
最后以上的代码会在q群里分享。qq群:615061293。 或者关注微信公众号『记贴』,持续更新文章和学习资料,可加作者的微信交流学习!


CAD打开图纸后为什么文字显示为问号?怎么解决?
双向电平转换电路——AiP2206
DeepMind开始与谷歌深度融合,谷歌正在重新审视DeepMind如何证明其价值
Magic Leap正在希望通过区块链技术保护数据安全
三星撤销高通在韩被罚干预 将助高通反击博通收购
STM32CUBEIDE(16)----内部Flash读写
自研ARM芯片,微软真的准备好了吗?
新发售今日开始在美预订 华为推出三款新MateBook笔记本电脑
差压气密检测仪与直压气密性检测设备的区别
车载显示正在成为越来越多的新技术植入的重要终端
新华三与中国电信安徽公司联合发布天翼安全大脑
三相异步电动机的制动控制
我们该如何去做好一个连接器
2018年中国OLED行业分析:新兴市场消费潜力巨大,未来有望取代LCD显示器
无线充电器、有线充电器毫无可比性?
国芯思辰|基本半导体碳化硅肖特基二极管B2D10065Q用于升压电源模块
2019 年可能是过去十年最差的一年,但却是未来十年最好的一年
ZETA及纵行科技入选《2024年中国AIoT产业全景图谱》非蜂窝无线通信板块
SIP封装测试
季节交替时期除螨很重要!家用除螨仪热销排行TOP5