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

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, 下载次数: 73, 下载积分: 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

查看全部评分

Kevin201707 回答时间: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

查看全部评分

12下一页

所属标签

相似问题

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