最近在调试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));
}