
以前用标准库,SPI无非用到的库函数就是,初始化,使能SPI,使能SPI中断,SPI发送接收函数。 现在试着用HAL库,结果找不到SPI使能函数,有发送、接收、发送并接收三个函数... 在这三个函数里,发现了SPI使能的宏定义,好像完成发送或接收SPI数据后,并没有调用管段SPI功能的宏。 我是用到了SPI的从模式,想在外部某个引脚得到信号后,开启SPI接收中断,外部引脚丢失信号后,关断SPI接收中断。 现在不知道该怎么写了。 HAL_SPI_Transmit_IT()、HAL_SPI_Receive_IT()、HAL_SPI_TransmitReceive_IT()这三个函数,都是在函数体里自动开启了SPI中断。实在是看不懂这三个函数应该在什么情况下用。 void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi)函数,没有像串口或定时器或外部中断函数那样,里面没有回掉函数。难道是直接在这个中断函数里写自己的程序部分? 附stm32_hal_spi.h HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout); HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi); HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi); HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi); void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi); void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi); void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi); void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi); void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi); void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi); |
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi);
以Callback结尾的函数。
它们的实现都是__weak,需要自己来实现。
评分
查看全部评分
建议看一下Cube里自带的例程
目录里“...Examples\SPI\”下有例程
好奇的是void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi);这个函数没有调用回调函数。
那肯定是你没有认真阅读代码,打PP了。
评分
查看全部评分
额,确实该打...
看到箭头,就以为这就是个寄存器赋值呢。
这用法有点高级哎,结构体变量里定义的是个函数指针,然后HAL_SPI_Transmit_IT()这里函数里,确定指针指向哪个函数...
能否说下详细的目录?
用cube_mx建的工程,应该是没有例程的。
查找了下cube_mx的安装目录,貌似也没找到例程。
里面有部分例程;
我也是偶然发现,要看一下的系统,我的是win10,默认路径安装,路径如下(XXXX代表你的用户名):
C:\Users\XXXX\STM32Cube\Repository
方案二:重新下载Cube库,下载压缩包,解压压缩包就能看到....
评分
查看全部评分
第一个参数,是用到的定时器,比如是TIM1,一般在tim.c里有定义了,可能是htim1,你这里引用为参数的话,需要它的地址,就是&htim1。
TIM_OC_InitTypeDef PWM_Config;
PWM_Config.OCMode=TIM_OCMODE_PWM2;
PWM_Config.OCPolarity=TIM_OCPOLARITY_HIGH;
PWM_Config.OCFastMode=TIM_OCFAST_ENABLE;
HAL_TIM_PWM_ConfigChannel(&TIM_InitTypeDef, &PWM_Config, TIM_CHANNEL_ALL);
我是这样用的,编译后提示错误demo4\demo4.axf: Error: L6218E: Undefined symbol HAL_TIM_PWM_ConfigChannel (referred from timer.o).
所以hal库里面这个不是函数,而是一个定义类型,需要自己写函数实现吗?