你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL库里关于stm32_hal_spi.h头文件里的几个函数,不明白其用途

[复制链接]
any012 提问时间:2016-11-16 16:09 /
悬赏3ST金币已解决
以前用标准库,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_Hand ...
收藏 1 评论18 发布时间:2016-11-16 16:09

举报

18个回答
党国特派员 回答时间:2016-11-16 16:09:56
使用中断你要做的就是重写
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,需要自己来实现。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

wofei1314 回答时间:2016-11-16 16:21:25
本帖最后由 wofei1314 于 2016-11-16 16:24 编辑

建议看一下Cube里自带的例程
目录里“...Examples\SPI\”下有例程
any012 回答时间:2016-11-16 16:27:36
党国特派员 发表于 2016-11-16 16:24
使用中断你要做的就是重写
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_RxCpltCa ...

好奇的是void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi);这个函数没有调用回调函数。
党国特派员 回答时间:2016-11-16 16:37:27
本帖最后由 党国特派员 于 2016-11-16 16:39 编辑
any012 发表于 2016-11-16 16:27
好奇的是void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi);这个函数没有调用回调函数。 ...

那肯定是你没有认真阅读代码,打PP了。
QQ图片20161116163708.png

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

any012 回答时间:2016-11-16 16:38:56
本帖最后由 any012 于 2016-11-16 16:46 编辑
党国特派员 发表于 2016-11-16 16:37
那肯定是你没有认真阅读代码,打PP了。

额,确实该打...
看到箭头,就以为这就是个寄存器赋值呢。

这用法有点高级哎,结构体变量里定义的是个函数指针,然后HAL_SPI_Transmit_IT()这里函数里,确定指针指向哪个函数...
Paderboy 回答时间:2016-11-16 16:46:32
多看看例程。。。。
any012 回答时间:2016-11-16 16:57:03
wofei1314 发表于 2016-11-16 16:21
建议看一下Cube里自带的例程
目录里“...Examples\SPI\”下有例程

能否说下详细的目录?
用cube_mx建的工程,应该是没有例程的。
查找了下cube_mx的安装目录,貌似也没找到例程。
xhzheng 回答时间:2016-11-16 17:09:53
我都是使用cube MX进行的;
里面有部分例程;
wofei1314 回答时间:2016-11-16 17:21:18
any012 发表于 2016-11-16 16:57
能否说下详细的目录?
用cube_mx建的工程,应该是没有例程的。
查找了下cube_mx的安装目录,貌似也没找到 ...

我也是偶然发现,要看一下的系统,我的是win10,默认路径安装,路径如下(XXXX代表你的用户名):
C:\Users\XXXX\STM32Cube\Repository


方案二:重新下载Cube库,下载压缩包,解压压缩包就能看到....

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版