发新帖本帖赏金 1.40元(功能说明)我要提问
返回列表
打印
[信息]

大家是如何学好 stm32的?

[复制链接]
楼主: icecut
手机看帖
扫描二维码
随时随地手机跟帖
41
Varus| | 2016-5-10 20:57 | 只看该作者 回帖奖励 |倒序浏览
每块单片机都有自己的定位,全都熟悉不容易啊,只有在应用时候才能印象深刻

使用特权

评论回复
42
huang1007| | 2016-5-11 09:43 | 只看该作者
icecut 发表于 2016-5-10 12:03
用 pc练习肯定是最快的.毋庸置疑. 也是最好的.
但是如果内心不坚定的话,遇到硬件问题就会慌..内心强大就 ...

我的意思是干脆入后台,前端这些坑算了,不弄stm32.反正都是讲架构,这些架构更难,比嵌入式工资也高.....

使用特权

评论回复
43
icecut|  楼主 | 2016-5-11 09:56 | 只看该作者
Varus 发表于 2016-5-10 20:57
每块单片机都有自己的定位,全都熟悉不容易啊,只有在应用时候才能印象深刻 ...

其实 st 的片子型号不同差别并不大.就是一些片内外设的区别.比如 usb, st 有好几个版本,对应不同成本的芯片.还有一些为电机优化高频 pwm 这类.横向比较一下,触类旁通

使用特权

评论回复
44
icecut|  楼主 | 2016-5-11 09:57 | 只看该作者
huang1007 发表于 2016-5-11 09:43
我的意思是干脆入后台,前端这些坑算了,不弄stm32.反正都是讲架构,这些架构更难,比嵌入式工资也高..... ...

可以啊.但是物以稀为贵.现在嵌入式行业很缺高手,一样可以拿到高薪.一般是水平不行的人去互联网拿高薪,而水平高的就安安分分的在嵌入式等两年,然后工资就高了.

使用特权

评论回复
45
ST代理yang| | 2016-5-12 14:16 | 只看该作者
高手总是磨炼出来的

使用特权

评论回复
46
yjmwxwx| | 2016-5-12 19:26 | 只看该作者
从一开始就学的汇编很冷门范例很少,业余断断续续学了好几年只能写点小程序,还是菜鸟一枚。


库很复杂,代码很难懂 ,看着那么多函数名就头疼。  


上个GPIO_Init的代码,很繁琐很难懂



@ IO口设置,入口SP指向的地址底16位是具体要设置哪一位,
@ SP高16位决定IO的状态,通过繁琐 的计算获得设置的模式
@

sub_80039EC:        @ CODE XREF: sub_8000276+20p

          @ sub_800029C+20p


    PUSH.W  {R4-R8,LR}

    MOV  R2, R0    @ r2=0x40010c00  PB

    MOVS  R5, #0    @ R5=0

    MOVS  R6, #0    @ R6=0

    MOVS  R0, #0    @ R0=0

    MOVS  R3, #0    @ R3=0

    MOVS  R4, #0    @ R4=0

    MOVS  R7, #0    @ R7=0

    LDRB.W  R12, [R1,#3]  @ R12=0X48,利用堆栈传递的数据

    AND.W  R5, R12, #0xF  @ 0X48 & 0XF = 0X8

    LDRB.W  R12, [R1,#3]  @ r12=0x48

    TST.W  R12, #0x10  @ 检测第4位等不等于1

    BEQ  loc_8003A18  @ 等于0跳转

    LDRB.W  R12, [R1,#2]  @ R12=0X03 堆栈传递的数据

    ORR.W  R5, R12, R5  @ 0x03 逻辑或 0x08 = 0x0B



loc_8003A18:        @ CODE XREF: sub_80039EC+22j

    LDRH.W  R12, [R1]  @ r12= 0x4000 堆栈传递的数据


    TST.W  R12, #0xFF  @ 测试底8等不等于0XFF

    BEQ  loc_8003A86  @ 等于0跳转

    LDR  R4, [R2]  @ 取出PB口底8位的设置

    MOVS  R0, #0    @ R0=0

    B  loc_8003A80

@ ---------------------------------------------------------------------------

loc_8003A28:        @ CODE XREF: sub_80039EC+96j


    MOV.W  R12, #1    @ r12= 1

    LSL.W  R3, R12, R0  @ R12左移R0位

    LDRH.W  R12, [R1]  @ R12=0X4000

    AND.W  R6, R12, R3  @ 0X4000与R3

    CMP  R6, R3    @ R6和R3比较

    BNE  loc_8003A7E  @ 不等于跳转

    LSLS  R3, R0,  #2  @ R3=R0左移2位

    MOV.W  R12, #0xF  @ R12=0X0F

    LSL.W  R7, R12, R3  @ 0XF左移R3位

    BICS  R4, R7    @ 位请0

    LSL.W  R12, R5, R3  @ R5左移R3

    ORR.W  R4, R12, R4  @ R12逻辑或R4 =  PB1= 0XB

    LDRB.W  R12, [R1,#3]  @ R12= 0X48

    CMP.W  R12, #0x28  @ R12和0X28比较

    BNE  loc_8003A68  @ 不等于跳转

    MOV.W  R12, #1    @ R12 =  1

    LSL.W  R12, R12, R0

    STR.W  R12, [R2,#0x14]  @ BRR关IO口

    B  loc_8003A7E

@ ---------------------------------------------------------------------------

loc_8003A68:        @ CODE XREF: sub_80039EC+6Cj

    LDRB.W  R12, [R1,#3]  @ 取出条件,堆栈传递的数据

    CMP.W  R12, #0x48  @ R12和0X48比较

    BNE  loc_8003A7E  @ 不等于跳转

    MOV.W  R12, #1    @ R12= 1

    LSL.W  R12, R12, R0  @ 1左移0位

    STR.W  R12, [R2,#0x10]  @ BSRR开IO


loc_8003A7E:        @ CODE XREF: sub_80039EC+4Ej

          @ sub_80039EC+7Aj ...

    ADDS  R0, R0,  #1


loc_8003A80:        @ CODE XREF: sub_80039EC+3Aj

    CMP  R0, #8    @ 0和8比较

    BCC  loc_8003A28  @ 如果小于跳转

    STR  R4, [R2]  @ 8位完成把设置的数据写入入口地址


loc_8003A86:        @ CODE XREF: sub_80039EC+34j


    LDRH.W  R12, [R1]

    CMP.W  R12, #0xFF


    BLE  locret_8003AFA  @ 小于等于0XFF跳转

    LDR  R4, [R2,#4]  @ 读出高8位设置

    MOVS  R0, #0

    B  loc_8003AF4

@ ---------------------------------------------------------------------------


loc_8003A96:        @ CODE XREF: sub_80039EC+10Aj

    ADD.W  R12, R0, #8  @ R12=8

    MOV.W  R8, #1    @ R8= 1

    LSL.W  R3, R8,  R12  @ R8左移R12

    LDRH.W  R12, [R1]  @ 读出存在堆栈里的变量

    AND.W  R6, R12, R3  @ R12 & r3

    CMP  R6, R3    @ R6和R3比较

    BNE  loc_8003AF2  @ 不等于跳转

    LSLS  R3, R0,  #2  @ R0 左移2位

    MOV.W  R12, #0xF  @ R12= 0XF

    LSL.W  R7, R12, R3  @ R12左移R3位

    BICS  R4, R7    @ 清0相应位

    LSL.W  R12, R5, R3  @ R5左移R3

    ORR.W  R4, R12, R4  @ R12或R4

    LDRB.W  R12, [R1,#3]  @ 读出堆栈传递的数据

    CMP.W  R12, #0x28  @ R12和0X28比较

    BNE  loc_8003AD8  @ 不等于跳转

    ADD.W  R12, R0, #8  @ R8加8  表示高8位

    LSL.W  R8, R8,  R12  @ R8左移R12

    STR.W  R8, [R2,#0x14]  @ 写入关闭IO


loc_8003AD8:        @ CODE XREF: sub_80039EC+DEj

    LDRB.W  R12, [R1,#3]  @ 取出堆栈传递的条件数据

    CMP.W  R12, #0x48  @ 然后用这个数据和0X48比较

    BNE  loc_8003AF2  @ 没到最高位继续计算

    ADD.W  R12, R0, #8  @ 表示高8位

    MOV.W  R8, #1    @ r8= 1

    LSL.W  R8, R8,  R12  @ 左移R12位

    STR.W  R8, [R2,#0x10]  @ 打开IO

loc_8003AF2:        @ CODE XREF: sub_80039EC+C0j

          @ sub_80039EC+F4j

    ADDS  R0, R0,  #1

loc_8003AF4:        @ CODE XREF: sub_80039EC+A8j

    CMP  R0, #8

    BCC  loc_8003A96  @ 再算出高8位设置

    STR  R4, [R2,#4]  @ 写入高8位设置

locret_8003AFA:        @ CODE XREF: sub_80039EC+A2j

    POP.W  {R4-R8,PC}  @ 返回

使用特权

评论回复
47
lxyppc| | 2016-5-12 21:22 | 只看该作者
yjmwxwx 发表于 2016-5-12 19:26
从一开始就学的汇编很冷门范例很少,业余断断续续学了好几年只能写点小程序,还是菜鸟一枚。



这个汇编风格不好维护
常数全靠注释来说明,一般都预定义起别名

一般跳转目标都是用一个有意义的标号
而不是直接用无意义的loc_xxxxx

代码里用了堆栈来传数据
但是代码开头没说明数据的格式

基本上你的代码需要一看到底才知道要做什么
分块分段概念很模糊

使用特权

评论回复
48
john_lee| | 2016-5-12 21:38 | 只看该作者
lxyppc 发表于 2016-5-12 21:22
这个汇编风格不好维护
常数全靠注释来说明,一般都预定义起别名

我认为老弟指点他如何写好汇编的意义不大,其它还有很多值得花时间学习的知识都比这个有意义。

使用特权

评论回复
49
icecut|  楼主 | 2016-5-13 09:55 | 只看该作者
yjmwxwx 发表于 2016-5-12 19:26
从一开始就学的汇编很冷门范例很少,业余断断续续学了好几年只能写点小程序,还是菜鸟一枚。

汇编这么好,其实看看 c 语言转成汇编的代码应该更简练.

使用特权

评论回复
50
yjmwxwx| | 2016-5-13 10:41 | 只看该作者
本帖最后由 yjmwxwx 于 2016-5-13 10:44 编辑
icecut 发表于 2016-5-13 09:55
汇编这么好,其实看看 c 语言转成汇编的代码应该更简练.

这个就是C语言编译然后反汇编的,这个函数可能是GPIO_int ,我没用过固件库不太清楚,当时在IDA反汇编里面看到这个函数感觉很复杂很难分析,看的头疼。  
刚才自己写了个代替他这个函数功能的汇编
cunchushuju:
        ldr r0, = 0x40010800      @ 哪个IO
        ldr r1, = 0x33333333       @CRL配置
        ldr r2, = 0xbbbbbbbb       @CRH配置
        ldr r3, = 0x10020             @开关哪个IO

GPIO_int:         @ 入口R0=哪个IO
                   @R1=CRL IO模式设置
                   @R2= CRH IO模式设置
                   @R3= 0-15位决定设置哪一位,第16位是1 =IO开,是0=IO关
                push {r0-r3, lr}
                str r1, [r0]            @ 写入CRL
                str r2, [r0, # 0x04]     @写入CRH
                tst r3, 0x10000          @ 测试第16位
                ite ne
                strhne r3, [r0, # 0x10]   @ 如果是1执行我
                strheq r3, [r0, # 0x14]   @ 如果是0执行我
                 pop {r0-r3, pc}                 @返回



  

使用特权

评论回复
51
shizaigaole| | 2016-5-13 14:19 | 只看该作者
和学其他单片机一样:

1. 买块开发版,熟悉编译,下载环境
2. 写个跑马灯,自己感受一下
3. 把STM32的中断,尤其是定时中断搞清楚
4. 作为硬件应用来说,一定还要仔细看看IO管叫相关电气方面的参数。

到这一步就基本入门了。

但是要熟练使用STM32,还要踏踏实实的把stm32的文档手册读一遍。
然后学习编译器自带的例程,把这些例程精简以后移植到自己得开发版上去跑一跑。

其实做几个模块后,就基本熟悉了。

以后要用的就再去啃手册和例程

使用特权

评论回复
52
shizaigaole| | 2016-5-13 14:21 | 只看该作者
说白了三句话:

1.熟悉编译下载环境
2.啃手册
3.研习官方例程

使用特权

评论回复
评论
icecut 2016-5-13 16:46 回复TA
补一句:看看官方库,最新的 hal 库会更轻量级更舒服 
53
shizaigaole| | 2016-5-13 14:22 | 只看该作者
任何学习的过程都是痛苦的过程。
但是小有所成也有点小的收获感。

最近在学emwin,小有所成,自我感觉很好了好一阵子,哈哈。

使用特权

评论回复
评论
icecut 2016-5-13 16:47 回复TA
期待你苦尽甘来... 
54
icecut|  楼主 | 2016-5-13 16:44 | 只看该作者
yjmwxwx 发表于 2016-5-13 10:41
这个就是C语言编译然后反汇编的,这个函数可能是GPIO_int ,我没用过固件库不太清楚,当时在IDA反汇编里面 ...

写个模拟器,执行一下,就直接打印结果好了

使用特权

评论回复
55
feilusia| | 2016-5-13 16:45 | 只看该作者
这是我自己的学习路线:
1、51学习寄存器操作(网上资料大把,不局限谁的资料)
2、stm8学习寄存器和库操作(看风驰电子的资料)
3、stm32学习寄存器和库操作(看正点原子的资料)
4、CC2541学习协议栈(看amo的资料、看我写的资料)
5、安卓入门学习(看《第一行代码》)………………(目前我所处阶段)
6、安卓蓝牙学习(未知)

使用特权

评论回复
56
icecut|  楼主 | 2016-5-13 16:45 | 只看该作者
Larm1 发表于 2016-5-13 13:49
1.  刚开始使用寄存器配置时,感觉要看的文档,花的时间确实比较多;
2. 后来官方退出了固件库,刚开始使用 ...

cubemx 带了一个 freertos,国人还是喜欢 ucos....

使用特权

评论回复
57
icecut|  楼主 | 2016-5-13 16:46 | 只看该作者
shizaigaole 发表于 2016-5-13 14:19
和学其他单片机一样:

1. 买块开发版,熟悉编译,下载环境

你这入门有点早啊...入门了还是当单片机用.其实 stm32性能还能好很多

使用特权

评论回复
58
ywlzh| | 2016-5-13 19:35 | 只看该作者
哈哈哈 我路过,也说说吧,

初学stm32,我也是从8位,16位单片机走过来的,学习的第一步,就是点亮个灯。

有人是只管点亮就行了,有人是会继续深究为什么会点亮。

目的是一样的,但有人是走个过场,有人能举一反三。

使用特权

评论回复
59
ywlzh| | 2016-5-13 19:38 | 只看该作者
feilusia 发表于 2016-5-13 16:45
这是我自己的学习路线:
1、51学习寄存器操作(网上资料大把,不局限谁的资料)
2、stm8学习寄存器和库操作 ...

你的CC2541的资料可否发我一份?

使用特权

评论回复
60
feilusia| | 2016-5-13 21:18 | 只看该作者
ywlzh 发表于 2016-5-13 19:38
你的CC2541的资料可否发我一份?

所有CC2541资料都开源在我签名档的博客里。

使用特权

评论回复
发新帖 本帖赏金 1.40元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则