打印
[技术问答]

M0 240 7段LED程序中 GPIO口配置超级难懂

[复制链接]
1419|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
背水一战|  楼主 | 2017-9-5 23:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是M0 240开发板7段数码管显示的,首先做IO口模式设定
函数是设置GPIO口管脚的输入输出模式,里边程序特别难懂
这个u32PinMask 代表管脚数?还是代表结构体GPIO_T里的一个寄存器(数据写保护)?

高手来帮分析一下!!!!

void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode)
{
    uint32_t i;

    for(i = 0; i < GPIO_PIN_MAX; i++)
    {
        if(u32PinMask & (1 << i))
        {
            port->PMD = (port->PMD & ~(0x3 << (i << 1))) | (u32Mode << (i << 1));  //这个压根不知道写啥?
        }
    }
}
沙发
5574293| | 2017-9-6 08:35 | 只看该作者
port->PMD = (port->PMD & ~(0x3 << (i << 1))) | (u32Mode << (i << 1));
这个是引脚模式输入输出控制 你可以代一个数进去试试  看最后出来的数是多少,再根据数据手册,查出设置哪些引脚的输出模式,或者输入模式

使用特权

评论回复
板凳
5574293| | 2017-9-6 08:39 | 只看该作者
他这里其实说的很明白了,你不需要看函数内部的程序,你看入口参数就行了。
GPIO_T *port 这个是选择哪个口  像有些单片机是P1口为一个大类,有些又是PA口为一个大类,看芯片手册怎么分类的。
uint32_t u32PinMask  这个就是具体选择哪个引脚  P11吗,或者PA1吗
uint32_t u32Mode   这个就是选择引脚的模式  输入或者输出 开漏输出呀 上拉输入这些 这些具体的东西就要看你芯片的用户手册了

使用特权

评论回复
地板
背水一战|  楼主 | 2017-9-6 16:06 | 只看该作者
1、我是往底层去学习,才有钻研这个问题。
2、我基本能理解,只不过我用sourceinsign,我一点pinmarsk这个参数,就跳到GPIO_T这个结构体,这个结构体是GPIO寄存器,一度让我错认为这个参数是寄存器的值,另外这段代码我一直想不通,搞那么复杂。

使用特权

评论回复
5
背水一战|  楼主 | 2017-9-6 16:37 | 只看该作者
这个代码难懂,即使用个数进去,也是一知半解。有高手再说说。

使用特权

评论回复
6
zhuotuzi| | 2017-9-6 20:08 | 只看该作者
没必要研究库函数吧,库函数为了更加通用,写的所以复杂点。

使用特权

评论回复
7
zhuotuzi| | 2017-9-6 20:09 | 只看该作者
port->PMD = (port->PMD & ~(0x3 << (i << 1))) | (u32Mode << (i << 1));  //这个压根不知道写啥?
你的疑问在这,这个PMD你要看手册,知道这个寄存器是干啥的,前面的那些操作就是为了实现把参数传递进来设置这个PMD的。

使用特权

评论回复
8
zhuotuzi| | 2017-9-6 20:10 | 只看该作者
i<<1;这个你是不是不懂啊?变量i 左移1位, 结果仍然保存到变量i

使用特权

评论回复
9
zhuotuzi| | 2017-9-6 20:10 | 只看该作者
就是为了让对应的数字填充到对应的PMD位里面。

使用特权

评论回复
10
5574293| | 2017-9-7 14:42 | 只看该作者
可能我们研究的目的不一样吧

使用特权

评论回复
11
5574293| | 2017-9-7 14:43 | 只看该作者
zhuotuzi 发表于 2017-9-6 20:10
就是为了让对应的数字填充到对应的PMD位里面。

我们想法是一致的,不知道楼主的目的是什么

使用特权

评论回复
12
背水一战|  楼主 | 2017-9-13 17:21 | 只看该作者
zhuotuzi 发表于 2017-9-6 20:09
port->PMD = (port->PMD & ~(0x3

我是完全被搞晕了
1、条件语句条件,为什么用位与判断,判断什么?
2、执行语句里,为什么要0x3要左移?理由是什么?

我用一个管脚号代进去试了,但还是不懂。

使用特权

评论回复
13
mintspring| | 2017-9-16 08:42 | 只看该作者
mask蒙版的意思,ps玩过吗?就是保护某个位置的,免得被修改

使用特权

评论回复
14
mintspring| | 2017-9-17 09:17 | 只看该作者
0x3   对应的是00000011是保护某两个连续的位的。你结合着看就知道

使用特权

评论回复
15
背水一战|  楼主 | 2017-9-27 18:02 | 只看该作者
mintspring 发表于 2017-9-17 09:17
0x3   对应的是00000011是保护某两个连续的位的。你结合着看就知道

这个是这么理解

使用特权

评论回复
16
背水一战|  楼主 | 2017-9-27 18:04 | 只看该作者
mintspring 发表于 2017-9-16 08:42
mask蒙版的意思,ps玩过吗?就是保护某个位置的,免得被修改

uint32_t u32PinMask  我理解这是指哪一位,例如第5管脚,就是BIT4

使用特权

评论回复
17
背水一战|  楼主 | 2017-9-27 18:06 | 只看该作者
背水一战 发表于 2017-9-27 18:04
uint32_t u32PinMask  我理解这是指哪一位,例如第5管脚,就是BIT4

程序里用 &  代表是位与。

使用特权

评论回复
18
wahahaheihei| | 2017-9-27 18:42 | 只看该作者
新手都这样,慢慢就习惯了。

使用特权

评论回复
19
wahahaheihei| | 2017-9-27 18:43 | 只看该作者
7段数码管都是IO操作的,然后设置成表,查表显示。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

13

帖子

0

粉丝