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

CubeMX  I2C   官方中断方式例程

[复制链接]
hqw 提问时间:2019-1-23 13:32 /
STM32 CubeMX  I2C   官方中断方式例程
但看不出这I2C中断方式,中断的意义是什么?
do
  {

    if(HAL_I2C_Master_Transmit_IT(&I2cHandle, (uint16_t)I2C_ADDRESS, (uint8_t*)aTxBuffer, TXBUFFERSIZE)!= HAL_OK)
    {//HAL_I2C_Master_Transmit_IT( )这个函数在这里执行完,那应该整个数据包发送就发送完了,这样的话,中断用来干什么?除非它是在这里只是起
   //动发送第一个字节的发送和开中断,这样发完第一个字节,产生中断,然后在中断里再发送下一个字节,。。。但在例程和中断处理里,没看到这些呢。我所知在usart 发送的中断方式是这样的。真不知道这跟中断在哪个地方有关联。
      Error_Handler();
    }

    while (HAL_I2C_GetState(&I2cHandle) != HAL_I2C_STATE_READY)//上一句HAL_I2C_Master_Transmit_IT( ),执行完,就意味着数据发送完成了,不用在这里还等数据发送结束吧?
    {
    }

  }

while(HAL_I2C_GetError(&I2cHandle) == HAL_I2C_ERROR_AF);//这句作用是什么?






下面是接收:


  do
  {
    if(HAL_I2C_Master_Receive_IT(&I2cHandle, (uint16_t)I2C_ADDRESS, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
    {//HAL_I2C_Master_Receive_IT(  )这一句只是使能接收中断而已吗?也就是说,这一句执行完,并不是数据包都接收完了,而是在接收中断产生时,去接收一个字节,把它放在aRxBuffer,再退出中断,下次中断产生,再按同样的方式去把接收到的字节放到aRxBuffer?但在这个例程里看不到它在中断时
是怎样运作的。
      Error_Handler();
    }
  }

  while(HAL_I2C_GetError(&I2cHandle) == HAL_I2C_ERROR_AF);//这句的作用是什么呢?


例程是有英文注释,但看了还是弄不清楚。
所以在此请教下理解得很透彻的高手。谢谢


1.png
2.png

I2C_TwoBoards_ComIT.zip

下载

3.39 MB, 下载次数: 84, 下载积分: ST金币 -1

收藏 1 评论14 发布时间:2019-1-23 13:32

举报

14个回答
斜阳 回答时间:2019-1-23 14:51:55
HAL_I2C_Master_Transmit_IT()只是启动传输,完成之后会有回调

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

Kevin_G 回答时间:2019-1-24 10:07:37
中断是为了释放CPU资源啊

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

熊二在深圳 回答时间:2019-1-25 09:37:51
看这些中断的代码,主要是找回调函数,才能知道中断干什么。

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

watershade 回答时间:2019-1-25 10:25:34
是这样的两个带_IT的作用就是非堵塞的。如果说人话:就是你发送完_IT之后,这段程序只会告诉你你这个发送“指令”又没又真的执行,而发送的过程其实还在进行。希望这样你可以理解。
正如很多朋友说的你如果争取调用IT之后,程序就会执行发送或接收,当发送或接收完成就会给执行你回调函数的程序。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

hqw 回答时间:2019-1-26 12:27:03
斜阳__ 发表于 2019-1-23 14:51
HAL_I2C_Master_Transmit_IT()只是启动传输,完成之后会有回调

假如是如你所说HAL_I2C_Master_Transmit_IT()只是启动传输,那么真正的传输动作在哪里去做的?完成之后会有回调,你所说的完成,是指传输完一个节还是整个数据包?还有,这回调要去做哪些东西?这回调里面什么都不写行不行呢?
   请教下
hqw 回答时间:2019-1-26 12:41:16
Kevin201707 发表于 2019-1-24 10:07
中断是为了释放CPU资源啊

在I2C传输过程中,能中断去做其他事吗?特别是在传输一个BIT时,或说传输完一个bYTE,在传输下一个BYTE的间隙,中断去做其他事情倒或有点可能?
  也就是说,在传输过程只能专一地把I2C这件事做好,做完了才能释放CPU资源去干别的
hqw 回答时间:2019-1-26 12:44:31
watershade 发表于 2019-1-25 10:25
是这样的两个带_IT的作用就是非堵塞的。如果说人话:就是你发送完_IT之后,这段程序只会告诉你你这个发送“ ...

不理解兄弟要表达什么
斜阳 回答时间:2019-1-28 09:26:11
hqw 发表于 2019-1-26 12:27
假如是如你所说HAL_I2C_Master_Transmit_IT()只是启动传输,那么真正的传输动作在哪里去做的?完成之后 ...

1、先看参考手册,把这块儿看通,
2、然后看HAL 的API手册

启动发送之后,片上外设将数据发送出去,一个byte发送完后触发中断。这个中断由HAL库处理,用于装填新数据。当所有数据发送完成后,HAL库会进行发送完成回调,通知用户程序。

ps:如果想深入理解就好好看看参考手册,先看懂外设是怎么运行的。或者看原子、安富莱等学习板的教程。在学习上你偷懒没有一点好处。如果只是想跑通就跟着示例来。
西奥伟 回答时间:2019-1-28 10:24:56
建议楼主先看一下HAL库的串口中断发送和中断接收的过程,就知道HAL库的中断发送和接收的特点了,感觉你对HAL库的中断实现还没有弄懂,所以,可以先去百度下相关的知识。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

radio2radio 回答时间:2019-1-28 10:42:55
本帖最后由 radio2radio 于 2019-1-28 10:55 编辑
hqw 发表于 2019-1-26 12:41
在I2C传输过程中,能中断去做其他事吗?特别是在传输一个BIT时,或说传输完一个bYTE,在传输下一个BYTE的 ...

“在传输过程只能专一地把I2C这件事做好,做完了才能释放CPU资源去干别的”
I2C是CPU的外设,而且是硬件I2C,CPU装填完了数据(一个字节,或更多)就不用管了,可以干别的去。
硬件I2C的好处就在这里。

坊间有一个不正确的观念,就是硬件I2C不好用,喜欢自己能“完全控制”的软件I2C。软件I2C使用更多的CPU资源。
应该是把硬件I2C研究透彻。
希望在转角 回答时间:2019-9-17 16:51:53
楼主,请问“STM32 CubeMX  I2C   官方中断方式例程”在哪里可以下载到?
雷霆万钧1027 回答时间:2019-10-20 00:17:35
macompengluo 发表于 2019-9-17 16:51
楼主,请问“STM32 CubeMX  I2C   官方中断方式例程”在哪里可以下载到?

同问!~~
hellolinux 回答时间:2020-2-17 23:09:57

stm32cube_fw_f1_v180.zip

对应的DEMO板example例程中
hellolinux 回答时间:2020-2-17 23:10:39

stm32cube_fw_f1_v180.zip

对应的DEMO板example例程中

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版