社区导航

 
查看: 1739|回复: 25

[讨论] 50字节实现STM32L011 Blink.

  [复制链接]

852

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-1-17 22:40:45 | 显示全部楼层 |阅读模式
仅仅50字节,就可以实现LED闪烁.代码展示.纯挑战极限.
不要问为什么没C代码,没用C写,不要问为什么没汇编代码,汇编出来比这个大,这个是汇编后再优化的.PB3接一个LED,主芯片是STM32L011K4,也是那个Nucleo-L011.

手上有板子可以试试.反正我当时11.11团购的,估计很多人有.

hex: stm32l011-nucleo-blink.zip (277 Bytes, 下载次数: 14)

评分

1

查看全部评分



回复

使用道具 举报

1448

TA的帖子

2

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-1-18 00:06:58 | 显示全部楼层
本帖最后由 freebsder 于 2017-1-18 00:24 编辑

比较有趣的话题。
搞这种事的人现在搞得人不多,因为资源越来越丰富。。。
楼主这个,1是怎么看thumb指令,2是直接在int vector里面写reset handler,这点其实和arm7时代的fast irq一个的意思,3是只处理IO的模式和输出高低,其实反到汇编之后是一目了然的。
两条命令:
arm-none-eabi-objcopy -I ihex -O binary stm32l011-nucleo-blink.hex stm32l011-nucleo-blink.bin
arm-none-eabi-objdump -b binary -m arm -M force-thumb -EL -D stm32l011-nucleo-blink.bin

  1.    
  2.    0:        0009              movs        r1, r1
  3.    2:        0000              movs        r0, r0
  4.    4:        0009              movs        r1, r1               ;reset地址0x8,最低位置1表示thumb,所以数据是0x9
  5.    6:        0000              movs        r0, r0
  6.    8:        4806              ldr        r0, [pc, #24]        ; (0x24)    0x4002102c
  7.    a:        4907              ldr        r1, [pc, #28]        ; (0x28)    0x2
  8.    c:        6001              str        r1, [r0, #0]
  9.    e:        4807              ldr        r0, [pc, #28]        ; (0x2c)    0x50000400
  10.   10:        4907              ldr        r1, [pc, #28]        ; (0x30)   7fff (后面都可默认flash擦写为FF)
  11.   12:        6001              str        r1, [r0, #0]
  12.   14:        6942              ldr        r2, [r0, #20]
  13.   16:        404a              eors        r2, r1
  14.   18:        6142              str        r2, [r0, #20]
  15.   1a:        4b06              ldr        r3, [pc, #24]        ; (0x34)
  16.   1c:        1c5b              adds        r3, r3, #1
  17.   1e:        4293              cmp        r3, r2
  18.   20:        d1fc              bne.n        0x1c                 ;和 0x1c 做计数循环
  19.   22:        e7f7              b.n        0x14                    ;和 0x14 做外部循环的IO异或闪灯
复制代码
$hexdump stm32l011-nucleo-blink.bin

  1. 0000000 09 00 00 00 09 00 00 00 06 48 07 49 01 60 07 48
  2. 0000010 07 49 01 60 42 69 4a 40 42 61 06 4b 5b 1c 93 42
  3. 0000020 fc d1 f7 e7 2c 10 02 40 02 00 00 00 00 04 00 50
  4. 0000030 7f ff                                          
  5. 0000032
复制代码




点评

free树树,我看这代码还可以继续优化,搞起来!  详情 回复 发表于 2017-1-18 01:04
free树树果然是老当益壮,不服不行!  详情 回复 发表于 2017-1-18 00:46

评分

1

查看全部评分

人已离开,无事别找,找也找不到。


回复

使用道具 举报

7050

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2017-1-17 22:57:53 | 显示全部楼层
适当介绍一下吧


回复

使用道具 举报

5405

TA的帖子

179

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-17 23:39:46 | 显示全部楼层
本帖最后由 lcofjp 于 2017-1-18 00:46 编辑

不懂帮顶,手里没有stm32,看free树树给我们讲解。
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

1448

TA的帖子

2

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-1-18 00:20:01 | 显示全部楼层
@soso @eric_wang 实在受不了这个编辑器了,老掉字,怎么编辑都不行。
被吃掉的编辑也贴不上去,注释写好也没了,真是麻烦。
屏幕快照 2017-01-18 上午12.16.59.png

点评

测试了几次确实存在这个问题 因为涉及到JS的修改,这种修改有点像牵一发而动全身,会造成其他插件出现bug,所以暂时用了一个比较初级的方案:插入代码点提交会像图中这种展示出来,虽然不好看,但是能保证代码不被  详情 回复 发表于 2017-1-18 11:04
人已离开,无事别找,找也找不到。


回复

使用道具 举报

5405

TA的帖子

179

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-18 00:46:59 | 显示全部楼层
freebsder 发表于 2017-1-18 00:06
比较有趣的话题。
搞这种事的人现在搞得人不多,因为资源越来越丰富。。。
楼主这个,1是怎么看thumb指令 ...

free树树果然是老当益壮,不服不行!
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

5405

TA的帖子

179

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-18 01:04:36 | 显示全部楼层
freebsder 发表于 2017-1-18 00:06
比较有趣的话题。
搞这种事的人现在搞得人不多,因为资源越来越丰富。。。
楼主这个,1是怎么看thumb指令 ...

free树树,我看这代码还可以继续优化,搞起来!

点评

堆栈没用,所以烧写的时候可以偏移4个字节出来,最后的FF抹掉利用Flash擦后的默认值减掉1个,0x2那里换成字节寻址减掉3个,初略看8个字节减少8/50=16%了  详情 回复 发表于 2017-1-18 09:25
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

5405

TA的帖子

179

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-18 05:20:43 | 显示全部楼层
记得十多年前看过一个程序,编程比赛的获奖作品,是一个DOS程序,8个字节大小。

点评

http://www.pouet.net/prodlist.php?type%5B%5D=32b&platform%5B%5D=MS-Dos&page=1 这个论坛有很多类似作品  详情 回复 发表于 2017-1-18 10:40
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

852

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-1-18 07:42:49 来自手机 | 显示全部楼层
8个字节也只能放个向量什么都干不了。


回复

使用道具 举报

852

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-1-18 07:44:54 来自手机 | 显示全部楼层
再节省也是个位数字节内


回复

使用道具 举报

65

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-18 08:32:33 | 显示全部楼层


回复

使用道具 举报

1448

TA的帖子

2

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-1-18 09:25:29 | 显示全部楼层
lcofjp 发表于 2017-1-18 01:04
free树树,我看这代码还可以继续优化,搞起来!

堆栈没用,所以烧写的时候可以偏移4个字节出来,最后的FF抹掉利用Flash擦后的默认值减掉1个,0x2那里换成字节寻址减掉3个,初略看8个字节减少8/50=16%了

点评

这还真不行,l011从0x04开始取,后面可以,不过得保证擦为0  详情 回复 发表于 2017-1-18 09:39
人已离开,无事别找,找也找不到。


回复

使用道具 举报

852

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-1-18 09:39:21 | 显示全部楼层
本帖最后由 cl17726 于 2017-1-18 10:48 编辑
freebsder 发表于 2017-1-18 09:25
堆栈没用,所以烧写的时候可以偏移4个字节出来,最后的FF抹掉利用Flash擦后的默认值减掉1个,0x2那里换成 ...

这还真不行,l011从0x04开始取,后面可以,不过得保证擦为0,l011擦后为0,字节寻址会hardfault,具体还不知道原因,有知道吗
1)末位FF不能去掉,不然狂闪不止.
2)手册表示,这个能去掉吗?

The boot mode configuration is also re-sampled when exiting from Standby mode, except
for category 1 devices where BOOT0 pin is latched on NRST rising edge. Consequently the
boot mode configuration must not be modified in Standby mode (except for category 1
devices). After this startup delay has elapsed, the CPU fetches the top-of-stack value from
address 0x0000 0000, then starts code execution from the boot memory at 0x0000 0004

3)字节寻址正确做法怎么切换呢?我发现怎么改都HARDFAULT PS:找到问题了,原来是这个核心只接受WORD寻址.


无标题.png
假设擦后代码全位0,复合寻址规定,那么可以这样.


09        00        00        00        09        00        00        00        06        48        07        49        01        60        07        48
01        60        42        69        4A        40        42        61        05        4B        5B        1C        93        42        FC        D1
F7        E7        00        00        2C        10        02        40        7F        FF        0F        00        00        04        00        50



                LDR R0,=0x4002102C
                LDR R1,=0x000FFF7F
                STR R1, [R0]
                LDR R0,=0x50000400
                STR R1, [R0]
Application
                LDR R2,[R0,#0x14]
                EORS R2,R2,R1
                STR R2,[R0,#0x14]
                LDR R3,=0x000F0000
Delay
                ADDS     R3,R3,#1
                CMP      R3,R2
                BNE      Delay
                B Application
对齐要求,取指要求等等限制,估计都没的话可以到40B+吧.


点评

我手里没器件,就不尝试了。 只针对你这个话题,0x2那个,你可以改成立即数寻址,把0x2直接做到指令里面,把这个字节也减掉。前面的堆栈抹掉之后,烧录的时候从0x08000004开始烧。 另外,擦除不应该是0xff吗?你这  详情 回复 发表于 2017-1-18 10:17


回复

使用道具 举报

1448

TA的帖子

2

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-1-18 10:17:00 | 显示全部楼层
cl17726 发表于 2017-1-18 09:39
这还真不行,l011从0x04开始取,后面可以,不过得保证擦为0,l011擦后为0,字节寻址会hardfault,具体还 ...

我手里没器件,就不尝试了。
只针对你这个话题,0x2那个,你可以改成立即数寻址,把0x2直接做到指令里面,把这个字节也减掉。前面的堆栈抹掉之后,烧录的时候从0x08000004开始烧。
另外,擦除不应该是0xff吗?你这个怎么是0x0.

点评

前4可以是其他数,但不能为0,不能为全f,st用来区分不知道什么东西.所以还是得从0x08000000烧,哎  详情 回复 发表于 2017-1-18 10:47
我也是写时候才发现这个擦是0x00,为什么会按WORD取呢,因为里面有个prefetch,然后那个一次性取一次word当指令用... 关掉就可以按byte,但是更多了.  详情 回复 发表于 2017-1-18 10:45
人已离开,无事别找,找也找不到。


回复

使用道具 举报

170

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-18 10:40:58 | 显示全部楼层
lcofjp 发表于 2017-1-18 05:20
记得十多年前看过一个程序,编程比赛的获奖作品,是一个DOS程序,8个字节大小。

http://www.pouet.net/prodlist.ph ... D=MS-Dos&page=1

这个论坛有很多类似作品

点评

终于等到地址了,以前收藏过,丢了就再没找到了。谢谢  详情 回复 发表于 2017-1-18 11:12


回复

使用道具 举报

852

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-1-18 10:45:16 | 显示全部楼层
freebsder 发表于 2017-1-18 10:17
我手里没器件,就不尝试了。
只针对你这个话题,0x2那个,你可以改成立即数寻址,把0x2直接做到指令里面 ...

我也是写时候才发现这个擦是0x00,为什么会按WORD取呢,因为里面有个prefetch,然后那个一次性取一次word当用... 关掉就可以按byte,但是更多了.

点评

m0+支持字节寻址能力,ldr,str后面加b后缀,预取是预取,封装在API(architect programming interface)之下的,你看不到也操作不了。 如果这个器件erase擦除是0,我只能说太尼玛特立独行的奇葩了。 如果sp需要符合  详情 回复 发表于 2017-1-18 11:26


回复

使用道具 举报

852

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-1-18 10:47:32 | 显示全部楼层
freebsder 发表于 2017-1-18 10:17
我手里没器件,就不尝试了。
只针对你这个话题,0x2那个,你可以改成立即数寻址,把0x2直接做到指令里面 ...

前4可以是其他数,但不能为0,不能为全f,st用来区分不知道什么东西.所以还是得从0x08000000烧,哎


回复

使用道具 举报

7942

TA的帖子

2

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2017-1-18 11:04:19 | 显示全部楼层
freebsder 发表于 2017-1-18 00:20
@soso @eric_wang 实在受不了这个编辑器了,老掉字,怎么编辑都不行。
被吃掉的编辑也贴不上去,注释写好 ...

测试了几次确实存在这个问题
因为涉及到JS的修改,这种修改有点像牵一发而动全身,会造成其他插件出现bug,所以暂时用了一个比较初级的方案:插入代码点提交会像图中这样展示出来,虽然不好看,但能保证代码不被吃掉,后续我们会继续跟进找出更好的解决办法
QQ20170118-110303.jpg



回复

使用道具 举报

1448

TA的帖子

2

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-1-18 11:12:17 | 显示全部楼层
EETUX 发表于 2017-1-18 10:40
http://www.pouet.net/prodlist.php?type%5B%5D=32b&platform%5B%5D=MS-Dos&page=1

这个论坛有很多类 ...

终于等到地址了,以前收藏过,丢了就再没找到了。谢谢
人已离开,无事别找,找也找不到。


回复

使用道具 举报

1448

TA的帖子

2

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-1-18 11:26:50 | 显示全部楼层
cl17726 发表于 2017-1-18 10:45
我也是写时候才发现这个擦是0x00,为什么会按WORD取呢,因为里面有个prefetch,然后那个一次性取一次word当 ...

m0+支持字节寻址能力,ldr,str后面加b后缀,预取是预取,封装在API(architect programming interface)之下的,你看不到也操作不了。
如果这个器件erase擦除是0,我只能说太尼玛特立独行的奇葩了。
如果sp需要符合什么要求,那应该是st用作验证了,我没记错的话freescale的器件是在其他某个地址写入一串特定值,各家不一样。看来这4个字节是不能用erase的默认了。

点评

刚试验一下,依然hardfault,这个擦后是0,我猜他rom也是eeprom构造,因为片内有eeprom,连续编址的  详情 回复 发表于 2017-1-18 13:02
人已离开,无事别找,找也找不到。


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-9-22 23:08 , Processed in 0.667607 second(s), 20 queries , Gzip On, Redis On.

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