完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
最近在调试STM32M0内核单片机读写flash的程序直接使用HAL库函数是没有问题的,但是读取速度也是十分感人。于是就想起了直接通过操作寄存器的方式来读写。完事开头难,直接从STM32F103C8T6程序上copy了一份出来,程序如下:
u8 SPI_W25QWriteRead(u8 data) { u8 spi_wait_time = 0; spi_wait_time = 0; while(((SPI2 -> SR) & 0x02) == 0) /* 等待发送缓冲区空*/ { spi_wait_time ++; if(spi_wait_time>=255) break; } //直接向DR寄存器里存放数据 SPI2->DR = data; spi_wait_time = 0; while(((SPI2 -> SR) & 0x01) == 0) /* 等待接收缓冲区满 */ { spi_wait_time ++; if(spi_wait_time>=255) break; } return ((u8)(SPI2 -> DR)); } 万万没有想到直接使用M0内核的单片机直接读写错误,经过不懈努力的查询资料发现: M3内核直接写DR寄存器,单片机会自动根据你的配置数据长度8/16发送数据 M0内核直接写DR寄存器,单片机不会根据你写的数据长度发送,依旧发送的是16bits 于是做了一下小更改,直接把MO内核单片机DR强转成8bits宽度的指针,由于我发送的数据只是8bit,所以也就不用管其他的了,程序如下: u8 SPI_W25QWriteRead(u8 data) { u8 spi_wait_time = 0; spi_wait_time = 0; while(((SPI2 -> SR) & 0x02) == 0) /* 等待发送缓冲区空*/ { spi_wait_time ++; if(spi_wait_time>=255) break; } //将DR寄存器强制转换为8bit宽度的指针后再存放数据 (*((volatile unsigned char*)(&SPI2->DR)))= data; spi_wait_time = 0; while(((SPI2 -> SR) & 0x01) == 0) /* 等待接收缓冲区满 */ { spi_wait_time ++; if(spi_wait_time>=255) break; } return ((u8)(SPI2 -> DR)); } |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
2531 浏览 0 评论
3344 浏览 9 评论
3023 浏览 16 评论
3515 浏览 1 评论
9119 浏览 16 评论
1246浏览 3评论
637浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
627浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2376浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1940浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-26 15:52 , Processed in 1.024320 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号