
本帖最后由 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++); } |
STM8S003无法检测到引脚电平
STM8 @svlreg 问题
型号STM32L010RB可以用来做两路BUCK移相小电源?
STM8AF62XX+L99PM62GXP LIN通讯的电路原理图有吗?官网提供了一套软件,没找到对应的原理图,请大家指教一下
求一个STM8S207例程
STM32H743做数字电源,HRTIM问题
初次接触STM8,请问在STVD中,为什么这个Struct会报错
去耦电容
L99VR02J电压输出不够是怎么回事?
STMS005K6T6 如何采集内部参考电压。
在上电至CPU工作并开始执行IO配置的这段时间, IO是处于Floating状态, 所以你需要用上拉或下拉给它一个你想要的状态, 当然这个状态是让LED灭的
评分
查看全部评分
单次触发程序,也不需要硬切IO的工作模式,直接置一个标志变量,改变输出状态就行了。
评分
查看全部评分
能告诉我具体你想了解的原理和供电关系是指什么嘛?
关于单次触发,我第一次学不是很明白,所以直接把工作模式改了来确保不会再亮起。麻烦问下是哪个寄存器改变输出状态?我试了让只让PC5的ODR和IDR等于0,没能成功。
即我在lightup函数里delay过后如果只写PC_ODR=0或者PC_IDR_bit.ODR5=0,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循环之前读取一次开关的状态。麻烦问下这样做的话是对的嘛?谢谢啦!
不是, 是配置IO前, 这问题靠软件解决不了, 要外加上拉或下拉
在上电至配置IO前, 你的软件还没跑起来的, 你把软件怎样改也没有的
好,了解了,非常感谢帮助!!!如果成功了我告诉你哈哈哈
我让我们组的硬件carry去研究研究哈哈哈
你好你好,之后我们的carry修改了电路,现在问题解决了,太感谢了!
码农不能只会敲代码, 否则很容易被硬件的欺负的
哈哈哈好的,一定好好学硬件