OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3706|回复: 13

小白求助,用的是stm32f4 探索者 想通过开发板上的按键加减来调节跑马灯闪烁频率的快慢

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-12-29
在线时间
0 小时
发表于 2017-12-29 15:40:51 | 显示全部楼层 |阅读模式
10金钱
程序如下 没有错误 就是打进板子按键不管用 是哪出问题了呢?
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "stdio.h"
#include "key.h"

int main(void)
{
int a=1000;
        u8 t=0;         
        u8 key;
        delay_init(168);    //初始化延时函数
       
        LED_Init();                                        //初始化LED

        KEY_Init();                                 //按键初始化
       
        while(1)
        {
                t++;
                key=KEY_Scan(0);                          
                if(key==4)
                {                 
                        if(a>200)a-=200;
       
                        printf("%d",a);    //输出       
       
                }else if(key==2)       
                {
                        if(a<2000)a+=200;
               
                        printf("%d",a);        //输出
               
                }         
                if(t==10||key==2||key==4)                 //WKUP/KEY1按下了,或者定时时间到了
                {          
                GPIO_ResetBits(GPIOF,GPIO_Pin_9);  //LED0对应引脚GPIOF.9拉低,亮  等同LED0=0;
        GPIO_SetBits(GPIOF,GPIO_Pin_10);   //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1;
        delay_ms(a);                     //延时ams
        GPIO_ResetBits(GPIOF,GPIO_Pin_9);           //LED0对应引脚GPIOF.9拉低,亮  等同LED0=0;
        GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉低,亮 等同LED1=0;
        delay_ms(a);                     //延时ams
                }               
}
                }


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2017-12-29 15:44:02 | 显示全部楼层
本帖最后由 footprint 于 2017-12-29 15:49 编辑

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
这句话很容易被忽视!
而且编译不会报错!
检查下  看是不是 需要这句话!下面是原代码:


//ALIENTEK 探索者STM32F407开发板 实验1
//跑马灯实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK

int main(void)
{

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);                  //初始化延时函数
        LED_Init();                        //初始化LED端口
        
  /**下面是通过直接操作库函数的方式实现IO控制**/        
        
        while(1)
        {
                GPIO_ResetBits(GPIOF,GPIO_Pin_9);  //LED0对应引脚GPIOF.9拉低,亮  等同LED0=0;
                GPIO_SetBits(GPIOF,GPIO_Pin_10);   //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1;
                delay_ms(500);                     //延时300ms
                GPIO_SetBits(GPIOF,GPIO_Pin_9);           //LED0对应引脚GPIOF.0拉高,灭  等同LED0=1;
                GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉低,亮 等同LED1=0;
                delay_ms(500);                     //延时300ms
        }
}



回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-12-29
在线时间
0 小时
 楼主| 发表于 2017-12-29 15:49:35 | 显示全部楼层
footprint 发表于 2017-12-29 15:44
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

这个是中断优先级分组吗
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2017-12-29 15:51:21 | 显示全部楼层
本帖最后由 footprint 于 2017-12-29 15:52 编辑
菜鸟wpw 发表于 2017-12-29 15:49
这个是中断优先级分组吗

是的,那个延时用的是中断做的延时,如果没有这句话,中断应该不会工作,也就是说你的延时卡死了。
如果你会仿真的话,直接在线仿真应该是卡在delay_ms那里才对。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-12-29
在线时间
0 小时
 楼主| 发表于 2017-12-29 15:55:55 | 显示全部楼层
footprint 发表于 2017-12-29 15:51
是的,那个延时用的是中断做的延时,如果没有这句话,中断应该不会工作,也就是说你的延时卡死了。
如果 ...

我加了这句话 还是按钮不管用的 连按几次按钮直接常亮
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2017-12-29 16:05:44 | 显示全部楼层
菜鸟wpw 发表于 2017-12-29 15:55
我加了这句话 还是按钮不管用的 连按几次按钮直接常亮


#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "stdio.h"
#include "key.h"

int main(void)
{
        u8 key = 4;         u16 a = 1000;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);    //初始化延时函数
        
        LED_Init();                                        //初始化LED

        KEY_Init();                                 //按键初始化
        
        while(1)
        {
               
                if(k==4)                 //WKUP/KEY1按下了,或者定时时间到了
                {         
                GPIO_ResetBits(GPIOF,GPIO_Pin_9);  //LED0对应引脚GPIOF.9拉低,亮  等同LED0=0;
                GPIO_SetBits(GPIOF,GPIO_Pin_10);   //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1;
                delay_ms(a);                     //延时ams
                GPIO_ResetBits(GPIOF,GPIO_Pin_9);           //LED0对应引脚GPIOF.9拉低,亮  等同LED0=0;
                GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉低,亮 等同LED1=0;
                delay_ms(a);                     //延时ams
                }               
}
                }


先看这个跑马灯能用不,再一点一点加你要实现的功能!
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-12-29
在线时间
0 小时
 楼主| 发表于 2017-12-29 16:19:40 | 显示全部楼层
footprint 发表于 2017-12-29 16:05
#include "sys.h"
#include "delay.h"
#include "usart.h"

这个能用的 但是和按键没有关系啊
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2017-12-29 16:20:14 | 显示全部楼层
菜鸟wpw 发表于 2017-12-29 16:19
这个能用的 但是和按键没有关系啊

能用以后,再加按键!
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2017-12-29 16:22:51 | 显示全部楼层
本帖最后由 footprint 于 2017-12-29 16:25 编辑
菜鸟wpw 发表于 2017-12-29 16:19
这个能用的 但是和按键没有关系啊

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "stdio.h"
#include "key.h"

int main(void)
{
        int a=1000;
        u8 t=0;         
        u8 key;
        delay_init(168);    //初始化延时函数
        
        LED_Init();                                        //初始化LED

        KEY_Init();                                 //按键初始化
        
        while(1)
        {
                t++;
                key=KEY_Scan(0);                          
      
                if(key==2||key==4)                 //WKUP/KEY1按下了,或者定时时间到了
                {         
                      GPIO_ResetBits(GPIOF,GPIO_Pin_9);  //LED0对应引脚GPIOF.9拉低,亮  等同LED0=0;
                      GPIO_SetBits(GPIOF,GPIO_Pin_10);   //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1;
                      delay_ms(a);                     //延时ams
                      GPIO_ResetBits(GPIOF,GPIO_Pin_9);           //LED0对应引脚GPIOF.9拉低,亮  等同LED0=0;
                      GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉低,亮 等同LED1=0;
                       delay_ms(a);                     //延时ams
                }               
         }
}


这样再试试!代码的空格带出来,尽量好看点。
回复

使用道具 举报

2

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2017-9-27
在线时间
100 小时
发表于 2017-12-30 10:37:49 | 显示全部楼层
可以考虑在中断函数里面实现按键修改频率值
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-1 00:58:03 | 显示全部楼层
帮顶
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4370
金钱
4370
注册时间
2017-5-30
在线时间
579 小时
发表于 2018-1-2 16:00:54 | 显示全部楼层
楼主你想实现的功能是通过IF判断key值来执行你的不同指令。你长按某一按键肯定会实现你的功能,但是松开了就不行了对吧?你有没有发现你的key值一直是0,为什么是0,你看看你的key_scan函数的返回值,如果你没有按下,就是返回0,所以你的程序执行不了。如何保持住key值是你目前需要解决的问题。
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2018-1-2 16:26:21 | 显示全部楼层
哇。。。。你这delay用的。。。
回复

使用道具 举报

9

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2017-6-16
在线时间
46 小时
发表于 2018-1-2 16:34:34 | 显示全部楼层
F9管脚的代码一直是点亮      当然是常亮

后面一句F9修改成Set 试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 17:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表