| 本帖最后由 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++); } |
STM8S103飞线外接芯片,I2C不能得到slaveAddress应答,通讯失败。
测试标签123
IAR FOR ARM和IAR FOR STM8无法共存,
STM8L052,液晶内部电源怎么用?
STM8S105C6T6 UART2串口,能接收数据,不能发送数据
STM8S105K4 串口2 无奇偶校验,也能接收 偶校验的 数据
在STM8S的IAP使用中断和APP使用中断问题
334 474系列为什么这么久都没有双向电源的参考设计?
STM8L151 SMBUS设计
STM8S103F复位异常
微信公众号
手机版
在上电至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修改了电路,现在问题解决了,太感谢了!
码农不能只会敲代码, 否则很容易被硬件的欺负的