PA1=GPIOA->BSRR PA1=0x01 问题: PA1是一个引脚,为啥能把0x01赋给一个引脚,引脚不是一位的吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PA1=GPIOA->BSRR PA1=0x01 问题: PA1是一个引脚,为啥能把0x01赋给一个引脚,引脚不是一位的吗?相关的知识,希望对你有一定的参考价值。

0x01就是1,在c语言代码里面你用什么表示一个位数值呢?
一个引脚对应着高低两种电平,在程序代码里面就是逻辑1和0,C语言里面定义非零值都会编译成逻辑1,只有零值编译过程才会认为是逻辑0。所以在这个赋值语句里面你写0x02也是一样的结果,最终CPU执行的结果是一样的。追问

这个是stm32单片机,
0x01是定义最后一位为1,
GPIOA->BSRR是置1寄存器(位为1的置1,为0的不管)
我不明白明明PA1是引脚,
0x01是怎样把最后一位传给PA1的。

至于你说的变成0x02,它表示的位不一样,含义是不一样的

追答

    先不讲你写出的两条语句的实际意义,我先说说GPIOA->BSRR,GPIOA是STM32通用端口A的端口相关寄存器结构体指针,就像你说的GPIOA->BSRR是置1寄存器,我们进行操作GPIOA->BSRR=0x01时,你可以确定的说,端口A的最低位被置1了,其它位的状态不变。但是PA1=GPIOA->BSRR这种写法就让人匪夷所思了。

    接下来说说你所说的“PA1是引脚”的问题。鉴于你也很肯定的说“PA1=0x01”,我想你用到了位带(BITBAND),使用位带进行重新定义。因为在STM32里面端口引脚不能像51里面那样单独操作。比如我就使用LED1=1点亮一个引脚上的二极管,同时LED是个宏定义#define LED1  PCout(3),深入挖掘,最终的是一个位带的宏定义。在我这个赋值语句里面LED1=1和LED1=10和LED1=0x02都是等价的,因为通过位带映射的那个内存地址被放入了一个非零值,而这个非零值对应芯片引脚就是逻辑1。除此之外别无解释。

    如果PA1=0x01和PA1=0x02的结果不同那么你反复强调的“PA1是引脚”说法就是不恰当的,这种情况下PA1和GPIOA->BSRR是一样的,肯定是宏定义指向同一个寄存器地址,如果真是这样,那么第一条最后提到的疑问就有解释了——你将一个寄存器的数值赋值给了它自己!

    你不需要知道为什么修改一个端口寄存器,对应的芯片的引脚就有高低电平编号吧?想知道我也解释不清。

   就这样吧,如果还是不清楚,就请你把PA1的定义贴出来,因为你自己定义的东西让别人猜有点不合适。好运。

参考技术A 这个间题已经很久了,可能你已经明白了,但我想可能会有初学者来问同样的问题,这个代码的用法一般是做一个字节的数据单线传输,也就是说要把一个数按低位的顺序放到引脚上,每次一位,你可能会问,那不把引脚置1或0不就好了,那是为你知这个数是多少的情况下,如果你不知道传的数是多少,你能操作这个引脚,单片机里非0数给一个位操作时被看着1,0则看着0,不管这个数是多少位,假定传一个8位的数,先从最低位开始,那么除第一位以外,其安位都不管是多少,把它变成0,所以要和x0x01做按位与运算,其结果得到一个第一位与原数据第一位相同,其它位为0的数,这个数要么是0x01,要就是0x00,是哪一个取决于原数位是0还1,最后是引脚被置1或0了,传第二位时,先把原数右移一位,然后重得以为操作,直到8位全部传完!

uva3027

太弱了之前没写过几次并查集合并。

所以这道题拎出来写写。

#include <cstdio>
#include <algorithm>

using namespace std;

const int maxn = 20005;

int t, n;

int pa[maxn], d[maxn];

int find(int x)
{
    if (pa[x] != x)
    {
        int root = find(pa[x]);//此时pa[x]到root的信息已经维护好了。
        d[x] += d[pa[x]];//再把x到pa[x]的信息也维护上。
        return pa[x] = root;
    } else return x;
}

int main()
{
//    freopen("uva3027.in","r",stdin);
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            pa[i] = i;
            d[i] = 0;
        }
        char cmd[9];
        while (scanf("%s", cmd) && cmd[0] != O)
        {
            if (cmd[0] == E)
            {
                int u;
                scanf("%d", &u);
                find(u);
                printf("%d\n", d[u]);
            }
            else if (cmd[0] == I)
            {
                int x, y;
                scanf("%d%d", &x, &y);
                pa[x] = y;
                d[x] = abs(x - y) % 1000;
            }
        }
    }
    return 0;
}

此乃求并查集中点到顶点的距离的写法。

方法是一边路径压缩,一边更新距离。

以上是关于PA1=GPIOA->BSRR PA1=0x01 问题: PA1是一个引脚,为啥能把0x01赋给一个引脚,引脚不是一位的吗?的主要内容,如果未能解决你的问题,请参考以下文章

请教STM32知识点:GPIOA->BSRR 与GPIOA->BRR两个管脚寄存器

c语言中GPIOA->BSRR=1<<9啥意思

5105 pa1 MapReduce

稳定的快排

bzoj 2100: [Usaco2010 Dec]Apple Deliveryspfa

STM32的按键方法