最近用上了F030,在使用SPI的时候出现了一个问题,主模式中断读SX1276,一字节读没问题。两字节以上就直接进hardfault:void Sx1276_ReadNbytes(uint8_t addr, uint8_t *buffer, uint8_t size) { uint8_t SendData=addr&0x7f; uint8_t i=0; RF_CS0; HAL_SPI_Transmit_IT(&hspi1,&SendData,1); while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY); // HAL_SPI_Receive_IT(&hspi1,buffer,size); // while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY); for(i=0;i<size;i++) { HAL_SPI_Receive_IT(&hspi1,buffer++,1); while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY); } RF_CS1; } 上面程序注释部分是一次读多字节,这样会进hardfault,下面未注释的是一次读一字节,没有问题。 经过调试发现出问题在下面这个地方。 /* Check if packing mode is enabled and if there is more than 2 data to receive */ if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (hspi->RxXferCount >= 2U)) { /* Set fiforxthresold according the reception data length: 16 bit */ CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); //运行到此处,立马进hardfault。 } else { /* Set fiforxthresold according the reception data length: 8 bit */ SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); } 以前用L1都没有问题。有谁对F0比较熟的,能指点下是什么问题么,另外用了freeRTOS. |
【STM32F0开发日志/评测/笔记】+互补PWM波的产生
STM32F030 PB14和PB15无法输出PWM求助
【STM32F030探索套件】序列之五 外部中断
【STM32F0开发日志---二】+ucosii.2.92移植在STM32F030
上传个STM32F0+5110+内部温度传感器的菜鸟实例
【STM32F030探索套件使用问题】STM32F030 SPI方式驱动ST7565LCD失败
求一份STM32F051 I2C驱动LCD 12864的例程
STM32F0 M0 向结构体赋值进入HardFault异常
STM32F0 ADC-DMA方式采集2路数据时出现问题
STM32F030C8T6,TIM16定时慢很多问题?
评分
查看全部评分
不会超,100多的buffer,我试过只读2字节都有问题。
uint8_t SX1276Regs[0x70];
Sx1276_ReadNbytes(REG_LR_OPMODE,&SX1276Regs[1],(0x70-1));
没错啊,是这样用的,中断方式接收,接收1个字节都是可以的,大于等于2个字节的设置跟一个字节的设置的区别就在CR2寄存器的 FRXTH位清0或者置位,现在看来置位没问题,一清0就hardfault.
一般情况是用法不对,这么成熟的片片,官方不至于不知道有BUG吧。我初始认为,首先得从自身找问题。
评分
查看全部评分
CubeMX生成的代码,没有使用中断回调函数,能贴的已经完全贴出来了。
中断和初始化代码都是CubeMX自己生成的,没动过。
HAL_SPI_Receive_IT(&hspi1,buffer,20);
评分
查看全部评分
评分
查看全部评分