hqw 发表于 2019-1-23 13:32:42

CubeMX  I2C   官方中断方式例程

STM32 CubeMXI2C   官方中断方式例程
但看不出这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);//这句的作用是什么呢?


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


斜阳__ 发表于 2019-1-23 14:51:55

HAL_I2C_Master_Transmit_IT()只是启动传输,完成之后会有回调

Kevin201707 发表于 2019-1-24 10:07:37

中断是为了释放CPU资源啊

笨熊 发表于 2019-1-25 09:37:51

看这些中断的代码,主要是找回调函数,才能知道中断干什么。

watershade 发表于 2019-1-25 10:25:34

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

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
查看完整版本: CubeMX  I2C   官方中断方式例程