STM32M0内核使用寄存器读写SPI数据

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值