发新帖我要提问
12
返回列表
打印
[技术讨论]

ZENYIN同学,用汇编初步搞定了STM32F4

[复制链接]
楼主: zenyin
手机看帖
扫描二维码
随时随地手机跟帖
21
zenyin|  楼主 | 2016-10-24 10:01 | 只看该作者 回帖奖励 |倒序浏览
                            AREA     |RESET|, CODE, READONLY          ;程序开篇伪指令就这么一条,告诉编译程序,这是只读的程序代码
                             ;指令和伪指令不能顶格 顶格则表示标号 ,标号后面不能加冒号 空格就行了,不要受51单片机影响        
  
                                DCD     0x20000400        ;堆栈顶
                                DCD     START                     
                                DCD     NMI_Handler                ; NMI Handler
                                DCD     HardFault_Handler          ; Hard Fault Handler
                                DCD     MemManage_Handler          ; MPU Fault Handler
                                DCD     BusFault_Handler           ; Bus Fault Handler
                                DCD     UsageFault_Handler         ; Usage Fault Handler
                                DCD     0                          ; Reserved
                                DCD     0                          ; Reserved
                                DCD     0                          ; Reserved
                                DCD     0                          ; Reserved
                                DCD     SVC_Handler                ; SVCall Handler
                                DCD     DebugMon_Handler           ; Debug Monitor Handler
                                DCD     0                          ; Reserved
                                DCD     PendSV_Handler             ; PendSV Handler
                                DCD     SysTick_Handler            ; SysTick Handler                        
                                       
                         ENTRY    ;这个伪指令告诉编译器这是程序入口         
;****************************程序入口*************************************           
START                NOP      
                         NOP        
;*******************************************外设复位和初始化时钟**************************************                                
                                
                                MOV R3,#0X3800  
                                MOVT R3,#0X4002   ;RCC首地址                                         
                                LDR R4,[R3,#0X24]                    
                                ORR R4,#0X01       ;将PA的时钟打开
                                STR R4,[R3,#0X30]  ;写回去就打开了PA的时钟               
                                
;***************************************GPIO操作********************************************
                                MOV R3,#0X0000   
                                MOVT R3,#0X4002   ;GPIOA首地址                                       
                                MOV R4,#0XFFFF      ;(R4)=0XFFFF ,GPIO输出最好为高和51单片机一样
                                STR R4,[R3,#0X14]                                         
                                LDR R4,[R3]               ;把PA口的输出模式寄存器的值读回来,其中PA15PA14PA13是专用链接JTAG,不能修改
                                ORR R4,#0X00005000    ;将PA7和PA6修改成输出模式,默认为输入模式                        
                                STR R4,[R3]                  ;回写回去
                                LDR R4,[R3,#0X04]      
                                ORR R4,#0X000000C0     ;把PA7PA6写成开漏模式
                                STR R4,[R3,#0X04]       ;写回去                                
                                MOV R4,#0X0040                          
                                MOVT R4,#0X0080     ;采用位操作方式控制PA7和PA6 其中一个复位一个置位
                                STR R4,[R3,#0X18]   ;至此两只发光二极管开始一只亮一只灭
                                MOV R5,#0X00C000C0    ;R5对这两位进行异或运算,这里相当于取反
                                
YS                         MOV R2,#0X00200000   ;软件延时0X00200000个脉冲  软件延时
LJ                          SUBS R2,#0X01             ;减1不为零继续减---连续减     
                             BNE LJ                           ;此三条指令相当于51单片机 DJNZ
                             EOR R4,R5        ;将输出每次定时到取反               
                            STR R4,[R3,#0X18] ;将取反后的输出状态以位操作方式输出去
                            B YS                 ;重新赋值再次定时循环

;************************************以下是Cortex-M4F的内部中断服务程序**********************
NMI_Handler     NOP
                      NOP
                      NOP
                      NOP
                      BX LR        
                                
                                
HardFault_Handler          NOP
                                   NOP
                                   NOP
                                   LDR R3,[SP,#28]  
                                   ADD R3,#0X01000000
                                   STR R3,[SP,#28]
                                    NOP
                                    NOP
                                    NOP
                                   BX LR      
                                   
                                   
            
MemManage_Handler       NOP
                                   NOP
                                   NOP
                                   NOP
                                   BX LR

BusFault_Handler           NOP
                                   NOP
                                   NOP
                                   NOP
                                   BX LR
                                   
                                   
UsageFault_Handler        NOP
                                   NOP
                                   NOP
                                   NOP
                                   BX LR

SVC_Handler        NOP      ;软中断读取参数,主要是由用户特权模式改变为线程访问
                         NOP                 
                        PUSH {R0-R12,LR}    ;浏览一下堆栈是怎么压栈
                        NOP
                        MOV R14,#0XFE00FE00        
                        POP {R0-R12,LR}                     
                        NOP                           
                        NOP        
                        LDRB R3,[SP,#24]
                      TST LR,#0X00000004                    
                      BEQ DSVCS
                      MRS R3,PSP  
                      LDRB R3,[R3,#24]               
DSVCS                  NOP
                     NOP
                     LDRB R3,[R3,#-2]           
                    NOP
                   NOP     
                   BX LR  
DebugMon_Handler   NOP
                             NOP
                             NOP
                             NOP
                            BX LR
PendSV_Handler     NOP
                           NOP
                           NOP
                           NOP
                           BX LR
SysTick_Handler    NOP       ;滴答时钟中断
                          NOP  
                          NOP
                          NOP
                         MOV R3,#0XE000E000
                         LDR R3,[R3,#0X10]  
                         BX LR  
;***********************************************下面是程序结尾***************************         
                         NOP   ;这个NOP非常重要,当指令不能四字节对齐,而是半字对齐时就加一个NOP 否则就删除NOP,汇编将无告警
                         END    ;END伪指令告诉编译器程序结束


;上面的程序时一个非常简单的电子秒表,PA7和PA6在一秒内交替闪烁,月球上一小步,地球上一大步,当然ZENYIN同志学习51单片机,我只编写的两条程序:ORG 0000
                              MOV 90H,#55H  ;90H 为P1 口 机器码 759055
                              INC 87H            ;87H PCON    机器码 0587
                              ;这个程序就是P1口配成01010101的交替,然后单片机死机
                               ;在80年末,开放器特别是仿真器非常贵,对一个月收入12块战士,到死都凑不够1280块,那时1280块相当于今天相当今天25万块,ZENYIN用手工汇编,用手工把程序写到E2ROM中-----我买不起紫外光擦除器,可我首开用E2PROM,大家那时7HLS373作锁存器,ZENYIN 用74HC374其实ZENYIN以出手,已经是顶级51单片机高手,74HC374口线是按循序排列的,而且速度比74LS373更快,功耗更低。程序写进去后,我用老式指针模拟万用表测了P口,但测到第一个0,我已经感觉我成功了,再继续,完全正确,ZENYIN当时就说了一句,只要51受ZENYIN ,ZENYIN可以横扫全国了!!谁的51单片机不错,给ZENYIN较量一下,ZENYIN在这里向全国同胞发出挑战,比尔盖兹自称在BASIC语言上他可以挑战全世界,ZENYIN很谦逊,俺们低调点,在51单片机汇编语言上ZENYIN挑战一下全中国,外语不行,外语行的,我就谦虚一点,也挑战全地球!!孩子们见过这么虚怀坦荡豪放的老爷子吗?
                       

使用特权

评论回复
22
zenyin|  楼主 | 2016-10-24 10:08 | 只看该作者
20年过去弹指一挥间,当然21IC的@小奇叔叔还好嘛?@双龙老耿叔安好,周那工还在为民族的电子工业立大功,老古不要作古就!!看那老古得古子,下面是坟墓上面是十字架,20年后,国家经济发展,物质极大丰富,现在是新三高,不是昔日的水平高手段高所以打工收入高,俱往矣!!多情笑我等一帮老东西,白了少年头,还老夫聊发少年狂!!

使用特权

评论回复
23
zenyin|  楼主 | 2016-10-24 10:19 | 只看该作者
  AREA     |RESET|, CODE, READONLY          ;程序开篇伪指令就这么一条,告诉编译程序,这是只读的程序代码
                             ;指令和伪指令不能顶格 顶格则表示标号 ,标号后面不能加冒号 空格就行了,不要受51单片机影响        
  
                                DCD     0x20000400        ;堆栈顶
                                DCD     START                     
                                DCD     NMI_Handler                ; NMI Handler
                                DCD     HardFault_Handler          ; Hard Fault Handler
                                DCD     MemManage_Handler          ; MPU Fault Handler
                                DCD     BusFault_Handler           ; Bus Fault Handler
                                DCD     UsageFault_Handler         ; Usage Fault Handler
                                DCD     0                          ; Reserved
                                DCD     0                          ; Reserved
                                DCD     0                          ; Reserved
                                DCD     0                          ; Reserved
                                DCD     SVC_Handler                ; SVCall Handler
                                DCD     DebugMon_Handler           ; Debug Monitor Handler
                                DCD     0                          ; Reserved
                                DCD     PendSV_Handler             ; PendSV Handler
                                DCD     SysTick_Handler            ; SysTick Handler                        
                                       
                         ENTRY    ;这个伪指令告诉编译器这是程序入口         
;****************************程序入口*************************************           
START                NOP      
                         ;下面就是大家跑马射箭,扬名立万的时空,径情直遂地谱写我们的心曲吧        
                         ;音乐起,千年走一回,可靠悬第一,效率嵌伯仲
                          ;音乐起 ,亲爱的,你慢慢飞,ZINYIN带你去看小溪水。。。。一但技术并艺术一色,落霞与孤鹜就齐飞了
                           ;音乐起:老子老子。。。。。好想再活500年!!!!

;************************************以下是Cortex-M4F的内部中断服务程序**********************
NMI_Handler     NOP
                      NOP
                      NOP
                      NOP
                      BX LR        
                                
                                
HardFault_Handler          NOP
                                   NOP
                                   NOP
                                   LDR R3,[SP,#28]  
                                   ADD R3,#0X01000000
                                   STR R3,[SP,#28]
                                    NOP
                                    NOP
                                    NOP
                                   BX LR      
                                   
                                   
            
MemManage_Handler       NOP
                                   NOP
                                   NOP
                                   NOP
                                   BX LR

BusFault_Handler           NOP
                                   NOP
                                   NOP
                                   NOP
                                   BX LR
                                   
                                   
UsageFault_Handler        NOP
                                   NOP
                                   NOP
                                   NOP
                                   BX LR

SVC_Handler        NOP      ;软中断读取参数,主要是由用户特权模式改变为线程访问
                         NOP                 
                        PUSH {R0-R12,LR}    ;浏览一下堆栈是怎么压栈
                        NOP
                        MOV R14,#0XFE00FE00        
                        POP {R0-R12,LR}                     
                        NOP                           
                        NOP        
                        LDRB R3,[SP,#24]
                      TST LR,#0X00000004                    
                      BEQ DSVCS
                      MRS R3,PSP  
                      LDRB R3,[R3,#24]               
DSVCS                  NOP
                     NOP
                     LDRB R3,[R3,#-2]           
                    NOP
                   NOP     
                   BX LR  
DebugMon_Handler   NOP
                             NOP
                             NOP
                             NOP
                            BX LR
PendSV_Handler     NOP
                           NOP
                           NOP
                           NOP
                           BX LR
SysTick_Handler    NOP       ;滴答时钟中断
                          NOP  
                          NOP
                          NOP
                         MOV R3,#0XE000E000
                         LDR R3,[R3,#0X10]  
                         BX LR  
;***********************************************下面是程序结尾***************************         
                         NOP   ;这个NOP非常重要,当指令不能四字节对齐,而是半字对齐时就加一个NOP 否则就删除NOP,汇编将无告警
                                   ;变态的人永远变态,要完美到一个善意提醒都觉得烦!
                         END    ;END伪指令告诉编译器程序结束
                        

使用特权

评论回复
24
zenyin|  楼主 | 2016-10-24 10:29 | 只看该作者
那个南通江苏佬,STC的女兆,姚老板,这厮是个偏狭的爱国者,典型的偏执狂,STC这单片机非常好,51单片机最大三个缺点,抗干扰能力弱,速度慢,功耗高,这三致命,在女兆们的打拼下,都死啦死啦了,ZENYIN在发挥一下,什么5000V抗静电,算什么毛啊,简单处理一下10万V轻松,到底是50万伏还是100万伏呢,ZENYIN不知道啊,因为我们的试验设备,已经到包线上了!!感谢宏精!唯有偏执狂才能生存!!
不过这厮压力大,心总是不平,总是风扯扯的,脾气还多大的!!

使用特权

评论回复
25
zenyin|  楼主 | 2016-10-24 10:38 | 只看该作者
玄德 发表于 2016-10-22 19:10
汇编也写过十多万行。

刘黄叔,以前和ZENYIN,有个交集,兄弟你过得好吗?至少10年了哦!

使用特权

评论回复
评论
玄德 2016-10-24 15:29 回复TA
啊?! 
26
zenyin|  楼主 | 2016-10-24 10:44 | 只看该作者
huarana 发表于 2016-10-22 21:57
然而 STM32F4  是 CM4内核

指令系统学习用CM3,芯片用CM4 没办法,音乐撇。就英语学不好,其中ZENYIN文理工通吃的主呢呵呵!!

使用特权

评论回复
27
zenyin|  楼主 | 2016-10-24 10:48 | 只看该作者
icecut 发表于 2016-10-22 23:37
如果是我.肯定会改 c 语言,编译器没那么傻,一条指令20k....
肯定是错误的加入了初始化文件 ...

还是我们主流工程师干的事,我问他写了多少程序,他说有200多K,当场把我吓摊了,我一生写的程序都没20K,做一般项目,程序都不会超过1K,通常都在256~512个字节之间。不光是程序精炼,主要是我特别注重按51单片机特点,先构思软件,在去设计硬件,不是以硬件编软件,而是以软件去编制硬件。

使用特权

评论回复
28
zenyin|  楼主 | 2016-10-24 10:56 | 只看该作者
我为什么讨厌高级语言,第一好端端的内部最高效寄存器不让用,第二,开头一大堆定义,指令表达式还长,整了半天程序还没进入MAIN ,有这个时间去敲键盘,我程序都编完了,还有一个重要原因,我会追踪每一条指令的运行机制和相应的实现硬件,我觉得是老东西我自己在设计芯片和规划架构,我希望这条指令是按我的构想取值译码运算回写的。正因为这个原因,我也在优化自己的程序,当我的想法和设计者想法一致时,我们记牢了,达到长相知,勿相疑,信任就是一种力量,就是一种类似豢养般的依恋。这就叫天人合一。

使用特权

评论回复
29
springvirus| | 2016-10-24 10:58 | 只看该作者
汇编虽然精简,但是复杂的应用层,若用汇编,你懂的
编写和维护都是的巨大的工作量~~

使用特权

评论回复
30
zhuyemm| | 2016-10-24 16:30 | 只看该作者
好帖子顶一顶!感谢楼主

使用特权

评论回复
31
ayl439| | 2016-10-25 08:32 | 只看该作者
icecut 发表于 2016-10-23 09:24
那他在骗人?难道是加入了库文件,还关闭优化?

楼主是老家伙,估计和hotpower一个年代的人物,印象中起码十年前就在论坛活跃了,十年前就是高手

使用特权

评论回复
32
linqing171| | 2016-10-25 10:46 | 只看该作者
ayl439 发表于 2016-10-25 08:32
楼主是老家伙,估计和hotpower一个年代的人物,印象中起码十年前就在论坛活跃了,十年前就是高手 ...

好像是keil的所有库里面,启动相关的都没有这么大的。
不是论年龄来评价的。这几行汇编代码我也都看的懂。
只是为了汇编,把C的缺点给夸大了近百倍,看不下去了。
8051是有很多他的优点,汇编也有很多汇编的好处。但是如果C和汇编比,缺点比优点多,怎么会现在这么多人都在用?
不说别的,就汇编函数内的变量的地址分配,手工分都能把人累死,要根据调用关系去分析此空间在此函数运行的时候是否可以用(假设8051和PIC等指针较少的CPU)。读书的时候也在8051上做过8k的2+1的非标汇编浮点库,自认汇编不会差。我本科的毕业设计用当时刚出来的PIC16F873,全部用汇编做的,flash和ram都用了90%左右了。耗时两三个月。后来花了两天,用C重做了一遍,CCS info公司的c编译器,发现flash只和RAM都比我的要小不少。生成反编译逐句分析,发现各种内联、子代码段复用、jmp $+1代替两个nop  ... ...
编译器唯一不能优化的,是它的调用规则。而楼主写程序,变量少了可以逐个初始化而不需要初始化数组;函数调用传递参数的寄存器可以没有规矩。但是这个规矩是架构的基础,是扩展的基础。

使用特权

评论回复
33
ayl439| | 2016-10-25 11:30 | 只看该作者
linqing171 发表于 2016-10-25 10:46
好像是keil的所有库里面,启动相关的都没有这么大的。
不是论年龄来评价的。这几行汇编代码我也都看的懂 ...

没必要这么死板啦,楼主还是讲了一些精华的东西的,起码我就从未那么深究过,还有楼主专注钻研的态度值得当前很多人学习,当然这里面很多论述存在个人喜好和历史原因,楼主做技术的年龄也许比相当一部分人年纪都大,你认为是糟粕的,可以舍弃嘛,吸收精华即可

有人做一碗米饭做一辈子的,我相信99.9999%的人都不会愿意在做一碗米饭上下这么大精力,但你不能说那个做米饭的不是高手,只是非主流而已,楼主也只是把自己的想法或者一部分个人喜好表现出来而已,带有强烈的个人色彩,这是肯定的

使用特权

评论回复
34
kingTek| | 2016-10-25 11:59 | 只看该作者
汇编绝对是基础的基础,这个永恒政治正确,
但重汇编不等于唯汇编,
重C唯C都不对。
写过大的系统都知道什么感觉的,移植性,标准化,模块化,灵活变身的精妙之处,多历练你就知道了。

使用特权

评论回复
35
lxyppc| | 2016-10-25 14:44 | 只看该作者
linqing171 发表于 2016-10-25 10:46
好像是keil的所有库里面,启动相关的都没有这么大的。
不是论年龄来评价的。这几行汇编代码我也都看的懂 ...

这个是楼主的行文技巧,快速抓住读者注意力的方法
艺术源于生活又高于生活
把矛盾用夸张的方式表达出来,是艺术创作的技巧

不过技术类**不建议这样行文
实事求是,数据说话才是正道

使用特权

评论回复
36
redstone8415| | 2018-5-5 16:07 | 只看该作者
如何搞定这条警告:warning: L6314W: No section matches pattern *(InRoot$$Sections).

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则