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

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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版