单片机学习小组
直播中

王健

7年用户 919经验值
私信 关注

请问STM32M0内核如何使用寄存器读写SPI数据?

请问STM32M0内核如何使用寄存器读写SPI数据?

回帖(1)

康瑜玲

2022-2-17 10:24:29
最近在调试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));   
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分