STM8S103F开灯程序_开关和电源问题
本帖最后由 corvettey 于 2019-4-1 12:36 编辑求大佬帮忙!
我在用C和IAR写一个程序,用的是STM8S103F3P6——用上拉模式的开关打开推挽输出的LED;并且当LED被打开一次之后,即使再打开开关再也不会亮起。
现在的问题是,开关和LED的功能都能实现,但有一定几率会发生这种情况:当LED还未接入电源,开关未被按下时,接入电源的一瞬间LED灯会亮起。从我的测试中,这个故障发生的几率大概在40%。我并不知道怎么解决的这个问题。
有怀疑是电路的问题,因为测试的电路是一个比较复杂的电路,我们只是在用它的部分功能。
但是由于是第一次上手STM8S,我也怀疑是自己程序的问题;可我检查不出程序的问题也不知道如何解决。所以想请各位大佬帮忙看看程序。朋友在同步检电路。
感谢!
代码如下:
#include "IOSTM8S103F3.h"
void lightup();
void delay(int count);
void main()
{
//PC5作为对LED的推挽输出
PC_ODR = 0;
PC_DDR_DDR5 = 1;
PC_CR1_C15 = 1;
PC_CR2_C25 = 1;
//PD5作为开关,上拉模式
PD_DDR_DDR5 = 0;
PD_CR1_C15 = 1;
PD_CR2_C25 = 0;
while (1)
{
lightup();
}
}
void lightup(void)
{
PC_ODR_bit.ODR5 = ! PD_IDR_bit.IDR5;//PC5作为LED的推挽输出,读取PD5这个开关是否被按下
if(PC_ODR_bit.ODR5==1){ //如果PD5开关被按下,LED亮起
delay(50); //很短的持续点亮LED时间
//以下语句永久关闭LED灯。即使PD5开关再被按下,LED也不会再亮起
PC_ODR = 0;
PC_DDR_DDR5 = 0;
PC_CR1_C15 = 0;
PC_CR2_C25 = 0;
}
}
void delay(int count)
{
volatile int i,j;
for (i=0; i<count; i++) for(j=0;j<200;j++);
}
你要想的不是IO的配置, 因为那已经是后话, 你的问题在于上电那一刻, 而CPU还在复位及配置系统时, LED被点亮了。
在上电至CPU工作并开始执行IO配置的这段时间, IO是处于Floating状态, 所以你需要用上拉或下拉给它一个你想要的状态, 当然这个状态是让LED灭的 没搞清你的原理,供电关系。
单次触发程序,也不需要硬切IO的工作模式,直接置一个标志变量,改变输出状态就行了。 本帖最后由 corvettey 于 2019-4-1 12:38 编辑
toofree 发表于 2019-4-1 11:17
没搞清你的原理,供电关系。
单次触发程序,也不需要硬切IO的工作模式,直接置一个标志变量,改变输出状态 ...
能告诉我具体你想了解的原理和供电关系是指什么嘛?
关于单次触发,我第一次学不是很明白,所以直接把工作模式改了来确保不会再亮起。麻烦问下是哪个寄存器改变输出状态?我试了让只让PC5的ODR和IDR等于0,没能成功。
即我在lightup函数里delay过后如果只写PC_ODR=0或者PC_IDR_bit.ODR5=0,LED都不是单次触发
edmundlee 发表于 2019-4-1 13:53
你要想的不是IO的配置, 因为那已经是后话, 你的问题在于上电那一刻, 而CPU还在复位及配置系统时, LED被 ...
啊谢谢!我觉得我懂了原因了。意思是说在while循环执行之前,PC5是处于floating的状态吗?
如果是的话,我把main函数改成了如下:
void main()
{
PC_ODR = 0;
PC_DDR_DDR5 = 1;
PC_CR1_C15 = 1;
PC_CR2_C25 = 1;
PC_ODR_bit.ODR5 = !PD_IDR_bit.IDR5;
PD_DDR_DDR5 = 0;
PD_CR1_C15 = 1;
PD_CR2_C25 = 0;
while (1)
{
lightup();
}
}
加粗的语句是我新添加的。我让PC5在进入while循环之前读取一次开关的状态。麻烦问下这样做的话是对的嘛?谢谢啦! corvettey 发表于 2019-4-1 15:20
啊谢谢!我觉得我懂了原因了。意思是说在while循环执行之前,PC5是处于floating的状态吗?
如果是的话,我 ...
不是, 是配置IO前, 这问题靠软件解决不了, 要外加上拉或下拉
在上电至配置IO前, 你的软件还没跑起来的, 你把软件怎样改也没有的 edmundlee 发表于 2019-4-1 15:25
不是, 是配置IO前, 这问题靠软件解决不了, 要外加上拉或下拉
在上电至配置IO前, 你的软件还没跑起来 ...
好,了解了,非常感谢帮助!!!如果成功了我告诉你哈哈哈 edmundlee 发表于 2019-4-1 15:25
不是, 是配置IO前, 这问题靠软件解决不了, 要外加上拉或下拉
在上电至配置IO前, 你的软件还没跑起来 ...
我让我们组的硬件carry去研究研究哈哈哈 edmundlee 发表于 2019-4-1 15:25
不是, 是配置IO前, 这问题靠软件解决不了, 要外加上拉或下拉
在上电至配置IO前, 你的软件还没跑起来 ...
你好你好,之后我们的carry修改了电路,现在问题解决了,太感谢了! corvettey 发表于 2019-4-2 13:38
你好你好,之后我们的carry修改了电路,现在问题解决了,太感谢了!
码农不能只会敲代码, 否则很容易被硬件的欺负的:lol
页:
[1]
2