OpenEdv-开源电子网

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

STM32F103中似乎有很多个IO口,GPIOC/D/E怎么用?

[复制链接]

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-3 10:56:49 | 显示全部楼层 |阅读模式
1金钱
STM32F103中似乎有很多个IO口,GPIOC/D/E怎么用? 宏定义上这些口是真实存在的,我想知道有什么用??也是可以存储数据嘛??怎么用??

最佳答案

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-8-3 10:56:50 | 显示全部楼层
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2017-7-20
在线时间
16 小时
发表于 2017-8-3 11:45:29 | 显示全部楼层
每个端口都有多个作用,给的资料上有专门GPIO端口的作用表格
回复

使用道具 举报

0

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2017-8-1
在线时间
21 小时
发表于 2017-8-3 11:48:40 | 显示全部楼层
开发板原理图  上面有各个IO的用途
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-3 13:52:54 | 显示全部楼层
竹林的风 发表于 2017-8-3 11:48
开发板原理图  上面有各个IO的用途

我查了,但是这些IO口似乎有引脚才能调用,没有引脚就不能调用,那我想问下,假如我想定义一个变量X用一个寄存器来存储,应该怎么定义??必须要定义到IO口上吗?
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-3 13:54:06 | 显示全部楼层
a1109985267 发表于 2017-8-3 11:45
每个端口都有多个作用,给的资料上有专门GPIO端口的作用表格

那些作用我有看到,虽说不太理解但是也不至于一点不通。我比较想知道,假如我想定义变量X占用一个寄存器来存储数据,我该怎么定义?是不是必须要定义到IO口上?
回复

使用道具 举报

0

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2017-8-1
在线时间
21 小时
发表于 2017-8-3 15:46:53 | 显示全部楼层
q247341184 发表于 2017-8-3 13:52
我查了,但是这些IO口似乎有引脚才能调用,没有引脚就不能调用,那我想问下,假如我想定义一个变量X用一 ...

这个叫端口复用  一个引脚  多个IO
回复

使用道具 举报

0

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2017-8-1
在线时间
21 小时
发表于 2017-8-3 15:48:06 | 显示全部楼层
竹林的风 发表于 2017-8-3 15:46
这个叫端口复用  一个引脚  多个IO

有视频的   有端口复用的配置步骤
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-3 16:16:24 | 显示全部楼层
竹林的风 发表于 2017-8-3 15:48
有视频的   有端口复用的配置步骤

给你打个比方,在C语言里的for循环语句里,一般需要一个i来确定循环次数,
          比如:for(i=0;i<a;i++){}   
我是想设置这个i,还要设置这个a,将i和a的值都存在寄存器里,可能我对端口复用这块了解有限,但是,我刚才了解到的部分告诉我,端口复用的寄存器个数大概不够我要设置的数量。这么说你能明白嘛?
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3869
金钱
3869
注册时间
2017-3-7
在线时间
1688 小时
发表于 2017-8-3 16:25:29 | 显示全部楼层
额,你这些值要怎么用?为什么一定要存到寄存器里,GPIO中的寄存器都是和硬件有关的。
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-3 16:36:26 | 显示全部楼层
a5820736 发表于 2017-8-3 16:25
额,你这些值要怎么用?为什么一定要存到寄存器里,GPIO中的寄存器都是和硬件有关的。

给你打个比方,在C语言里的for循环语句里,一般需要一个i来确定循环次数,
          比如:for(i=0;i<a;i++){}   
我是想设置这个i,还要设置这个a,将i和a的值都存在寄存器里,可能我对端口复用这块了解有限,但是,我刚才了解到的部分告诉我,端口复用的寄存器个数大概不够我要设置的数量。这么说你能明白嘛?

想要存在寄存器里是因为操作方便,以上面这个例子继续说,假如我想设置a的值,今天我可能需要的是5,但是后天我可能需要的是50,所以如果存在寄存器的话,我认为比较方便更改吧,或者有其他的方法可以解决也好,我现在真的是一点思路都没有。
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3869
金钱
3869
注册时间
2017-3-7
在线时间
1688 小时
发表于 2017-8-3 16:41:33 | 显示全部楼层
宏定义或者const都可以啊
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-3 16:45:34 | 显示全部楼层
a5820736 发表于 2017-8-3 16:41
宏定义或者const都可以啊

宏定义这块我了解的不太深刻,那假如我想宏定义a指向到一个寄存器来专门存储a的值,我该怎么指向过去?可以的话麻烦举个例子,实在是被绕迷糊了!!!
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3869
金钱
3869
注册时间
2017-3-7
在线时间
1688 小时
发表于 2017-8-3 16:57:40 | 显示全部楼层
#define a 50就好了,你想改的时候随时都能改这个值
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3869
金钱
3869
注册时间
2017-3-7
在线时间
1688 小时
发表于 2017-8-3 16:58:01 | 显示全部楼层
感觉你最好看点程序
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-3 17:04:58 | 显示全部楼层
a5820736 发表于 2017-8-3 16:58
感觉你最好看点程序

我觉得你这句话说得对,但是我还是有个疑问,你那个#define a 50.不就给定死了么???#define我记得之后是不能改参数值的啊
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-3 17:06:06 | 显示全部楼层
a5820736 发表于 2017-8-3 16:58
感觉你最好看点程序

对了,我说的修改值,不是在#define这改了,肯定是在主程序中赋值那样的,比如读取IO口的值去赋值给a。。。这么说你能理解嘛?
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3869
金钱
3869
注册时间
2017-3-7
在线时间
1688 小时
发表于 2017-8-4 09:03:43 | 显示全部楼层
随便定义一个变量,你读一个IO值,判断一下,再进行复制就可以了啊
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-8-4 09:14:47 来自手机 | 显示全部楼层
新手请先了解一下c语言教程
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-4 09:17:15 | 显示全部楼层
l6931639 发表于 2017-8-4 09:14
新手请先了解一下c语言教程

好吧,是我把问题复杂化了。
回复

使用道具 举报

0

主题

93

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2016-7-17
在线时间
147 小时
发表于 2017-8-4 09:25:45 | 显示全部楼层
q247341184 发表于 2017-8-3 17:06
对了,我说的修改值,不是在#define这改了,肯定是在主程序中赋值那样的,比如读取IO口的值去赋值给a。。 ...

例如temp = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7),这个函数就是读取PB7管脚的输入,并将其赋值给temp变量,IO口的那些寄存器都是用来配置IO口的模式的,不能拿来保存你的变量值的,你直接像平时用C语言一样,使用一个变量保存数值就行了,我不明白你所指的“用一个寄存器来专门存储a的值”是什么意思
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-4 09:36:07 | 显示全部楼层
虾兵蟹将 发表于 2017-8-4 09:25
例如temp = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7),这个函数就是读取PB7管脚的输入,并将其赋值给tem ...

我能理解你的意思,你刚才问我的用一个寄存器来专门存储a的值的意思我不太说得清,举个例子说:C语言中不是有指针嘛?假设我定义指针型变量a,a直接指向的是一个地址。然后我想用这一块地址空间只存储a的值,大概是这么个思路。不过我认为你说的是有道理的,如果没有进一步的话,我打算试一下你说的这个方法。。嘿嘿!
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-7 14:54:47 | 显示全部楼层
为了避免后续再有新手有相似的问题看到此贴后仍有疑问,我个人再总结一下,如有不对,望各位指出。

首先,提出的问题是IO口怎么用,但是实际目的解决的是如何设置一片区域(此处用区域来形容是因为一开始希望可以设置寄存器)去存储某个变量的值,并且实现由系统可以进行设定而不是通过JLINK等方式进行下载设定。

我个人的理解是这样的,通过设置变量,然后读取IO口的值存储到变量上以实现,这样可以通过设定IO口的值来修改变量。

后续疑问就是,用定义变量来解决这个问题的话,这个变量值是存储在flash?还是sram?还有就是如果断电了会不会数据丢失?如果会,可不可以通过一个超大电容来缓解这个情况??

最后我要埋汰一下原子哥。老哥我还想继续讨论啊,怎么也要等我发个总结贴吧?两天没带电脑就匆匆设完结了真的好吗???@正点原子
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-8-8 11:34:01 来自手机 | 显示全部楼层
因为这个问题有点逗比……如果学过c和单片机就不会这么问了
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-8-8 11:39:48 来自手机 | 显示全部楼层
你这个情况就是用一个普通的全局变量来存就行,io口本来就是输入输出用的,读一个数据给变量的方法太多。这些变量是断电丢失的,如果想保存的话要么放到后备区域用电池保存要么用eeprom/flash这些保存
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-8 13:33:46 | 显示全部楼层
cromarti 发表于 2017-8-8 11:39
你这个情况就是用一个普通的全局变量来存就行,io口本来就是输入输出用的,读一个数据给变量的方法太多。这 ...

非常细致,很感谢。!!
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-8 13:34:35 | 显示全部楼层
cromarti 发表于 2017-8-8 11:34
因为这个问题有点逗比……如果学过c和单片机就不会这么问了

体量初学者啊老铁
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-1 04:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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