群发资讯网

我跟着一个LED折腾了三天,才搞懂它为啥一亮一灭。 原来写个`GPIOG->BS

我跟着一个LED折腾了三天,才搞懂它为啥一亮一灭。
原来写个`GPIOG->BSRRL = 1`,CPU真就跑到0x40021818那个地址去写了一个数。那地方根本不是内存,是GPIOG外设的寄存器,连着引脚下面的晶体管。写1,就推一把电平,LED就亮。
编译完的代码不是直接跑的。链接脚本.sct先画好地图:代码放FLASH开头,变量分两拨——带初值的(RW)得从FLASH拷到RAM,清零的(ZI)直接在RAM里划块空地等启动时抹零。MAP文件里全写明了每个变量在哪儿,连栈顶地址都钉死了。
`__main`不是你的main,是ARM库偷偷干的活:搬数据、清内存、设堆栈,做完才跳给你。你写的`main()`,其实是整个链条里最晚登场的那个。
没看手册前,我以为寄存器是软件造的假东西。看了才知道,是硅片上真有根线,连着你敲的那行代码。
这就是全部。