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

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

查看全部评分

Ljmp 回答时间:2016-11-16 17:45:57
再仔细找找!!!
youyouyouoy 回答时间:2016-11-29 17:59:09
HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef* sConfig, uint32_t Channel);hal库里的这个怎么调用?还是它不是函数,我按照函数的调用方法调用如下HAL_TIM_PWM_ConfigChannel(&TIM_InitTypeDef,&PWM_Config, TIM_CHANNEL_ALL);编译后提示错误undefined symbol HAL_TIM_PWM_ConfigChannel,我想问怎样才能把它变为函数调用?
zbber 回答时间:2016-11-29 21:34:03
多看看例程
any012 回答时间:2016-11-30 08:53:46
youyouyouoy 发表于 2016-11-29 17:59
HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef* sConfig, ui ...

第一个参数,是用到的定时器,比如是TIM1,一般在tim.c里有定义了,可能是htim1,你这里引用为参数的话,需要它的地址,就是&htim1。
youyouyouoy 回答时间:2016-11-30 10:31:47
        TIM_HandleTypeDef   TIM_InitTypeDef;
        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库里面这个不是函数,而是一个定义类型,需要自己写函数实现吗?
       
12下一页

所属标签

相似问题

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