搜索
bottom↓
回复: 872

从51到ARM,这路怎么走?(精华在23楼)

  [复制链接]

出0入0汤圆

发表于 2012-3-27 02:13:31 | 显示全部楼层 |阅读模式
很多人说:有51基础的人很容易入门ARM。我想说,坑爹啊,我就是51走过来的,看ARM几个月了,一点进展都没有,也不太知道从何入手,下面说下我的问题吧,我想也有很多人跟我一样遇上这些问题,所以希望大家仔细看看,并回复我一下,指条明道。
51都是有地址映射的(即SFR,特殊功能寄存器),在头文件reg52.h里面,不知道ARM有没有,且不知道如何调用。以STM32为例,官方有提供个固件库,也就是好几个文件夹和几十个文件,里面有会汇编写的,也有用C写的,貌似也有地址映射,貌似里面的地址映射语句不是像51里面用sfr来表示的,貌似是用#define来定义的,这边搞糊涂了。固件库中还包含了很多打包好的程序,比如说各种传输协议要用到的程序。但我的思维还停留在51,并且我不知道停留在51的这种思维是否是正确的:那就是,完全自己编码,除了sfr定义,包括很多包装好的函数,自己写出来才算学会。这种思维,不知道在ARM学习上是否同等适用,难道学ARM时上了个层次,就直接在别人打包好程序的基础上做产品了吗?必须强调,在上位机,PC软件方面,是得调用操作系统的很多函数、库,这个没办法,因为强大的PC界面及功能,如果底层驱动什么的都自己写的话会累死,而且不一定有成效。但ARM不同,不同在他比PC低一层次,但同时又高51一个层次,所以我纠结了。并且我现在不知何从入手,就算是将固件库搞明白也得花不少时间。但我觉得,如果让ARM点亮一个小LED,应该用不上那么多固件库或函数,只要能点亮个LED就行,这么低的要求,应该是用到很少的语句及配置程序,但网上所有的教程基本上首先就教你:如何调用所有的官方库。这无疑让初学者陷入泥潭,晕。
说得很乱,初学者就这样,我现在回头看看我之前学51时问的问题,也觉得那些问题很没逻辑。但请理解,如果有什么问得无厘头的地方,多多包含!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-3-27 08:16:06 | 显示全部楼层
我很有感触,我大学刚毕业就懂点51,后来到单位实习,领导让我单独搞一个产品用STM32,就大致的和我说了下思路,要我在规定的时间里完成,我自己很清楚,能不能留下来,就看这次做的怎么样了,我马上上网搜索STM32方面的资料,全部初略的看了一篇,在看了一些视频,买了开发板,跟着教程做了几个实验,摸索了一个月,大致明白了STM32,以后慢慢的用到现在也就10个月左右,做了很多有关STM32的产品。

对于库的问题,我刚开始也很不明白,觉得这样很不爽,后来等到你做产品时,你才会发现“开发时间是最重要的”,毕竟32位的CPU,寄存器的数量和配置,是不像51妈么容易的,我们要站在巨人的肩膀上去实现我们所需要的东西,当你要升入了解时,或者调试碰到问题时,再去查看寄存器。

还有你最好是从原理图到程序全部自己弄,到阿莫PCB打烊,自己做一个小的东西,等你昨晚后,你至少是知道怎么去学了

出0入0汤圆

发表于 2012-3-27 08:25:44 | 显示全部楼层
看来楼主不怎么熟悉C语言,STM32的寄存器都是以结构体形式出现的,具体外设是一个结构体指针,外设的寄存器通过引用结构体的成员。从他们提供的库函数就可以看出,都是通过这种方式操作的。reference manual也没仔细看吧。入门的第一件事应该是仔细研读一下文档呀。

出0入0汤圆

发表于 2012-3-27 08:31:39 | 显示全部楼层
匿名结构体是发展趋势,稍复杂点的MCU都是这种形式,多个相同外设使用同一个结构体即可,只是起始地址不同(如SPI1,SPI2,SPI3)。

出0入12汤圆

发表于 2012-3-27 09:14:00 | 显示全部楼层
有压力就有动力,就走得下来

出0入0汤圆

 楼主| 发表于 2012-3-27 12:21:18 | 显示全部楼层
lcofjp 发表于 2012-3-27 08:25
看来楼主不怎么熟悉C语言,STM32的寄存器都是以结构体形式出现的,具体外设是一个结构体指针,外设的寄存器 ...

我没有这个文档:reference manual
能否提供下?
说实话,像我这样的新手连要看什么文档都不知道,希望大神告诉我应该看些什么。

出0入0汤圆

发表于 2012-3-27 12:43:01 | 显示全部楼层
raxfeer 发表于 2012-3-27 12:21
我没有这个文档:reference manual
能否提供下?
说实话,像我这样的新手连要看什么文档都不知道,希望大 ...

www.st.com去寻找你所需要的。

出0入0汤圆

发表于 2012-3-27 12:43:01 | 显示全部楼层
raxfeer 发表于 2012-3-27 12:21
我没有这个文档:reference manual
能否提供下?
说实话,像我这样的新手连要看什么文档都不知道,希望大 ...

www.st.com去寻找你所需要的。

出0入0汤圆

发表于 2012-3-27 12:47:09 | 显示全部楼层
要学结构体?看来有得补c去了

出0入98汤圆

发表于 2012-3-27 12:50:38 | 显示全部楼层
TI的C2000系列DSC也是差不多这样的结构给出各个寄存器的操作办法

我觉得挺好的 反而51的教材应该改改了 把一些外设例如UART之类的封装成结构体

出0入0汤圆

发表于 2012-3-27 12:51:39 | 显示全部楼层
c语言很重要,阅读文档,比看视频,更有效率,我也在刚开始学STM32

出0入0汤圆

发表于 2012-3-27 13:13:29 | 显示全部楼层
st的技术员写了这么多的函数库给你,如果你是单纯的做产品,还去看什么鸟结构体干嘛啊,直接调用库里边的函数就行了,库里边ST的技术人员写的傻瓜式的函数,一看就知道怎么用了,对照着DS手册就ok了,如果你想学习C语言,可以看一下ST技术人员的杰作!研究一下如何定义结构体和整体的程序框架。

出0入4汤圆

发表于 2012-3-27 13:34:34 | 显示全部楼层
和楼主一样,我学了AVR又学ARM,总感觉太难,现在还停留在ARM流水灯的水平

出0入0汤圆

发表于 2012-3-27 13:35:13 | 显示全部楼层
badboy.tao 发表于 2012-3-27 08:16
我很有感触,我大学刚毕业就懂点51,后来到单位实习,领导让我单独搞一个产品用STM32,就大致的和我说了下 ...

我很同意,要学好技术这块,原理图、PCB、程序都要自己走一遍才可以

出0入0汤圆

发表于 2012-3-27 13:44:55 | 显示全部楼层
楼主,不要急,任何东西都是有一个学习的过程的。
从本质上看,STM32只是功能强一点的单片机,所以跟51没啥很大的区别,特别是开发环境都是 keil ,可以说大部分都差不多。

而ST提供的库本身的目的就是要你快速的能访问底层硬件,而不用关心太多。你只需要学会怎么调用库函数就完成了对硬件的操作,很方便。

上面也有人说了,你的C语言不熟悉,连库代码都看不懂,这就没啥好说的了。

出0入0汤圆

发表于 2012-3-27 13:48:38 | 显示全部楼层
有基础的话,直接跳过进入ARM吧。

出0入8汤圆

发表于 2012-3-27 13:50:04 | 显示全部楼层
玩到ARM了 要补补c才可以啊!!
嵌入式系统更是要补很多知识才玩的动的

出0入0汤圆

发表于 2012-3-27 14:07:21 | 显示全部楼层
avr进行中,,,,即将4月进入arm9。。。的路过。。。。。

出0入0汤圆

 楼主| 发表于 2012-3-27 14:16:14 | 显示全部楼层
本帖最后由 raxfeer 于 2012-3-27 14:22 编辑
Etual 发表于 2012-3-27 13:44
楼主,不要急,任何东西都是有一个学习的过程的。
从本质上看,STM32只是功能强一点的单片机,所以跟51没啥 ...


stm32f10x.h 这个里面貌似就是STM32的地址映射了里面的映射地址好几千行(我用Keil打开下是8K多行,实际的地址映射语句可能没这么多,但至少上千),我很难想像你们是如何记住这些地址并使用的。
我想,如果要写一个程序的话,估计只调用这个库就行了,其它的库都是在这个地址映射的基础上进一步封装。
我不是不懂C语言,更不会看不懂,说从51走过来,如果没把51学会(这里不能说完全学会,估计也没人敢说完全会),就不敢说从51走过来的。
我希望得到几个回答,其实从1L就问了,只是大家都被我问得晕头转向了,下面整理下问题:
1.ARM是否也有跟51类似的SFR(特殊功能寄存器)?
2.这些特殊功能寄存器的地址是否也是跟51一样映射到某些直观的字符,比如说51里面的P0是映射到0x80地址代表P0口:sfr P0=0x80;
3.如果叫你不调用任何函数或库,写出点亮一个LED,最简单的程序(STM32),怎么写?举个例子,如果这题对应是51的话,程序如下:
sfr P1=0x90;     //0x90地址对应P1口,选P1口是因为它有内部上拉,避免网友思路走偏的问题。关键:没有#include<reg52.h>。
main()
{
  while(1)
   {
     P1=0xFE;    //0xfe==1111 1110,所以相信大家已经能想像电路的样子了:P1.1接LED+电阻+VCC+5V
   }
}
好了,现在请神人们写个最简单的点亮LED程序(STM32),不要调用库的。

出0入8汤圆

发表于 2012-3-27 14:40:43 | 显示全部楼层
思维要转变,操作寄存器的习惯要改掉,因为ARM的寄存器是51的几倍,很多情况下,你不需要知道底层是怎么设置的,特别是对于初学者。

理解ST的库,要一定的C语言基础。比如模块化设计、宏定义、结构体、指针,好好补上一课吧。

仔细的阅读文档,还有例程。买个开发板多做实验,很快就会上手的。

出0入0汤圆

 楼主| 发表于 2012-3-27 15:09:41 | 显示全部楼层
jingwaner 发表于 2012-3-27 14:40
思维要转变,操作寄存器的习惯要改掉,因为ARM的寄存器是51的几倍,很多情况下,你不需要知道底层是怎么设 ...

可以告诉我ARM的寄存器有多少吗?数量,不太清楚的话,报个大概数字也行

出0入0汤圆

发表于 2012-3-27 15:29:25 | 显示全部楼层
资源又多,又有固件库,用着要舒服多了

出0入0汤圆

发表于 2012-3-28 02:12:52 | 显示全部楼层
本来只是路过,写详细一点。

我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式工程师》这篇文章,想清楚了,
再动手吧。

我做了个实例,不用ST的库来点LED,解答你的问题

我的 KeilMDK 3.5
我的STM32板子奋斗版是 ,IC 是 STM32F103VET6
调试工具 JLINK V8
LED 接在 PB5 ,高电平点亮

既然楼主说一定懂C语言了,那么对于下面我的问题,不查百度,完全靠自己,懂多少?然后查了百度之后又能懂多少?

(一)新建 keil 工程,IC选择 ST 公司的 STM32F103VE,keil提示是否copy 启动文件,选择是。

这里有问题问楼主,
你有没有读过这个启动头文件? 51 也是同样的启动文件,51的那个启动文件有没有读过?你知道
头文件里面做了什么吗? C语言真的从 main 函数开始吗?运行时库是什么?这些资料从
什么地方知道?keil编译器的行为?
(如果你说头文件是汇编的,没有必要看,那我当我没说)

例如启动文件里面有这么一句,我的问题是 __main 这个标号在哪里实现的,注意,这里肯定不是 main 函数
这里跳到哪里去了?还有个问题 [WEAK] 这里是什么意思?有什么用????

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                LDR     R0, =__main
                BX      R0


(二)新建一个 main.c 并且写一个 main函数,什么都不做,这和51一样了。

void main(void)
{
        while (1)
        {

        }
}

然后因为我需要调试,则设置jlink调试器,在项目属性里面 Debug 标签,Use J-LINK/J-TRACE ,然后到
utilities 标签,同样选择J-LINK /J-TRACK ,并且选择 Setting 按钮,里面的 Programming Algorithm
还是空的,表示keil 不知道目标是什么,我添加一个 STM32F10X High-density Flash ,问题,为什么是
High-desity ?依据是什么???
全部确认返回。

这个时候已经可以编译,开发板上电,已经可以下载仿真的,虽然程序什么都没有写

(三)既然硬件,仿真器,调试都准备好了,接着就开始写程序了。
我一直推荐新手花钱买学习板和仿真器,因为可以排除硬件的问题,让初学者集中精力去写程序,而不用怀疑
硬件有问题,这点很重要。

这阶段主要是看书,了解这个IC 的架构,了解指令集,了解寄存器(别跟我说你找不到这些资料? .....)
Cortex-M3权威指南CnR2(电子书).pdf
STM3210x参考手册.pdf
学习板原理图
博客,论坛等多个帖子,务必要对整个IC有个初步的了解。这个过程有点痛苦,但是值得花这个时间。

(四)开始写 LED
既然我们要操作 IO 口,当然就要看IO口相关的知识。打开 STM3210x参考手册.pdf ,我的目的只是操作 GPIO
所以我只需要将第五章看完就OK了。章节比较多,懒得看,根据一般的经验(楼主,你缺经验了吧?),不说多
就AVR 和 PIC 而已。操作IO一般是两个步骤,第一,操作IO控制寄存器,设置IO为输出,第二就是送数据。

那么很明显,只可能是 GPIOx_CRL  GPIOx_CRH , GPIOx_ODR 三个寄存器会有想要
仔细阅读这几个寄存器的介绍后知道,GPIOx_CRL 是控制 PIN 0-7 的属性的,GPIOx_CRH 控制PIN 8-15,ODR寄存器
当然就是输出数据了,将数据送到这里就行了。

然后,这几个寄存器的地址是多少?首先看 stm32f103ve.pdf 这个是官方的datasheet、,看第四章, Mmeory Mapping
为什么看这章?会英文都能猜到吧?,看 PORTB 的地址是 0x40010C00 - 0x40010FFF ,这个就是基地址了。基地址
加上偏移量就能找到具体的寄存器。

例如我需要操作 GPIOB_CRL 的偏移为 00H ,(看STM3210x参考手册.pdf) ODR 寄存器的偏移为 0CH
那么很自然得出
GPIOB_CRL = 0x40010C00
GPIOB_ODR = 0x40010C0C

怎么验证我的结论正确?先看 keil 给的头文件 \Keil\ARM\INC\ST\STM32F10x\stm32f10x_map.h
#define PERIPH_BASE           ((u32)0x40000000)
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)

这样怎么算都能算出 0x40010C00 出来吧??ODR 寄存器同理

为了点亮 LED ,我需要将 PB5 (也就是 GPIOB5)设置为输出,并且ODR相应的位写入 1 ,看资料得出 MODE5 是
bit 20 21 控制的,CNF5 是bit 22,23
MODE5应该设置 10(0x2) 选择 2MHZ 输出,CNF5 选择00(0x0),通用推挽模式,于是将这个值写入

(*volatile unsigned long)0x40010C00 = (2<<20) | (0<<22);  // 为简单起见,不管其他位了

楼主你是否能看懂这句C语言??volatile 什么意思什么用?指针的本质是什么?为什么能这样用?2<<20 是什么
意思,为什么能这样用?楼主我真的不是为难你,嵌入式都这么写的,ST的头文件也是这么定义

同理,设置 ODR 寄存器
*(volatile unsigned long *)0x40010C0C = 1<<5;
*(volatile unsigned long *)0x40010C0C = 0;

STM32 没有SFR ,没有bit,没有sbit 的概念的了。是不是就不如 51 了?


下载运行,还不行,因为GPIOB 的CLK 没有使能,这时其实 GPIOB 是不能工作的,这是 STM32 特殊的地方,上电
默认外设的时钟都是关的,初学者没有注意这里,是可以原谅的,多看看书,多实践,多问问就是了。

找到问题的原因,则再 RCC_APB2ENR 设置,其中 BIT 3 就是 IOPBEN 是时钟使能位,同上,先找到 RCC_APB2ENR
的地址
#define PERIPH_BASE           ((u32)0x40000000)
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)
#define RCC_BASE              (AHBPERIPH_BASE + 0x1000)
RCC_APB2ENR 的偏移是 18H ,所以最终得到地址为 0x40021018,操作方法同上

*(volatile unsigned long *)0x40021018 |= 1<<3;


最终的点LED的程序就完成了。
void main(void)
{
        *(volatile unsigned long *)0x40021018 |= 1<<3;
        *(volatile unsigned long *)0x40010C00 = (2<<20) | (0<<22);
        *(volatile unsigned long *)0x40010C0C = 1<<5;
        while (1)
        {

        }
}
如果将寄存器做一个定义,则程序变成如下

#define RCC_APB2ENR *(volatile unsigned long *)0x40021018
#define GPIOB_CRL  *(volatile unsigned long *)0x40010C00
#define GPIOB_ODR *(volatile unsigned long *)0x40010C0C

void main(void)
{
        RCC_APB2ENR |= 1<<3;
        GPIOB_CRL = (2<<20) | (0<<22);
        GPIOB_ODR = 1<<5;
        while (1)
        {

        }
}

RCC_APB2ENR  RCC 是时钟寄存器 , APB2 是外设2 ,ENR ,可以理解为 enable
GPIOB_CRL  GPIO B control 控制寄存器
GPIOB_ODR  GPIO(general purpose input output) B output data register 输出数据寄存器

都是有意义的名字,哪里难记了??而且名字都来自 ST 的官方 datasheet、这个程序跟你用 51 写的程序我还真的
没看出差别有很大 .....

加入刚才的 GPIOB 寄存器,看看 ST 的官方库是怎么定义的,
\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h
用 UltraEdit 打开,搜索 GPIOB

#define PERIPH_BASE           ((uint32_t)0x40000000)
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)

没错,和keil 里面是一模一样的。


typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

其中 __IO  的定义在 \Libraries\CMSIS\CM3\CoreSupport\core_cm3.h 为什么我知道在这个文件里面,因为我会
用 source insight ...

#define     __IO    volatile

__IO uint32_t CRL 其实就是 volatile uint32_t CRL

为什么用结构体?因为结构体的成员的地址分配(RAM中)是连续(不知道楼主是否懂得,这还是C语言的问题),
而 STM32 的一个模块的功能寄存器都是连续的,每个寄存器都是相当于 基地址加偏移,跟上面的理论一致

于是就有了结构体指针的用法
跟踪库函数的源代码,例如 GPIO 的 初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

以结构体指针的形式传递 IO 口 GPIO_TypeDef* GPIOx

访问 CRL 寄存器则用成员的形式 GPIOx->CRL;

不需要担心这样做的效率,因为都是地址,也就是指针,最终的效率是直接寄存器操作,效率是非常高的。

看不懂库函数,归根究底就是C语言功底不行。不要以为写过几行51就懂C语言了,远的很呢。

还有,STM 的库下载的时候包含了很多很多例子,库函数怎么使用在例子里面有很详细的介绍,不用写几行代码,
都是复制例子做实验,也很很容易的。

总结楼主的几个问题
1,ARM 没有SFR,也不需要,SFR 是51的关键字,没有理由 51 有 ARM 就要有。例如ACC,ARM 就没有,但是有
R0-R15 ,这些就是架构(architecture 的区别了)
2,STM32 的寄存器在官方头文件上面已经全部有定义了,上面已经阐述了。(你看不懂不代表没有吧?)
3,不带库函数的LED程序已经实现了。

想进步唯一的办法是多看书,多看代码,多写,多思考,少说话,楼主太浮躁了,反省一下吧。

Etual
2012-3-28

出0入0汤圆

发表于 2012-3-28 07:51:06 来自手机 | 显示全部楼层
楼上华丽丽的解释啊,楼主的确应该先理解嵌入式设计的整体思路,而不是只停留在某款芯片的技术细节上。学好c语言很重要啊……

出0入0汤圆

发表于 2012-3-28 08:19:15 | 显示全部楼层
看来我也太浮躁了 。。。多谢各位

出0入0汤圆

发表于 2012-3-28 08:40:24 来自手机 | 显示全部楼层
一样在学STM32也感觉一个月下来没什么进展,看了各位的解答看来自己还是多了点浮躁

出0入0汤圆

发表于 2012-3-28 08:45:44 | 显示全部楼层
Etual写的不错

出0入0汤圆

发表于 2012-3-28 09:07:20 | 显示全部楼层
感动啊!! 多谢23楼

出0入0汤圆

发表于 2012-3-28 09:16:47 | 显示全部楼层
仔细看完了Etual的帖子,确实很收益

出0入0汤圆

发表于 2012-3-28 09:43:06 | 显示全部楼层
Etual  

出0入0汤圆

发表于 2012-3-28 10:23:58 | 显示全部楼层
23楼大哥辛苦了

出0入0汤圆

发表于 2012-3-28 10:27:36 | 显示全部楼层
静下心来,去搞懂库!

出0入0汤圆

发表于 2012-3-28 11:01:34 | 显示全部楼层
STM32 Reference Manual (RM0008)

有中文版本!,13.6MB

出0入0汤圆

 楼主| 发表于 2012-3-28 11:14:37 | 显示全部楼层
Etual 发表于 2012-3-28 02:12
本来只是路过,写详细一点。

我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式 ...

已举报精华了,非常感谢Etual!
1.我看楼主浮躁得不得了。
没有没有,只是问下疑惑。比我浮躁的人多得去了,我手上有板子,几个月了,LED都没点亮,照样天天悠闲地看资料、教程。
2.完全靠自己,懂多少?然后查了百度之后又能懂多少?
不可否认,完全靠自己,大多数都不明白。

你对底层了解得这么多,请问你当初学这个时是先开始用官方的固件库还是一开始就研究底层?
一开始学是直接用固件库作开发就行还是得先研究库先?

出0入0汤圆

发表于 2012-3-28 11:32:48 | 显示全部楼层
Etual 发表于 2012-3-28 02:12
本来只是路过,写详细一点。

我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式 ...

这个写的好,支持
头像被屏蔽

出0入0汤圆

发表于 2012-3-28 14:50:14 | 显示全部楼层
COOL !

出0入0汤圆

发表于 2012-3-28 18:14:33 | 显示全部楼层
必须顶23楼

出0入0汤圆

发表于 2012-3-28 18:25:39 | 显示全部楼层
cool      

出0入0汤圆

发表于 2012-3-28 18:34:20 | 显示全部楼层
Etual 发表于 2012-3-28 02:12
本来只是路过,写详细一点。

我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式 ...

23L写得太好了,仔细研读下!!

出0入0汤圆

发表于 2012-3-28 18:45:32 | 显示全部楼层
mark 一下

出0入0汤圆

发表于 2012-3-28 18:46:44 | 显示全部楼层
还是先学会用库,有了基础后,再学习自己写库函数。

出0入0汤圆

发表于 2012-3-28 18:47:59 | 显示全部楼层
多学了嘿嘿

出0入0汤圆

发表于 2012-3-28 18:53:26 | 显示全部楼层
必须顶23楼

出0入0汤圆

发表于 2012-3-28 18:58:12 | 显示全部楼层
先打个预防针,,,,再次mark,,,没事的时候看看,,,去去自己的浮躁

出0入0汤圆

发表于 2012-3-28 18:58:51 | 显示全部楼层
也准备进攻一个arm项目,23楼的可是指了明灯了!

出0入0汤圆

发表于 2012-3-28 19:04:11 | 显示全部楼层
用寄存器操作当然可以 只不过STM32寄存器不像51那么简单 用起来比较复杂 固件库在某种程度上解决了该问题

出0入0汤圆

发表于 2012-3-28 19:14:55 | 显示全部楼层
看来我得打扫一下开发板上的灰了,好好学习

出0入0汤圆

发表于 2012-3-28 19:16:42 | 显示全部楼层
本帖最后由 chenguanghua 于 2012-3-28 19:17 编辑

Etual 写的很好
建议楼主多看些资料,多动动手
实践一个月比你看书看资料3个月都要学到的多得多
明白吗

打错字了

出0入0汤圆

发表于 2012-3-28 19:33:35 | 显示全部楼层
呵呵,23,写得真好。不能浮躁啊!

出0入0汤圆

发表于 2012-3-28 19:35:08 | 显示全部楼层

可以去看看野火M3的教程 主要是教你怎么操作固件库的

冰凌科技的教程也不错

另外你要看操作寄存器的话  正点原子的《不完全手册V2.1》 写的就很好

出0入0汤圆

发表于 2012-3-28 19:38:30 | 显示全部楼层
膜拜23楼

出0入0汤圆

发表于 2012-3-28 20:03:34 | 显示全部楼层
学习了,快30了还在学51的飘过!

出0入0汤圆

发表于 2012-3-28 20:15:11 | 显示全部楼层
23楼确实值得一看。

出0入0汤圆

发表于 2012-3-28 20:15:15 | 显示全部楼层
有价值的帖子,同楼主一样正在摸索STM32,感觉有一点迷茫

出0入0汤圆

发表于 2012-3-28 20:39:24 | 显示全部楼层
好贴就要顶一顶

出0入0汤圆

发表于 2012-3-28 20:45:24 | 显示全部楼层
仔细拜读23楼...........

出0入0汤圆

发表于 2012-3-28 20:50:15 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2012-3-28 20:59:48 | 显示全部楼层
我也是初学者,水平不行,我写过好多代码,但是都是把例程随便拿过来,只是在主函数里加自己的东西,其他的都不管,感觉这样不好……可是这样学得快啊

出0入12汤圆

发表于 2012-3-28 21:01:22 | 显示全部楼层
楼主,要淡定

出0入0汤圆

发表于 2012-3-28 21:02:27 | 显示全部楼层
23楼威猛。用过STM32的我也没有这样研究过底层,一直调用库函数来着。

出0入0汤圆

发表于 2012-3-28 21:04:15 | 显示全部楼层
看了23楼,有一种将要脱胎换骨的感觉。

出0入0汤圆

发表于 2012-3-28 21:10:19 | 显示全部楼层
特地来看23楼的,23楼是教授级的人物

出0入0汤圆

发表于 2012-3-28 21:14:30 | 显示全部楼层
june2008 发表于 2012-3-27 13:13
st的技术员写了这么多的函数库给你,如果你是单纯的做产品,还去看什么鸟结构体干嘛啊,直接调用库里边的函 ...

很好的指点

出0入0汤圆

发表于 2012-3-28 21:21:31 | 显示全部楼层
23楼受教了,最近失业中感觉自己也有点浮躁了!

出0入0汤圆

发表于 2012-3-28 21:32:57 | 显示全部楼层
关于STM32到底是用库还是不用库好,这个问题的争论贴,本论坛里有很多个

我起初是用库,不过,现在一回想,个人觉得

搞STM32,还是放弃库,直接自己操作寄存器

库里面的函数,做为参考就行
看看库函数在实现某功能时,到底操作了哪个寄存器

--------------------------------------------------------------------------
例如启动函数,库里面那个函数可谓是洋洋洒洒

看得人头晕

如果直接弄成下面这样,则方便很多,当然,牺牲了可读性

//[启动时用到的RCC参数 宏定义]
#define RCC_CFGR    (*(volatile unsigned int *)(0x40021000+0x04))
#define RCC_CR      (*(volatile unsigned int *)(0x40021000))


//只打开HSE外部8M晶振,关闭内部HSI和PLL倍频器
#define RCC_CR_VAL       0x00010082        //[10000000010000010]
//不使用PLL,只用HSE的8MHz晶振
#define RCC_CFGR_VAL     0x00032481 //[110010010010000001]

#define RCC_CR_HSERDY       ((unsigned int)0x00020000)   //!< External High Speed clock ready flag //
#define RCC_CR_PLLRDY       ((unsigned int)0x02000000)   //!< PLL clock ready flag //
#define RCC_CFGR_SWS        ((unsigned int)0x0000000C)   //!< SWS[1:0] bits (System Clock Switch Status) //



void RCC_Configuration(void)
{

//[启动芯片代码(HSE-8M)]//8M晶振                  
  RCC_CFGR=RCC_CFGR_VAL;// set clock configuration register                                 
  RCC_CR=RCC_CR_VAL;// set clock control register

//只启动HSE外部8M晶振,不启动PLL,故仅需等待HSE晶振稳定即可
  while((RCC_CR & RCC_CR_HSERDY)==0)          // Wait for HSERDY = 1 (HSE is ready)
        { ; }
}

出0入0汤圆

发表于 2012-3-28 21:34:44 | 显示全部楼层
hao `~

出0入0汤圆

发表于 2012-3-28 21:40:22 | 显示全部楼层
顶23楼......

出0入0汤圆

发表于 2012-3-28 21:42:07 | 显示全部楼层
精华要顶上。               

出110入0汤圆

发表于 2012-3-28 21:44:03 | 显示全部楼层
raxfeer 发表于 2012-3-27 12:21
我没有这个文档:reference manual
能否提供下?
说实话,像我这样的新手连要看什么文档都不知道,希望大 ...

lz看资料的方式都有点问题,一般一个单片机之类的芯片都有一个数据手册,介绍这个芯片有什么功能,各个功能的参数诸如此类的;
还有一个参考手册,或者有些叫用户手册的,就是介绍这个东西如何使用,可以精确到一个寄存器,或者输入输出点什么的;
再有与生产有关的封装信息,各种认证等等

出0入0汤圆

发表于 2012-3-28 21:47:03 | 显示全部楼层
呵呵 来看精华 刚从51过度到arm7

出0入0汤圆

发表于 2012-3-28 21:48:46 | 显示全部楼层
23楼,支持一个

出100入143汤圆

发表于 2012-3-28 21:56:17 | 显示全部楼层
阐述了做嵌入式的心态啊

出0入0汤圆

发表于 2012-3-28 22:33:13 | 显示全部楼层
精彩,我也刚学stm32没几个月,现在回想起来,刚开始那叫个迷茫啊·······

不过现在好点了。多看,多思考

出0入0汤圆

 楼主| 发表于 2012-3-28 22:41:54 | 显示全部楼层
diskcopy 发表于 2012-3-28 21:32
关于STM32到底是用库还是不用库好,这个问题的争论贴,本论坛里有很多个

我起初是用库,不过,现在一回想,个人 ...

自己写库的话,那么多也够烦;
调用库的话,那些库正如你所说的,别人的编程方式,虽然可能是比较标准的,但多少会不习惯。
所以纠结啊。
但本贴很多人都在强调一个问题,就是:拒绝浮躁。
的确,我学51时就有觉悟,没学之前,压根不敢想自己能够独立写代码,甚至不看数据手册或其它任何资料。
23L精华,但我还是不太清楚他想要表达的,是支持学习库用库呢,还是支持自己写函数呢,抑或是糊里糊涂地用库呢(最后这个估计不是他的意思,但不可否认的是,很多人糊里糊涂地用着库也能开发东西,而且站在巨人的肩膀上,也不会比了解的人弱很多,毕竟现在芯片性能都还可以,强调性能的开发也比较少)。

出0入0汤圆

发表于 2012-3-28 22:48:11 | 显示全部楼层
多学习啊,看来

出0入0汤圆

发表于 2012-3-28 22:54:46 | 显示全部楼层
嗯嗯 自己是的向前走了

出0入0汤圆

发表于 2012-3-28 23:31:44 | 显示全部楼层
思路和方向才是最重要的,没有好的方向我是不敢下手去做。
关注STM32有好长时间了,到现在才买的开发板,不是别的原因,感觉自己一直没搞清楚一些问题,不想看着PDF一步步的跟着手册机械地走,思路不清晰学了也是懵懂。搞清楚一些必要的东西还是很有用的。
从这个帖子里看到了好多,把握好心态,理清思路,找好方向,一切都会很简单,呵呵……

出0入0汤圆

发表于 2012-3-28 23:36:03 | 显示全部楼层
拜读了23L Etual的杰作,受益匪浅!

出0入0汤圆

发表于 2012-3-28 23:38:44 | 显示全部楼层
好文                    .

出0入0汤圆

发表于 2012-3-28 23:40:04 | 显示全部楼层
真的不错,感觉自己太浮躁了

出0入0汤圆

发表于 2012-3-29 00:19:16 | 显示全部楼层
23L经典,慢慢回味中

出0入0汤圆

发表于 2012-3-29 00:57:14 | 显示全部楼层
raxfeer 发表于 2012-3-28 11:14
已举报精华了,非常感谢Etual!
1.我看楼主浮躁得不得了。
没有没有,只是问下疑惑。比我浮躁的人多得去 ...

楼主用词不当,精华贴应该用推荐,而不是举报。垃圾贴才需举报。

出0入0汤圆

发表于 2012-3-29 00:58:52 | 显示全部楼层
raxfeer 发表于 2012-3-28 11:14
已举报精华了,非常感谢Etual!
1.我看楼主浮躁得不得了。
没有没有,只是问下疑惑。比我浮躁的人多得去 ...

额,昨天情绪有点问题,帖子里如果语气重了的,也敬请见谅
帖子本身是意义不是很大,只是你反问了我能不能用裸机实现LED,于是我给出了一个实例而已
我只是想初学者不要太过浮躁而已,有则改之,无则加冕~
我建议先学用库,然后读懂库代码怎么实现的,最后尝试不用库自己裸机写程序。
但是做项目的话还是用库比较好,快速敏捷稳定。
另外,说了那么多还是想说明我之前说过的,STM32 和 51没啥本质上的区别,只是一个加强型的单片机。
学习应该抓住本质,学的是单片机,而不是51或者ARM

出0入0汤圆

发表于 2012-3-29 01:00:14 | 显示全部楼层
各位太抬举,还混了个精华呢

出0入0汤圆

发表于 2012-3-29 01:06:54 | 显示全部楼层
raxfeer 发表于 2012-3-28 22:41
自己写库的话,那么多也够烦;
调用库的话,那些库正如你所说的,别人的编程方式,虽然可能是比较标准的 ...

23L精华,但我还是不太清楚他想要表达的,是支持学习库用库呢,还是支持自己写函数呢,抑或是糊里糊涂地用库呢?
------------------------------------------------------------------------------------------------------------------------------------------------------------

不用搞得非黑即白吧?

刚入手搞STM32,可先学习库,能干活了就有信心了。然后下功夫研究底层寄存器。这应是渐进的过程。

你非要一上来就自己写函数,会把自己搞得晕头转向,垂头丧气。没有好的意志,万一挺不过去就会因噎废食的。

出0入300汤圆

发表于 2012-3-29 01:38:54 | 显示全部楼层
买一个开发板开始,这点极其重要.并且要买一个文档十分详尽的开发板.把所有例程都玩过就可以开始入门了.
再次把我们这里的酷贴看一遍,针对开发板反复练习,就可以开始提高了.
什么时候可以发布了酷贴了,说明学有心得了.

实话说,干完stm32再回头看51,就感觉51的构架真简单,但编制程序的方法基本一样。所以并不妨碍简单的东西还是用51。
51也不错,我手里有一块3轴联动的数控板,竟然就是87C51外扩ram和eprom做的,真是不可思议。

出0入0汤圆

发表于 2012-3-29 02:09:57 | 显示全部楼层
真的不错,真强·

出0入4汤圆

发表于 2012-3-29 07:09:10 | 显示全部楼层
体会到了程序设计的精髓,任何语言玩起来都不在话下,同样体会到了MCU的精髓,任何MCU玩起来也都是一样的,不要被表面所困惑

出0入0汤圆

发表于 2012-3-29 07:23:42 | 显示全部楼层
23樓辛苦了。

出0入0汤圆

发表于 2012-3-29 07:28:15 | 显示全部楼层
我跟楼主有一样的困惑,看了23楼,受益匪浅!

出0入0汤圆

发表于 2012-3-29 08:11:18 | 显示全部楼层
写的太好了,向#23学习

出0入0汤圆

发表于 2012-3-29 08:18:10 | 显示全部楼层
raxfeer 发表于 2012-3-28 22:41
自己写库的话,那么多也够烦;
调用库的话,那些库正如你所说的,别人的编程方式,虽然可能是比较标准的 ...

几年前,本版有个骂STM32的手册是高中生写的烂手册的贴,挺多人抱怨STM32手册没有MICROSHIP和ATMEL公司的好,记得有人调侃说"之所以做MCU公司都喜欢把DATASHEET写得晦涩难懂 枯燥乏味,就是为了显示嵌入式这个工种有技术含量,因为电子工程师都喜欢啃晦涩的大部头资料"

这句戏言让人觉得好笑之余,也有几丝无奈,STM32提供了库,可以说方便了很多人,至少在点灯时,可以直观地看到具体的代码

不过,我觉得,STM32可以百尺杆头更进一步,就拿启动操作来讲,如果在提供SystemInit()函数的同时,直观地说明:STM32芯片在启动时,主要是只涉及到"RCC_CFGR和RCC_CR"这两个寄存器,将两个寄存器的XX位设置成0或1,可以实现XX功能...如果这样做了,就会更通俗易懂,否则,真正想弄懂STM32,则的确要求使用者"不能浮躁",否则,就不会有耐心一点一点地花时间去弄清楚STM32的具体启动过程

我一直觉得,STM32的手册即使看了又看,也很难让人抓住重点,且很容易让人觉得迷糊

如果大学里的课程能真正改良一下,会让学生少很多障碍,当然了,这是系统工程,有很多时候是积重难返

我现在超级不喜欢LQFP的0.5mm间距的芯片,感觉一旦打PCB的公司做出来的PCB质量不佳,就会很容易出现硬件问题,而且很多是怪病


比如下面这个贴的问题,就曾困扰我很长时间
http://www.ourdev.cn/forum.php?mod=viewthread&tid=5431755&highlight=STM32%E5%A4%8D%E4%BD%8D
STM32复位电路


希望包括本贴楼主在内的刚接触ARM的朋友们,一定不要算计几十元几百元的小钱,不要用串口往STM32里面烧程序,在淘宝上买山寨的ULINK2和JLINK V8,我建议各买一个,而且要买别人焊好的开发板,用串口烧程序所浪费的时间,非常不值得,接上ULINK2,就可以实现类似AVR的ISP那样的即烧即运行和仿真

出20入0汤圆

发表于 2012-3-29 08:31:54 | 显示全部楼层
这也是这样走过来的

出0入0汤圆

发表于 2012-3-29 08:40:08 | 显示全部楼层
Etual 发表于 2012-3-28 02:12
本来只是路过,写详细一点。

我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式 ...

写得很实用,很不错!

出0入0汤圆

发表于 2012-3-29 08:42:14 | 显示全部楼层
看完发现自己的却要看看那书,浮躁不行啊。

出0入0汤圆

发表于 2012-3-29 08:52:58 | 显示全部楼层
顶一下23楼

出0入0汤圆

发表于 2012-3-29 08:56:12 | 显示全部楼层
需要懂的东西还是很多啊

出0入0汤圆

发表于 2012-3-29 08:56:55 | 显示全部楼层
拜读23楼的精华贴,写得很好

出0入0汤圆

发表于 2012-3-29 08:59:32 | 显示全部楼层
正在奋斗中,mark!

出50入0汤圆

发表于 2012-3-29 09:08:53 | 显示全部楼层
本帖最后由 yuzr 于 2012-3-29 09:11 编辑

23楼分析的很透彻。STM32比51复杂,主要是功能强,寄存器多,可以一部分一部分的去学习,比如先学会IO控制、定时器操作、然后学习控制串口。这需要静下心来,一步一步来。遇到问题可以看数据手册,或者上网查资料。个人认为楼主可以先使用库,当熟悉了以后再去深入研究库的实现。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 09:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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