找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3465|回复: 15
收起左侧

老哥们,有一行STM32单片机代码求解

[复制链接]
ID:624696 发表于 2019-11-26 21:17 | 显示全部楼层 |阅读模式
下面是stm32f1的寄存器点亮led灯的代码

        //打开GPIOB端口的时钟
        *(unsigned int *)0x40021018 |= (1<<3);

        //配置IO口为输出
        *(unsigned int *)0x40010c00 |= ( 1<< (4*0));        
        //控制ODR寄存器
        *(unsigned int *)0x40010c0c &= ~(1<<0);

前面的指针类型转换和寄存器地址我都明白,后面的与或非也懂,

但是最后的移位操作不是很明白?
还有与或非是跟谁与或非呢?

有细致的老哥给讲一讲吗,先一下子。。

回复

使用道具 举报

ID:649923 发表于 2019-11-26 21:36 | 显示全部楼层
这样看就比较形象点,表示移几位的意思吧!好久没有写汇编都忘光了
回复

使用道具 举报

ID:235200 发表于 2019-11-27 01:05 | 显示全部楼层
|=和&=是一个运算符,即省写方式,如a|=b  a&=b的意思是a=a|b   a=a&b
*(unsigned int *)0x40021018 |= (1<<3);语句就是地址0x40021018的内容或上0x00000008再入该地址,即数据位D3位置1
回复

使用道具 举报

ID:278179 发表于 2019-11-27 04:22 | 显示全部楼层
*(unsigned int *)0x40021018 |= (1<<3);

1<<3,意思就是:每次移动一位,向左移动3次
与或非是跟谁与或非呢?(0x40021018)或(1左移3次的值)
回复

使用道具 举报

ID:470332 发表于 2019-11-27 08:44 | 显示全部楼层
0x40021018 是一个寄存器地址,你打开手册搜一下这个地址,你看一下寄存器的各个位都代表什么,你就直到这段代码的意思了
回复

使用道具 举报

ID:624696 发表于 2019-11-27 10:23 | 显示全部楼层
jen51h 发表于 2019-11-26 21:36
这样看就比较形象点,表示移几位的意思吧!好久没有写汇编都忘光了

老哥,这不是汇编
回复

使用道具 举报

ID:624696 发表于 2019-11-27 10:28 | 显示全部楼层
csmyldl 发表于 2019-11-27 01:05
|=和&=是一个运算符,即省写方式,如a|=b  a&=b的意思是a=a|b   a=a&b
*(unsigned int *)0x40021018 |= ...

老哥,可以讲解下第二行代码的4*0是什莫意思吗
回复

使用道具 举报

ID:624696 发表于 2019-11-27 10:31 | 显示全部楼层
huwqly 发表于 2019-11-27 04:22
*(unsigned int *)0x40021018 |= (1

第一行董了。可以给说下第二行的4*0吗,谢谢老哥了
回复

使用道具 举报

ID:650611 发表于 2019-11-27 10:38 | 显示全部楼层
0x40021018 是一个寄存器地址,你打开手册搜一下这个地址,你看一下寄存器的各个位都代表什么,你就直到这段代码的意思了
回复

使用道具 举报

ID:367934 发表于 2019-11-27 13:46 | 显示全部楼层
寄存器操作不能直接操作某个寄存器,只能通过移位操作,把1<<n位这是设置某个寄存器的意思,寄存器在哪里就移到哪里,具体是哪一个寄存器就要查看芯片参考手册了。
或“|”的作用是保留的作用,比如说你在这个地方操作了某个寄存器,你又在其他地方操作另外一个寄存器。如果没有或的作用你最后一次的操作就会覆盖前面的操作。加了或就不会影响其他的操作。
与,好像是清除其他的意思,记得不太清楚了。
非,是编码的问题,可尝试一下写一下他的数值进行测试。
回复

使用道具 举报

ID:160500 发表于 2019-11-27 14:15 | 显示全部楼层
4*0从数学上来说就是一个求值,实际也是求值。从代码上来看可以认为4是一个4位的值,后面的0是代表IO或寄存器等等的第几位,0位就是移位0,1位就是移位4位,4*1=4,以此类推。
回复

使用道具 举报

ID:624696 发表于 2019-11-28 11:03 | 显示全部楼层
liuzx66 发表于 2019-11-27 14:15
4*0从数学上来说就是一个求值,实际也是求值。从代码上来看可以认为4是一个4位的值,后面的0是代表IO或寄存 ...

谢谢谢,有点懂 了
回复

使用道具 举报

ID:160500 发表于 2019-11-28 13:24 | 显示全部楼层
1<<3,前面的解释有点不妥,应该是把1这个数左移3次,0001B左移3次,变成1000B,1变成8。如果是2<<3,那就是0010B-》10000B,2变成16.
回复

使用道具 举报

ID:624696 发表于 2019-11-28 22:27 | 显示全部楼层

谢谢老哥,两行代码都明白了
回复

使用道具 举报

ID:624696 发表于 2019-12-9 10:56 | 显示全部楼层
liuzx66 发表于 2019-11-27 14:15
4*0从数学上来说就是一个求值,实际也是求值。从代码上来看可以认为4是一个4位的值,后面的0是代表IO或寄存 ...

谢谢老哥,明白了
回复

使用道具 举报

ID:606366 发表于 2019-12-13 16:56 | 显示全部楼层
jen51h 发表于 2019-11-26 21:36
这样看就比较形象点,表示移几位的意思吧!好久没有写汇编都忘光了

这不是汇编,这是C
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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