我使用的是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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>