关于STM32F407 任务执行时间的问题
有两个任务需要同时运行(裸机):1、DAC产生100ms(10Hz)的扫描信号,实时性很强,目前放在主函数里延时100us,1000个点产生。
2、ADC采集,串口输出8个通道的数据,定时器TIM3中断采集输出,定时时间是500ms。
目前的问题是:在定时器中断函数里,串口输出数据的时候,占用了一段时间使扫描信号变形失真。
解决思路:1、扫描信号在TIM2中断函数里产生(定时时间100us),优先级大于TIM3中断;
2、串口传输数据通过DMA,减少传输时间
请假各位前辈们哪一种方法可行? 不要在中断里面干活。
你这个很简单的问题,“ADC采集,串口输出8个通道的数据,定时器TIM3中断采集输出,定时时间是500ms”
500ms是间隔,每次输出只能输出上一次转换好的数据,而不是当前数据,想清楚这点就行了
2比较好。
费时的放在while(1) 中,其他的实时性要求高费时短的可以用定时中断完成
首先采用的是思路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的抢占优先级更大,数字越小优先级越大 设置中断优先级的步骤有:
第一步:设置优先级分组,使用库函数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2 关于分组,一共有四组:
#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位用于指定响应优先级 第二步:设置优先级,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); DAC用DMA控制,完全不占用CPU时间
发送数据量大才考虑dma
这种速度不用dma是不是也可以啊
尽量减少中断中的代码
用dma方式好了
这样的时间 如果中断函数里边的处理代码不庞大的话 应该也没有问题
搞定了,呵呵,犯了低级错误……
页:
[1]