OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4972|回复: 4

STM32F4 I2C3做slave中断后systick不能进中断

[复制链接]

11

主题

114

帖子

0

精华

高级会员

Rank: 4

积分
738
金钱
738
注册时间
2016-1-20
在线时间
188 小时
发表于 2022-5-25 16:03:38 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 CCXX 于 2022-5-25 16:05 编辑

使用STM32F401的I2C3做smbus slave,I2C3不接host的时候一切正常。当I2C host以100KHz每500ms发一包数据,slave接收中断后导致操作系统不能调度,debug发现是systick不能进中断了,我试过把I2C3的优先级调到最低也是这样。i2c3使用PA8和PB4,初始化和中断函数如下,麻烦大家帮忙分一下,谢谢。

  1. void pcie_smbus_init(void)
  2. {
  3.     RCC->AHB1ENR |= 0xff;
  4.     GPIOA->MODER &= ~(0x3 << (8 * 2));
  5.     GPIOA->MODER |=  (0x2 << (8 * 2));
  6.     GPIOA->OTYPER |=  1 << 8;
  7.     GPIOA->PUPDR &= ~(0x3 << (8 * 2));
  8.     GPIOA->PUPDR |=  (0x1 << (8 * 2));
  9.     GPIOA->AFR[1] = 4;

  10.     GPIOB->MODER &= ~(0x3 << (4 * 2));
  11.     GPIOB->MODER |=  (0x2 << (4 * 2));
  12.     GPIOB->OTYPER |=  1 << 4;
  13.     GPIOB->PUPDR &= ~(0x3 << (4 * 2));
  14.     GPIOB->PUPDR |=  (0x1 << (4 * 2));
  15.     GPIOB->AFR[0] = 9 << (4 * 4);

  16.     RCC->APB1ENR |= 1 << 23;
  17.     I2C3->CR1 = 0;
  18.     I2C3->CR2 |= 1 << 10;
  19.     I2C3->CR2 |= 1 << 9;
  20.     I2C3->CR2 |= 1 << 8;
  21.     I2C3->CR2 |= 42;

  22.     I2C3->OAR1 = 0xa0;
  23.     I2C3->OAR2 = 0x50 | 0x01;
  24.     I2C3->SR1 = 0;
  25.     I2C3->SR2 = 0;
  26.     I2C3->CCR = 210;
  27.     I2C3->TRISE = 0x2b;

  28.     I2C3->CR1 |= 1 << 1;
  29.     I2C3->CR1 |= 1 << 0;
  30.     I2C3->CR1 |= 1 << 10;

  31.     NVIC->IP[I2C3_EV_IRQn] = 0 << 4;
  32.     NVIC->ISER[I2C3_EV_IRQn / 32] |= (1 << (I2C3_EV_IRQn % 32));
  33.     NVIC->IP[I2C3_ER_IRQn] = 0 << 4;
  34.     NVIC->ISER[I2C3_ER_IRQn / 32] |= (1 << (I2C3_ER_IRQn % 32));
  35. }
复制代码

  1. unsigned char g_smbus_buffer[256] = {0};
  2. unsigned int g_count = 0;
  3. void I2C3_EV_IRQHandler(void)
  4. {
  5.     volatile unsigned short sr1 = 0;
  6.     volatile unsigned short sr2 = 0;

  7.     sr1 = I2C3->SR1;
  8.     sr2 = I2C3->SR2;

  9.     if((sr2 & 0x0005) == 0x0000)
  10.     {
  11.         if((sr1 & (1 << 0)) == (1 << 0))//start
  12.         {
  13.         }
  14.         if((sr1 & (1 << 1)) == (1 << 1))//addr matched
  15.         {
  16.             g_count = 0;
  17.             memset(g_smbus_buffer, 0, sizeof(g_smbus_buffer));
  18.         }
  19.         if((sr1 & (1 << 2)) == (1 << 2))//byte finished
  20.         {
  21.         }
  22.         if((sr1 & (1 << 4)) == (1 << 4))//stop
  23.         {
  24.         }
  25.         if((sr1 & (1 << 6)) == (1 << 6))//recv data
  26.         {
  27.             g_smbus_buffer[g_count++] = I2C3->DR;
  28.         }
  29.     }
  30. }

  31. void I2C3_ER_IRQHandler(void)
  32. {
  33.     volatile unsigned short sr1 = 0;
  34.     sr1 = I2C3->SR1;

  35.     if((sr1 & (1 << 11)) == (1 << 11))//OVR
  36.     {
  37.         I2C3->CR1 &= ~(1 << 11);
  38.     }
  39.     if((sr1 & (1 << 10)) == (1 << 10))//AF
  40.     {
  41.         I2C3->CR1 &= ~(1 << 10);
  42.     }
  43.     if((sr1 & (1 << 9)) == (1 << 9))//ARLO
  44.     {
  45.         I2C3->CR1 &= ~(1 << 9);
  46.     }
  47.     if((sr1 & (1 << 8)) == (1 << 8))//BERR
  48.     {
  49.         I2C3->CR1 &= ~(1 << 8);
  50.     }
  51. }
复制代码



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

114

帖子

0

精华

高级会员

Rank: 4

积分
738
金钱
738
注册时间
2016-1-20
在线时间
188 小时
 楼主| 发表于 2022-5-25 16:15:09 | 显示全部楼层
虽然进不了systicck中断,但是 i2c3接收数据是正常的,systick看起来也正常
Dingtalk_20220525161148.jpg
回复

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2021-8-13
在线时间
262 小时
发表于 2022-5-25 17:17:22 | 显示全部楼层
帮顶   
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2022-5-25 17:27:40 | 显示全部楼层
没用过32的硬件i2c,之前听说有问题不敢用
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2022-5-25 22:12:36 | 显示全部楼层
F3和F0的硬件iic主和从设备模式都是可以,速度100K
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 18:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表