OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2354|回复: 3

嵌入式用汇编语言实现STM32的LED和USART

[复制链接]

132

主题

340

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2017-10-30
在线时间
163 小时
发表于 2018-1-18 13:37:40 | 显示全部楼层 |阅读模式
[plain] view plain copy
;  
;  
;  
;  
                AREA RESET, DATA, READONLY  
                  
                DCD 0x20000000 + 1024 ;0  
                DCD UserMain ;1  
                DCD 0 ;NMI 2  
                DCD 0 ;HardFault 3  
                DCD 0 ;MemManage 4  
                DCD 0 ; 5  
                DCD 0 ; 6  
                DCD 0 ; 7  
                DCD 0 ; 8  
                DCD 0 ; 9  
                DCD 0 ; 10  
                DCD 0 ; 11  
                DCD 0 ; 12  
                DCD 0 ; 13  
                DCD 0 ; 14  
                DCD SysTick_Handler ; 15  
HelloString     DCB "Hello Word\n"  
HelloEnd  
HexTable        DCB "0123456789ABCDEF"  
HexTableEnd  
  
GPIOF_BASE      EQU     0x40021400  
GPIOF_MODER     EQU     GPIOF_BASE + 0x00  
GPIOF_OTYPER    EQU     GPIOF_BASE + 0x04  
GPIOF_OSPEEDR   EQU     GPIOF_BASE + 0x08  
GPIOF_PUPDR     EQU     GPIOF_BASE + 0x0C  
GPIOF_IDR       EQU     GPIOF_BASE + 0x10  
GPIOF_ODR       EQU     GPIOF_BASE + 0x14  
GPIOF_BSRR      EQU     GPIOF_BASE + 0x18  
GPIOF_AFRL      EQU     GPIOF_BASE + 0x20  
GPIOF_AFRH      EQU     GPIOF_BASE + 0x24  
      
GPIOA_BASE      EQU     0x40020000  
GPIOA_MODER     EQU     GPIOA_BASE + 0x00         
GPIOA_OTYPER    EQU     GPIOA_BASE + 0x04  
GPIOA_OSPEEDR   EQU     GPIOA_BASE + 0x08  
GPIOA_PUPDR     EQU     GPIOA_BASE + 0x0C  
GPIOA_IDR       EQU     GPIOA_BASE + 0x10  
GPIOA_ODR       EQU     GPIOA_BASE + 0x14  
GPIOA_BSRR      EQU     GPIOA_BASE + 0x18  
GPIOA_AFRL      EQU     GPIOA_BASE + 0x20  
GPIOA_AFRH      EQU     GPIOA_BASE + 0x24  
      
USART1_BASE     EQU     0x40011000  
USART1_SR       EQU     USART1_BASE + 0x00  
USART1_DR       EQU     USART1_BASE + 0x04  
USART1_BRR      EQU     USART1_BASE + 0x08  
USART1_CR1      EQU     USART1_BASE + 0x0C  
USART1_CR2      EQU     USART1_BASE + 0x10  
USART1_CR3      EQU     USART1_BASE + 0x14  
USART1_GTPR     EQU     USART1_BASE + 0x18  
  
  
  
RCC_BASE        EQU     0x40023800  
RCC_CR          EQU     RCC_BASE + 0x00  
RCC_PLLCFGR     EQU     RCC_BASE + 0x04  
RCC_CFGR        EQU     RCC_BASE + 0x08  
RCC_CIR         EQU     RCC_BASE + 0x0C  
RCC_AHB1RSTR    EQU     RCC_BASE + 0x10  
RCC_AHB2RSTR    EQU     RCC_BASE + 0x14  
RCC_AHB3RSTR    EQU     RCC_BASE + 0x18  
RCC_APB1RSTR    EQU     RCC_BASE + 0x20  
RCC_APB2RRST    EQU     RCC_BASE + 0x24  
RCC_AHB1ENR     EQU     RCC_BASE + 0x30  
RCC_AHB2ENR     EQU     RCC_BASE + 0x34  
RCC_AHB3ENR     EQU     RCC_BASE + 0x38  
RCC_APB1ENR     EQU     RCC_BASE + 0x40  
RCC_APB2ENR     EQU     RCC_BASE + 0x44  
      
SYSTICK_CTRL    EQU     0xE000E010  
SYSTICK_LOAD    EQU     0xE000E014  
SYSTICK_VAL     EQU     0xE000E018  
  
  
  
                THUMB  
                PRESERVE8  
                AREA _UserMain, CODE, READONLY  
                     
                ENTRY  
UserMain        PROC  
                EXPORT UserMain  
                     
                LDR R0, =LedConfig  
                BLX R0  
                  
                LDR R0, =SysTickConfig  
                BLX R0  
                  
                MOV R10, #200  
                  
                LDR R0, =UartConfig  
                BLX R0  
                     
SendString        
                LDR R0, =HelloString  
                LDR R1, =HelloEnd - HelloString  
                BL UartSendString  
                MOV R0, #0xAB  
                BL UartSendHex  
                B SendString  
                     
                ENDP      
  
  
UartSendHex     ; R0  
                PUSH {R1 - R3,LR}  
                  
                LDR R3, =HexTable  
                MOV R4, R0  
                LDR R2, =28  
HexLoop  
                LSR R1, R4, R2  
                AND R1, #0x0F  
                LDR R0, [R3, R1]  
                PUSH {R1-R2}  
                  
                BL UartSendByte  
                POP {R1-R2}  
                CMP R2, #0  
                BEQ HexExit  
                SUB R2, #4  
                B HexLoop  
                  
HexExit           
                POP {R1-R3, PC}  
  
UartConfig        
                PUSH {LR}  
                  
                LDR R0, =RCC_AHB1ENR  
                LDR R1, [R0]  
                ORR R1, #0x01  
                STR R1, [R0]  
                  
                LDR R0, =RCC_APB2ENR  
                LDR R1, [R0]  
                ORR R1, #0x10  
                STR R1, [R0]  
                  
                LDR R0, =GPIOA_MODER  
                LDR R1, [R0]  
                BIC R1, #0x3C0000  
                ORR R1, #0x280000  
                STR R1, [R0]  
                  
                LDR R0, =GPIOA_OTYPER  
                LDR R1, [R0]  
                BIC R1, #0x600  
                STR R1, [R0]  
                  
                LDR R0, =GPIOA_OSPEEDR  
                LDR R1, [R0]  
                ORR R1, #0x3C0000  
                STR R1, [R0]  
                  
                LDR R0, =GPIOA_PUPDR  
                LDR R1, [R0]  
                BIC R1, #0x3C0000  
                ORR R1, #0x140000  
                STR R1, [R0]  
                  
                LDR R0, =GPIOA_AFRH  
                LDR R1, [R0]  
                BIC R1, #0xFF0  
                ORR R1, #0x770  
                STR R1, [R0]  
                  
                LDR R0, =USART1_CR1  
                LDR R1, [R0]  
                MOV R1, #0  
                ORR R1, #0x08  
                STR R1, [R0]  
                  
                LDR R0, =USART1_CR2  
                MOV R1, #0  
                STR R1, [R0]  
                  
                LDR R0, =USART1_CR3  
                MOV R1, #0  
                STR R1, [R0]  
                  
                LDR R0, =USART1_BRR  
                LDR R1, =0x682  
                STR R1, [R0]  
                  
                LDR R0, =USART1_CR1  
                LDR R1, [R0]  
                ORR R1, #0x2000  
                STR R1, [R0]  
                  
                POP {PC}  
                  
  
UartSendByte    ; R0  
                PUSH {LR}  
SendWait  
                LDR R2, =USART1_SR  
                LDR R1, [R2]  
                TST R1, #0x80  
                BEQ SendWait  
                LDR R2, =USART1_DR  
                STR R0, [R2]  
                  
                POP {PC}  
                  
  
UartSendString  ; R0 R1  
  
                PUSH {LR}  
                  
                MOV R2, R0  
StringLoop               
                CMP R1, #0  
                BEQ SendExit  
                LDRB R0, [R2]  
                PUSH {R1, R2}  
                BL UartSendByte  
                POP {R1, R2}  
                SUB R1, #1  
                ADD R2, #1  
                B StringLoop  
                  
SendExit  
                POP {PC}  
  
  
SysTickConfig     
                PUSH {LR}  
                  
                LDR R0, =SYSTICK_LOAD  
                LDR R1, =1999  
                STR R1, [R0]  
                  
                LDR R0, =SYSTICK_VAL  
                LDR R1, =0  
                STR R1, [R0]  
                  
                LDR R0, =SYSTICK_CTRL  
                LDR R1, [R0]  
                BIC R1, #0x04  
                ORR R1, #0x03  
                STR R1, [R0]  
                  
                POP {PC}  
                  
                  
LedConfig         
                PUSH {LR}  
                  
                LDR R0, =RCC_AHB1ENR  
                LDR R1, [R0]  
                ORR R1, #0x20  
                STR R1, [R0]  
                  
                LDR R0, =GPIOF_MODER  
                LDR R1, [R0]  
                BIC R1, #0x3C0000  
                ORR R1, #0x140000  
                STR R1, [R0]  
                  
                LDR R0, =GPIOF_OTYPER  
                LDR R1, [R0]  
                BIC R1, #0x600  
                STR R1, [R0]  
                  
                LDR R0, =GPIOF_OSPEEDR  
                LDR R1, [R0]  
                ORR R1, #0x3C0000  
                STR R1, [R0]  
                  
                LDR R0, =GPIOF_PUPDR  
                LDR R1, [R0]  
                BIC R1, #0x3C0000  
                ORR R1, #0x140000  
                STR R1, [R0]  
                  
                LDR R0, =GPIOF_BSRR  
                LDR R1, [R0]  
                ORR R1, #0x600  
                STR R1, [R0]  
                  
                POP{PC}  
  
  
  
SysTick_Handler PROC  
                EXPORT SysTick_Handler  
                  
                PUSH {LR}  
                  
                CMP R10, #0  
                BNE Exit  
                LDR R0, =GPIOF_ODR  
                LDR R1, [R0]  
                EOR R1, #0x600  
                STR R1, [R0]  
                MOV R10, #200  
                  
                POP {PC}  
                  
Exit              
                SUB R10, #1  
                  
                POP{PC}  
  
                ENDP  
                  
                END  
创客学院  全新成套视频:www.makeru.com.cn
嵌入式学习交流群:561213221
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2018-1-18 17:26:42 | 显示全部楼层
32位的应该可以用ARM指令集啊,不是效率更高一点吗?
回复 支持 反对

使用道具 举报

132

主题

340

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2017-10-30
在线时间
163 小时
 楼主| 发表于 2018-1-19 10:36:36 | 显示全部楼层
好建议
            
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2018-1-19 17:13:43 | 显示全部楼层
STM32 用汇编,实在没有必要..没有优势.
启动文件用一下就可以了.其它的地方,还是C语言实在.
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 23:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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