新手入门
- 积分
- 9
- 金钱
- 9
- 注册时间
- 2020-9-27
- 在线时间
- 3 小时
|
9金钱
最近在学习这个阿尔法开发板的时候一直有个奇怪的问题,之前在延时消抖、定时器消抖实验的时候总是发现按键第一次按下来后开发板的蜂鸣器一直都没有响应但是从第二下开始后就正常了当时也没有在意这些细节,以为正常就继续往后面学习了,不知道大家在做这个实验的时候有没有这个经历。 直到后面同学也学到这个地方的时候也有这个问题,我就感觉很不对劲,我那时候刚好学习到打印Printf这里,我就在state初始化之后就打印state(初始化为OFF)的值然后才发现了大问题,刚初始化之后stata的值尽然不为0,然后就换各种地方,初始化为各种值,结果发现都没有用打印出来的第一个值还是乱码,当时就各种操作都没有用。
最为绝望的时候就是,用左神的源码做定时器消抖的时候,发现他的没问题,第一下是响的,完全正常。然后一度以为板子被玩坏了,没有办法就对着左神的源代码一行行的对,对了好久后发现,原来蜂鸣器的初始化代码和他的不一样他写的是(只有key_filter这个工程的beep是这样写的):
void beep_switch(int status)
{
if(status == OFF)
GPIO5->DR &= ~(1 << 1); /* 打开蜂鸣器 */
else if(status == ON)
GPIO5->DR |= (1 << 1); /* 关闭蜂鸣器 */
}
我看着视频写的是:
void beep_switch(int status)
{
if(status == ON)
GPIO5->DR &= ~(1 << 1); /* 打开蜂鸣器 */
else if(status == OFF)
GPIO5->DR |= (1 << 1); /* 关闭蜂鸣器 */
}
一开始以为自己逻辑搞反了,就来改过来,第一下确实响了。后来想想确实不对啊,又去检测蜂鸣器,发现逻辑确实没有搞反。我这时候才知道左神的为什么可以第一下响了,而我的不行了。因为源程序是这样。
void filtertimer_irqhandler(void)
{
static unsigned char state = OFF;
if(EPIT1->SR & (1<<0)) /* 判断比较事件是否发生 */
{
filtertimer_stop(); /* 关闭定时器 */
if(gpio_pinread(GPIO1, 18) == 0) /* KEY0 */
{
state = !state;
beep_switch(state); /* 反转蜂鸣器 */
}
}
EPIT1->SR |= 1<<0; /* 清除中断标志位 */
}
因为刚初始化完的state是个大于零的乱码,取反后就为0了,而刚好左神又把蜂鸣器初始化的逻辑换了一下,所以为0的时候他就能响,所以换一下蜂鸣器的逻辑确实回响。
到底这个初始化乱码的问题还是没有解决,为了确实这确实会乱码而不是我代码的问题,我又去左神的printf工程里面看了一下,他的蜂鸣器初始化是正常的,然后我把定时器消抖初始化了一下,下进去后发现他的第一下也不响,我就在刚初始化完的state下打印了一下state的值,正相大白!刚初始化static unsigned char state = OFF;的值竟然是178,也是个乱码!
至此,我就感觉到这里确实有个BUG,不知道左神在做定时器消抖的时候有没有感觉到这个问题。当时在想这都不能初始化一个值了后面还怎么做其他的东西,不过我有发现神奇的事做其他的实验又没有影响,interesting。但是作为一个程序员,感觉这里逻辑确实讲不通。不知道大家做这个实验的时候有没有这个问题,感觉也有可能是我这一个开发板的问题,或者也是一个被大家忽略的共性问题,希望大神说一下自己的看法,或者是在这一一列操作中我忽略了某些问题导致的,希望得到一个解答。
|
|