[应用相关]

外设启动的先后次序

[复制链接]
401|2
手机看帖
扫描二维码
随时随地手机跟帖
wakayi|  楼主 | 2019-7-4 11:18 | 显示全部楼层 |阅读模式
今天,在程序框架中增加了Timer16定时器驱动,但程序不能正常运行,本篇日志记录其原因。

驱动程序框架,定义了回调函数Timer16_InterruptFunction,写在main.cpp中用于逻辑层设计。Timer16_InterruptFunction调用的间隔为1ms,具体程序如下:

void Timer16_InterruptFunction(void)
{
        Target.HAL.L2.Turn();
}



使用特权

评论回复
wakayi|  楼主 | 2019-7-4 11:18 | 显示全部楼层
此程序完成以1ms为间隔L2闪烁的程序,但是将此程序烧写到目标板后,程序不能正常运行。经过调试,最后将问题锁定在启动顺序上,看一下程序外设的启动顺序,具体程序如下:

class CHAL
{
public:
        CSystemInit SystemInit;
        CSystemClock SystemClock;
        CSystemTimer16 SystemTimer16;               
        CL1 L1;
        CL2 L2;
        CInfraredEmission InfraredEmission;
};
程序先启动的Timer16,后启动的L2,由于TImer16启动后,立刻发生中断,则会执行Timer16_InterruptFunction中的程序,而此时L2还未初始化,则造成错误发生。

使用特权

评论回复
wakayi|  楼主 | 2019-7-4 11:18 | 显示全部楼层
知道以上原因后,解决方法很简单,调换一下启动顺序即可,程序如下:

class CHAL
{
public:
        CSystemInit SystemInit;
        CSystemClock SystemClock;               
        CL1 L1;
        CL2 L2;
        CSystemTimer16 SystemTimer16;       
        CInfraredEmission InfraredEmission;
};
此时,再运行程序,一切正常。


使用特权

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

本版积分规则

78

主题

3803

帖子

1

粉丝