OpenEdv-开源电子网

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

按键输入控制LED,LED没有反应

[复制链接]

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-6-18
在线时间
0 小时
发表于 2015-9-20 11:33:32 | 显示全部楼层 |阅读模式
5金钱
MiniSTM32的开发板
下载完程序后,DS0的红色LED灯就一直亮,按键没有反应。
求大神指点,谢谢。
[mw_shl_code=c,true]#include "stm32f10x.h" typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned __int64 uint64_t; typedef uint32_t u32; typedef uint16_t u16; typedef uint8_t u8; //把“位带地址+位序号”转换别名地址宏 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) //把该地址转换成一个指针 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) //对地址的按位操作 #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) void JTAG_Set(u8 mode) { u32 temp; temp = mode; temp <<= 25; RCC->APB2ENR |= 1<<0; AFIO->MAPR &= 0xF8FFFFFF; AFIO->MAPR |= temp; } int main() { //RCC->APB2ENR |= 1<<2; RCC->APB2ENR &= 0xFFFFFFF0; RCC->APB2ENR |= 0x00000004; //使能GPIOA时钟 GPIOA->CRH &= 0xF0FFFFFF; GPIOA->CRH |= 0x08000000; //设置按键KEY0 PA13上拉下拉输入 GPIOA->CRH &= 0xFFFFFFF0; GPIOA->CRH |= 0x0000000B; //设置灯PA8 推挽输出 50MHz while(1) { JTAG_Set(10); if(PAin(13)==0) //判断PA13按键 { GPIOA->ODR &= 0xFFFFF0FF; GPIOA->ODR |= 0x00000100; //PA8输出高电平 // PAout(8) = 1; } else { GPIOA->ODR &= 0xFFFFF0FF; GPIOA->ODR |= 0x00000000; //PA8输出低电平 } } }[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

楼主写的寄存器代码,但是C语言能力有待提高。有如下几个问题需要楼主去思考: (1)系统时钟有没有初始化?如果不是用的库带的SystemInit,那么需要初始化系统时钟。 (2)使能GPIOA时钟,是设置寄存器APB2ENR的第2位(0位算起)为1,其他位保持不变,写法为:        RCC->APB2ENR|=1<<2;    //使能PORTA时钟        或者:   ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2015-9-20 11:33:33 | 显示全部楼层
楼主写的寄存器代码,但是C语言能力有待提高。有如下几个问题需要楼主去思考:
(1)系统时钟有没有初始化?如果不是用的库带的SystemInit,那么需要初始化系统时钟。
(2)使能GPIOA时钟,是设置寄存器APB2ENR的第2位(0位算起)为1,其他位保持不变,写法为:
       RCC->APB2ENR|=1<<2;    //使能PORTA时钟  
     或者:
       RCC->APB2ENR|=0x00000004;    //使能PORTA时钟
  使用来设置某个位为1,其他位不变,所以这个位与位1进行或运算即可达到目的,不需要: RCC->APB2ENR &= 0xFFFFFFF0;
(3)你说的按键是PA13,PA13你的设置为:
      GPIOA->CRH &= 0xF0FFFFFF;
      GPIOA->CRH |= 0x08000000; 
     很明显,PA13,要设置,应该是:
      GPIOA->CRH &= 0xFF0FFFFF;
      GPIOA->CRH |= 0x00800000;
   这里您也错位了。。
(4) A8推挽输出,推挽,应该是4个位设置位3吧???参考我们跑马灯实验:
 
    GPIOA->CRH &= 0xFFFFFFF0;         
    GPIOA->CRH |=  0x00000003;          //设置灯PA8 推挽输出 
 
暂时看到这里。。没有发现一行代码是对的。。。后面的自己先学习了写吧
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-9-20 11:36:29 | 显示全部楼层
这逻辑什么鬼。。。。。
学无止境
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-6-18
在线时间
0 小时
 楼主| 发表于 2015-9-20 12:18:54 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------
就是按下按键,LED灯亮,松开按键,就不亮
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-9-20 14:33:59 | 显示全部楼层
回复【3楼】有馅的馒头:
---------------------------------
GPIOA->ODR |= 0x00000000; //PA8输出低电平

你确定这个能输出低?????
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-6-18
在线时间
0 小时
 楼主| 发表于 2015-9-20 15:22:55 | 显示全部楼层
回复【4楼】lycreturn:
---------------------------------
回复【4楼】lycreturn:
---------------------------------
我把它改成了  GPIOA->ODR |= 0<<8;   也不好用
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-6-18
在线时间
0 小时
 楼主| 发表于 2015-9-22 21:11:19 | 显示全部楼层
回复【6楼】Admin:
---------------------------------
谢谢回答这么多,虽然问题简单。
问题已经解决,仔细检查了一下,都是没有仔细看,导致写错位置或者计算错误了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 01:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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