cubemx spi 中断_stm32 - STM32 cubeMX:使用中断触发SPI DMA中断 - 堆栈内存溢出

本文主要探讨在STM32 CubeMX环境下,使用SPI和DMA进行中断触发的数据传输遇到的问题。作者在尝试通过SPI发送数据到SPI显示器时,发现DMA只能工作一次,之后HAL_SPI_Transmit_DMA()返回HAL_BUSY。经过调试,发现中断服务例程中SPI的状态为HAL_SPI_STATE_READY,但无法再次启动DMA传输。寻求解决中断驱动的DMA传输正确方法。
摘要由CSDN通过智能技术生成

我目前正在练习使用SPI + DMA将数据发送到SPI显示器。 显示的数据顺序如下:

[拉低CS]-> [拉低D / C]-> [CMD的1个SPI字节]-> [拉高D / C]-> [数据的n个SPI字节]-> [拉高CS]。 D / C引脚是GPIO引脚。

我的想法是先拉低CS和D / C,然后通过HAL_SPI_Transmit_IT();发送1字节的CMD HAL_SPI_Transmit_IT(); 然后将D / C引脚拉高,并在SPI中断程序中开始DMA传输。 并且在DMA TxComplete中断中CS引脚将被拉高。

我的SPI的数据长度设置为8位,而DMA设置是存储到外设和增量模式的存储器。

我正在使用cubeMX生成代码,这大致是我的代码:

uint8_t displayData[DIS_DATA_BUFF_SIZE];

int main(void)

{

...init stuff from cubeMX

cmdBuffer[0].cmd = 0xAA;

cmdBuffer[0].amountOfData = 10;

cmdBuffer[0].pDataStart = displayData;

while (1)

{

HAL_Delay(500);

cmdBuffer[0].status = IN_USE;

pExecuteCmd = &cmdBuffer[0];

SPI_START();

DIS_CMD_MODE_ON();

HAL_SPI_Transmit_IT(&hspi2, &pExecuteCmd->cmd, 1);

}

}

这是我的SPI中断例程

void SPI2_IRQHandler(void)

{

/* USER CODE BEGIN SPI2_IRQn 0 */

uint8_t startDMA = 0;

if(__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE)){

if(pExecuteCmd->status == EXE_CMD){

DIS_CMD_MODE_OFF();

if(pExecuteCmd->amountOfData == 0){

SPI_END();

pExecuteCmd->status = EMPTY;

}else{

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值