你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8S103F开灯程序_开关和电源问题

[复制链接]
corvettey 提问时间:2019-4-1 08:38 /
悬赏2ST金币已解决
本帖最后由 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灭的
收藏 评论10 发布时间:2019-4-1 08:38

举报

10个回答
edmundlee 回答时间:2019-4-1 08:38:03
你要想的不是IO的配置, 因为那已经是后话, 你的问题在于上电那一刻, 而CPU还在复位及配置系统时, LED被点亮了。
在上电至CPU工作并开始执行IO配置的这段时间, IO是处于Floating状态, 所以你需要用上拉或下拉给它一个你想要的状态, 当然这个状态是让LED灭的

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

七哥 回答时间:2019-4-1 11:17:20
没搞清你的原理,供电关系。
单次触发程序,也不需要硬切IO的工作模式,直接置一个标志变量,改变输出状态就行了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

corvettey 回答时间:2019-4-1 12:35:53
本帖最后由 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都不是单次触发


corvettey 回答时间:2019-4-1 15:20:39
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循环之前读取一次开关的状态。麻烦问下这样做的话是对的嘛?谢谢啦!
edmundlee 回答时间:2019-4-1 15:25:12
corvettey 发表于 2019-4-1 15:20
啊谢谢!我觉得我懂了原因了。意思是说在while循环执行之前,PC5是处于floating的状态吗?
如果是的话,我 ...

不是, 是配置IO前, 这问题靠软件解决不了, 要外加上拉或下拉
在上电至配置IO前, 你的软件还没跑起来的, 你把软件怎样改也没有的
corvettey 回答时间:2019-4-1 15:31:17
edmundlee 发表于 2019-4-1 15:25
不是, 是配置IO前, 这问题靠软件解决不了, 要外加上拉或下拉
在上电至配置IO前, 你的软件还没跑起来 ...

好,了解了,非常感谢帮助!!!如果成功了我告诉你哈哈哈
corvettey 回答时间:2019-4-1 15:33:14
edmundlee 发表于 2019-4-1 15:25
不是, 是配置IO前, 这问题靠软件解决不了, 要外加上拉或下拉
在上电至配置IO前, 你的软件还没跑起来 ...

我让我们组的硬件carry去研究研究哈哈哈
corvettey 回答时间:2019-4-2 13:38:34
edmundlee 发表于 2019-4-1 15:25
不是, 是配置IO前, 这问题靠软件解决不了, 要外加上拉或下拉
在上电至配置IO前, 你的软件还没跑起来 ...

你好你好,之后我们的carry修改了电路,现在问题解决了,太感谢了!
edmundlee 回答时间:2019-4-2 23:15:24
corvettey 发表于 2019-4-2 13:38
你好你好,之后我们的carry修改了电路,现在问题解决了,太感谢了!

码农不能只会敲代码, 否则很容易被硬件的欺负的
corvettey 回答时间:2019-4-3 04:23:25
edmundlee 发表于 2019-4-2 23:15
码农不能只会敲代码, 否则很容易被硬件的欺负的

哈哈哈好的,一定好好学硬件
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版