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

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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版