硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1355|回复: 23
收起左侧

[有问必答] 10us的中断影响主程序执行怎么办

  [复制链接]

10

主题

43

回帖

73

积分

初级会员

积分
73
发表于 2022-9-15 16:48:09 | 显示全部楼层 |阅读模式
如题,主程序任务如下:1. 四路串口中断+DMA;
2. AD7606 100kHz进行AD采样,407通过SPI读取ADC值,采用10us中断定时读取,在中断内通过SPI读取ADC值;
3. 读取的ADC数据通过SPI实时存储至RAM;
4. 实时读取RAM内村粗数据并通过网口发出,正常情况1s发送1k数据,故障情况时1s发送100k数据;

现在发现10us中断太频繁影响其他任务执行,但是100kHz的采样频率必须满足,请问各位大佬有什么好的解决方案,谢谢!

现在AD7606与RAM的SPI通信均采用eric大佬推荐的加快SPI连续读写速度的方式,改成DMA方式能有改善吗
https://www.armbbs.cn/forum.php? ... 5&fromuid=46727




回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2022-9-16 10:10:12 | 显示全部楼层
如果F407全速运行的话,10us中断不应该有问题。定时器触发ADC,ADC用DMA自动读取,采用spi->DMA的操作。串口发送也用DMA。 中断函数进行优化,不要用浮点。
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2022-9-16 10:17:21 | 显示全部楼层
caicaptain2 发表于 2022-9-16 10:10
如果F407全速运行的话,10us中断不应该有问题。定时器触发ADC,ADC用DMA自动读取,采用spi->DMA的操作。串 ...

我现在主频设的最大168,串口发送也是DMA,ADC读16位无符号数,没用浮点,读完缓存数组。但是从上位机接收网口数据发现数据发送频率不太对,而且数据也不太正常。我先改为定时器+DMA试试。
回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2022-9-16 11:20:58 | 显示全部楼层
lishang4650 发表于 2022-9-16 10:17
我现在主频设的最大168,串口发送也是DMA,ADC读16位无符号数,没用浮点,读完缓存数组。但是从上位机接 ...

我做过一个产品,采样1MHz,还有emwin驱动屏幕,还有3个串口,RTOS的任务有七八个呢,完全没有问题。 但是,但是,我没有用过网口。。。不清楚资源需求如何。
要充分利用dma,自动触发,自动存储,自动发送的各种外设。中断里面的语句不超过10行。关键的中断,不要用HAL库生成的那种复杂的,自己写代码,清标志、设标志什么的。
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2022-9-16 14:21:59 | 显示全部楼层
caicaptain2 发表于 2022-9-16 11:20
我做过一个产品,采样1MHz,还有emwin驱动屏幕,还有3个串口,RTOS的任务有七八个呢,完全没有问题。 但 ...

大佬,你之前做的1MHz的采样是用的单片机自带的ADC还是用的专门AD采样芯片。还有个问题,我现在采用AD芯片外部中断触发DMA,在中断里进行DMA读取,不适用HAL,直接寄存器操作 估计也得超过10行语句,这个限制有点困难啊
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2022-9-16 14:59:33 | 显示全部楼层
测一下10us定时中断里的操作用了多长时间,占空比搞了肯定影响程序运行
回复

使用道具 举报

5

主题

133

回帖

148

积分

初级会员

积分
148
发表于 2022-9-16 15:36:08 | 显示全部楼层
之前用过  定时器触发DMA  往SPI->DR 里面填数据的,你要是在中断里面操作SPI读数据,光是读数据就要花费不少us
回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2022-9-16 15:47:58 | 显示全部楼层
lishang4650 发表于 2022-9-16 14:21
大佬,你之前做的1MHz的采样是用的单片机自带的ADC还是用的专门AD采样芯片。还有个问题,我现在采用AD芯 ...

没有研究过AD7606,可能有所区别。  先研究一下,能否用定时器的输出来自动触发AD7606,再考虑SPI的DMA读取。 另外,mdk在调试的时候,可以查看pc计数器,你可以推算出每个函数的执行时间。再分析分析。
如果DMA没有办法操作了,就确实存在困难。。。

最后,建议换芯片吧,如果确实需要16bit的话,用并口ADC。至少并口的协议标准些,可以利用上DMA通道。
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2022-9-16 16:05:51 | 显示全部楼层
cumtjdxcz 发表于 2022-9-16 14:59
测一下10us定时中断里的操作用了多长时间,占空比搞了肯定影响程序运行

用示波器测了下中断里代码从开始执行到结束大概4us的时间
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2022-9-16 16:11:47 | 显示全部楼层
caicaptain2 发表于 2022-9-16 15:47
没有研究过AD7606,可能有所区别。  先研究一下,能否用定时器的输出来自动触发AD7606,再考虑SPI的DMA读 ...

我现在的处理方式是定时器输出10us周期,占空比90%的PWM驱动AD芯片循环转换,AD转换完成产生EXTI中断进行SPI读取。测了下读取函数执行时间约4us。
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2022-9-16 16:13:16 | 显示全部楼层
无关风月 发表于 2022-9-16 15:36
之前用过  定时器触发DMA  往SPI->DR 里面填数据的,你要是在中断里面操作SPI读数据,光是读数据就要花费不 ...

我测了下我的读取函数耗时4us,不在中断里读没法满足10us读一次的需求啊,有什么其他推荐方案吗
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2022-9-16 16:29:13 | 显示全部楼层
贴点代码及测试结果吧,进入中断处理函数IO置高,出中断处理函数IO置低,以测试函数执行时间
image.png
image.png
image.png
image.png
image.png
对比2、3和4、5图,if条件判断这块占用时间约4%*10us = 0.4us。
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2022-9-16 16:34:16 | 显示全部楼层
image.png
回复

使用道具 举报

5

主题

65

回帖

80

积分

初级会员

积分
80
发表于 2022-9-16 16:58:23 | 显示全部楼层
SPI也可以用DMA,还有别把spi读取放到中断里,放到主循环里;可以设置FLAG,提示主循环可以读取了,只要读取时间小于10us就不影响
回复

使用道具 举报

5

主题

133

回帖

148

积分

初级会员

积分
148
发表于 2022-9-18 10:09:59 | 显示全部楼层
本帖最后由 无关风月 于 2022-9-19 09:13 编辑

不了解AD7606,不过看你说的样子是给个脉冲触发一次 采集一次
可以试试下面这样
可以用一个高级定时器,配置一个输入引脚(有脉冲定时器复位)  AD7606 转换完成后 触发定时器复位
定时器更新周期 几个us  更新事件触发DMA,DMA将 SPI->DR 搬到缓冲区,缓冲区可以设置大一点(比如存放1s的数据)
10us内将所有数据都搬到缓冲区
在DMA传输中断中 设置标志位 处理数据
回复

使用道具 举报

78

主题

693

回帖

927

积分

金牌会员

积分
927
发表于 2022-9-18 22:29:59 | 显示全部楼层
中断频率太高了,建议上DMA
回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2022-9-19 08:33:55 | 显示全部楼层
lishang4650 发表于 2022-9-16 16:11
我现在的处理方式是定时器输出10us周期,占空比90%的PWM驱动AD芯片循环转换,AD转换完成产生EXTI中断进行 ...

spi读取不应该消耗4us这么多时间。
考虑spi时钟21MHz,读取一个16bit的数据应该是1us以内。
况且,可以使用dma读取,只需要启动dma,就退出中断。
回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2022-9-19 09:18:50 | 显示全部楼层
还有个办法,mcu换H7系列,比如H750啥的。spi速度更快,主频更快。
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2022-9-19 09:19:38 | 显示全部楼层
lishang4650 发表于 2022-9-16 16:05
用示波器测了下中断里代码从开始执行到结束大概4us的时间

可是试试这个方案:定时器1定时触发AD转换,定时器2捕捉AD的busy信号的下降沿,并触发spi的dma传输(读取采样数据),在dma传输完成中断里把采样数据copy到你应用层的buffer
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2022-9-19 09:58:34 | 显示全部楼层
无关风月 发表于 2022-9-18 10:09
不了解AD7606,不过看你说的样子是给个脉冲触发一次 采集一次
可以试试下面这样
可以用一个高级定时器, ...

感谢,我试试你推荐的这种方案
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2022-9-19 09:59:23 | 显示全部楼层
caicaptain2 发表于 2022-9-19 08:33
spi读取不应该消耗4us这么多时间。
考虑spi时钟21MHz,读取一个16bit的数据应该是1us以内。
况且,可 ...

多谢大佬,我再测下DMA的耗时,不行只能换H7了
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2022-9-19 10:01:05 | 显示全部楼层
cumtjdxcz 发表于 2022-9-19 09:19
可是试试这个方案:定时器1定时触发AD转换,定时器2捕捉AD的busy信号的下降沿,并触发spi的dma传输(读取 ...

谢谢,请教下busy信号产生的EXTI中断处理方式效率要比定时器捕捉的方式低吗
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2022-9-19 10:18:07 | 显示全部楼层
lishang4650 发表于 2022-9-19 10:01
谢谢,请教下busy信号产生的EXTI中断处理方式效率要比定时器捕捉的方式低吗

使用EXTI中断又多了一个中断处理,使用定时器捕获可以直接触发dma传输
回复

使用道具 举报

210

主题

1045

回帖

1685

积分

至尊会员

More we do, more we can do.

积分
1685
发表于 2022-9-19 10:54:56 | 显示全部楼层
用过别的系列,AD7606不太了解,你可以参考官方驱动:https://github.com/analogdevices ... /drivers/adc/ad7606
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 22:04 , Processed in 0.284461 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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