利用simulink的自动生成代码开发stm32,当对如图所示基本采样时间进行配置的时候产生了疑问,这里的采样时间是什么作用?在所生成的代码中,体现在什么地方呢?
我们打开配置,勾选如图所示两项内容,点击OK;接着点击Build Model自动生成代码 代码生成后会自动弹出报告框;生成代码的模型为实现led灯闪烁的模型;我们先不管如何实现led灯的闪烁,只看到main.c中的内容 led灯闪烁模型配置过程链接 注意三个部分内容: 一:嘀嗒定时器配置部分二:while循环部分 三:嘀嗒定时器中断部分 由上述图片中的代码我们可以发现,我们所设置的采样时间是用于提供目标任务的执行周期。例如我们在simulink中配置的基本采样时间为0.001s,那么在所生成的代码中就会利用滴答定时器,产生一个1ms变化一次的标志位供while循环检测,判断是否执行目标任务。
首先在一:嘀嗒定时器配置部分,根据SysTick原理我们对reload值进行配置。
SysTick定时时间的计算:
时间t:单位执行的时间,和reload、CLK有关;
CLK:由CTRL寄存器配置,在本项目中是72M
(uint32_t SystemCoreClock = 72000000U;);
reload:24位,由用户配置;
所以就有下面的配置:
t = reload * (1 / CLK)
CLK = 72M时,t = (72000) * (1 / 72M) = 1ms
此时reload = 72000=72M * 1ms=SystemCoreClock * 0.001
SystemCoreClock * 0.001 便是reload的值如图圆圈所示: 经配置后,系统滴答定时器每1ms进入一次中断。 这里有两个重要标志位autoReloadTimerLoopVal_S、remainAutoReloadTimerLoopVal_S,在本工程项目中,它们的初始值都为1,其中autoReloadTimerLoopVal_S是重装载值,注意要和reload区分开来。reload是滴答定时器的重装载值,而autoReloadTimerLoopVal_S是remainAutoReloadTimerLoopVal_S的重装载值。看到三:嘀嗒定时器中断部分,系统滴答定时器每1ms进入一次中断remainAutoReloadTimerLoopVal_S自减1,然后while循环中检测remainAutoReloadTimerLoopVal_S是否为0,当为0的时候,为remainAutoReloadTimerLoopVal_S重新装载autoReloadTimerLoopVal_S值,并执行目标任务函数。这样就实现了每1ms执行一次的功能。
|