请问有人用HAL库做过 SPI+DMA的实验吗?我一直调不通

2019-07-20 01:12发布

我使用的是STM32F767,第一次用HAL库,有点懵,请问一下有人做过吗,分享一下?

附上我的源码(我使用的是SPI3,IO中断的时候读取SPI 到 DMA):

u8_t          m_DMA1_buf[9];


void HAL_SPI_MspInit( SPI_HandleTypeDef *hspi )
{
    GPIO_InitTypeDef GPIO_Initure;

    //初始化ADC SPI驱动
    __HAL_RCC_GPIOC_CLK_ENABLE();       //使能GPIOE时钟
    __HAL_RCC_SPI3_CLK_ENABLE();        //使能SPI3时钟
    GPIO_Initure.Pin       = GPIO_PIN_10 | GPIO_PIN_11|GPIO_PIN_12;
    GPIO_Initure.Mode      = GPIO_MODE_AF_PP;         //复用推挽输出
    GPIO_Initure.Pull      = GPIO_PULLUP;             //上拉
    GPIO_Initure.Speed     = GPIO_SPEED_FAST;         //快速
    GPIO_Initure.Alternate = GPIO_AF6_SPI3;           //复用为SPI3
    HAL_GPIO_Init( GPIOC, &GPIO_Initure );
    return;
}

u32_t NPEC_SPI3_DMA_RXconfig(void)
{
    u32_t err = 0;
    __HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
    __HAL_LINKDMA(&SPI3_Handler,hdmarx,SPI3RxDMA_Handler);              //将DMA与SPI2联系起来(发送DMA)

    //Rx DMA配置
    SPI3RxDMA_Handler.Instance       = DMA1_Stream0;                   //数据流选择
    SPI3RxDMA_Handler.Init.Channel   = DMA_CHANNEL_0;                  //通道选择
    SPI3RxDMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY;           //外设到存储器
    SPI3RxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE;               //外设非增量模式
    SPI3RxDMA_Handler.Init.MemInc    = DMA_MINC_ENABLE;                //存储器增量模式
    SPI3RxDMA_Handler.Init.PeriphDataAlignment=DMA_MDATAALIGN_BYTE;       //外设数据长度:8位
    SPI3RxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;   //存储器数据长度:8位
    SPI3RxDMA_Handler.Init.Mode=DMA_NORMAL;                            //外设流控模式
    SPI3RxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    SPI3RxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    SPI3RxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    SPI3RxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                     //存储器突发单次传输
    SPI3RxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输

    err = HAL_DMA_DeInit(&SPI3RxDMA_Handler);   
    err = HAL_DMA_Init(&SPI3RxDMA_Handler);
   
//    HAL_NVIC_SetPriority( DMA1_Stream0_IRQn, 3, 3 );  //接收DMA中断优先级
//    HAL_NVIC_EnableIRQ( DMA1_Stream0_IRQn );
   
    return err;

}


void SPI3_Init( void )
{
    SPI3_Handler.Instance         = SPI3;                            //SP3
    SPI3_Handler.Init.Mode        = SPI_MODE_MASTER;                 //设置SPI工作模式,设置为主模式
    SPI3_Handler.Init.Direction   = SPI_DIRECTION_2LINES;            //设置SPI单向或者双向的数据模式:SPI设置为双线模式
    SPI3_Handler.Init.DataSize    = SPI_DATASIZE_8BIT;               //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI3_Handler.Init.CLKPolarity = SPI_POLARITY_HIGH;               //串行同步时钟的空闲状态为高电平
    SPI3_Handler.Init.CLKPhase    = SPI_PHASE_1EDGE;                 //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    SPI3_Handler.Init.NSS         = SPI_NSS_SOFT;                    //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
    SPI3_Handler.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;   //定义波特率预分频的值:波特率预分频值为256
    SPI3_Handler.Init.FirstBit          = SPI_FIRSTBIT_MSB;          //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI3_Handler.Init.TIMode            = SPI_TIMODE_DISABLE;        //关闭TI模式
    SPI3_Handler.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
    SPI3_Handler.Init.CRCPolynomial     = 7;                         //CRC值计算的多项式
    HAL_SPI_Init( &SPI3_Handler );//初始化
    __HAL_SPI_ENABLE( &SPI3_Handler );                               //使能SPI4
    NPEC_SPI3_DMA_RXconfig();
    return;
}


void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
{
    u32_t err = 0;
    if ( GPIO_Pin == GPIO_PIN_15 )
    {
       HAL_SPI_Receive_DMA(&SPI3_Handler,(void*)m_DMA1_buf,8);
    }
    err = err;
    return;
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
Yefeng是叶峰
1楼-- · 2019-07-20 06:48
终于调通了,原来SPI传输的话需要发送和接收的DMA都打开才行
peng1554
2楼-- · 2019-07-20 11:41
 精彩回答 2  元偷偷看……
Yefeng是叶峰
3楼-- · 2019-07-20 11:46
没人看,请问一下HAL库 SPI的阻塞和非阻塞配置方式是不是不一样呀?
Yefeng是叶峰
4楼-- · 2019-07-20 17:09
有人吗?自己水一下帖子
Ldd69stm32
5楼-- · 2019-07-20 22:48
 精彩回答 2  元偷偷看……

一周热门 更多>