打印
[STM32F1]

关于STM32F407 任务执行时间的问题

[复制链接]
354|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yufe|  楼主 | 2021-12-9 20:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有两个任务需要同时运行(裸机):
1、DAC产生100ms(10Hz)的扫描信号,实时性很强,目前放在主函数里延时100us,1000个点产生。
2、ADC采集,串口输出8个通道的数据,定时器TIM3中断采集输出,定时时间是500ms。
目前的问题是:在定时器中断函数里,串口输出数据的时候,占用了一段时间使扫描信号变形失真。
解决思路:1、扫描信号在TIM2中断函数里产生(定时时间100us),优先级大于TIM3中断;
2、串口传输数据通过DMA,减少传输时间
请假各位前辈们哪一种方法可行?

使用特权

评论回复
沙发
bqyj| | 2021-12-9 20:54 | 只看该作者
不要在中断里面干活。

使用特权

评论回复
板凳
tian111| | 2021-12-9 20:56 | 只看该作者
你这个很简单的问题,“ADC采集,串口输出8个通道的数据,定时器TIM3中断采集输出,定时时间是500ms”

使用特权

评论回复
地板
zhenykun| | 2021-12-9 20:58 | 只看该作者
500ms是间隔,每次输出只能输出上一次转换好的数据,而不是当前数据,想清楚这点就行了

使用特权

评论回复
5
wyjie| | 2021-12-9 21:00 | 只看该作者
2比较好。

使用特权

评论回复
6
juventus9554| | 2021-12-9 21:06 | 只看该作者
费时的放在while(1) 中,其他的实时性要求高费时短的可以用定时中断完成

使用特权

评论回复
7
yufe|  楼主 | 2021-12-9 21:08 | 只看该作者
首先采用的是思路1中的方法:
采用定时器TIM4定时100us,优先级大于TIM3,可以解决这个问题。
在这里介绍一下中断优先级的相关知识,用到哪里学到哪里嘛。
以下内容转自网络各处,根据自己的理解而来,侵删,仅作参考。
CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分。STM32F40xx/STM32F41xx总共有92个中断,包括10个内核中断和82个可屏蔽中断,具有
16级可编程的中断优先级,而我们常用的就是这82个可屏蔽中断。
明确两个优先级的概念——抢占式优先级和响应优先级,举个例子
中断向量  抢占优先级  响应优先级
A                  0                  0
B                  1                   0
C                  1                   1
若内核正在执行 C 的中断服务函数,则它能被抢占优先级更高的中断 A 打断,由于 B 和 C 的抢占优先级相同,所以 C 不能被 B 打断。但如果 B 和 C 中断是同时到达的,内核就会首先响应响应优先级别更高的 B 中断。
对TIM3和TIM4两个定时器来说,希望TIM4的实时性强于TIM3,所以我们需要TIM4的抢占优先级更大,数字越小优先级越大

使用特权

评论回复
8
yufe|  楼主 | 2021-12-9 21:11 | 只看该作者
设置中断优先级的步骤有:
第一步:设置优先级分组,使用库函数
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2

使用特权

评论回复
9
yufe|  楼主 | 2021-12-9 21:12 | 只看该作者
关于分组,一共有四组:
#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                            4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */
在这里
用第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级

使用特权

评论回复
10
yufe|  楼主 | 2021-12-9 21:17 | 只看该作者
第二步:设置优先级,TIM3抢占优先级2低于TIM4抢占优先级1
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //¶¨Ê±Æ÷3ÖжÏ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //ÇÀÕ¼ÓÅÏȼ¶2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //×ÓÓÅÏȼ¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
                NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn; //¶¨Ê±Æ÷3ÖжÏ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //ÇÀÕ¼ÓÅÏȼ¶1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //×ÓÓÅÏȼ¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);

使用特权

评论回复
11
llljh| | 2021-12-9 21:18 | 只看该作者
DAC用DMA控制,完全不占用CPU时间

使用特权

评论回复
12
pangb| | 2021-12-9 21:20 | 只看该作者
发送数据量大才考虑dma

使用特权

评论回复
13
chuxh| | 2021-12-9 21:22 | 只看该作者
这种速度不用dma是不是也可以啊

使用特权

评论回复
14
dingy| | 2021-12-9 21:24 | 只看该作者
尽量减少中断中的代码

使用特权

评论回复
15
pengf| | 2021-12-9 21:27 | 只看该作者
用dma方式好了

使用特权

评论回复
16
heweibig| | 2021-12-9 21:29 | 只看该作者
这样的时间 如果中断函数里边的处理代码不庞大的话 应该也没有问题

使用特权

评论回复
17
yufe|  楼主 | 2021-12-9 21:31 | 只看该作者

搞定了,呵呵,犯了低级错误……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

10170

帖子

1

粉丝