[其他ST产品] stm32 汇编点灯程序

[复制链接]
983|27
 楼主| 狗啃模拟 发表于 2022-1-27 23:56 | 显示全部楼层
  ;初始化SRAM寄存器
    mov    r1, #0
    ldr    r0, =Flag1
    str    r1, [r0]
    ldr    r0, =DlyI
    str    r1, [r0]
    ldr    r0, =DlyJ
    str    r1, [r0]
    ldr    r0, =DlyK
    str    r1, [r0]
    ldr    r0, =SysTim
    str    r1, [r0]
              
————————————
 楼主| 狗啃模拟 发表于 2022-1-27 23:57 | 显示全部楼层
;主循环           
main           
    ldr    r0, =Flag1
    ldr    r1, [r0]
    tst    r1, #Bit1               
    ;SysTick产生0.5s,置位bit 1
    beq    main                  ;0.5s标志还没有置位      
   
    ;0.5s标志已经置位
    ldr    r0, =b_05s               
    ;位带操作清零0.5s标志
    mov    r1, #0
    str    r1, [r0]
    bl     LedFlas


    mov    r0, #'K'
    bl     send_a_char      
    b      main
         
 楼主| 狗啃模拟 发表于 2022-1-27 23:58 | 显示全部楼层
;子程序 串口1发送一个字符
send_a_char
    push   {r0 - r3}
    ldr    r2, =USART1_DR  
    str    r0, [r2]
b1
    ldr    r2, =USART1_SR
    ldr    r2, [r2]
    tst    r2, #0x40
    beq    b1
    ;发送完成(Transmission complete)等待
    pop    {r0 - r3}
    bx     lr
 楼主| 狗啃模拟 发表于 2022-1-27 23:58 | 显示全部楼层
;子程序 led闪烁
LedFlas     
    push   {r0 - r3}
    ldr    r0, =Flag1
    ldr    r1, [r0]
    tst    r1, #Bit0
    ;bit0 闪烁标志位
    beq    ONLED        ;为0 打开led灯
    ;为1 关闭led灯
    ldr    r0, =b_flas
    mov    r1, #0
    str    r1, [r0]
    ;闪烁标志位置为0,下一状态为打开灯
    ;PC.7输出0
    ldr    r0, =GPIOC_BRR
    ldr    r1, [r0]
    orr    r1, #Bit7
    str    r1, [r0]
    b      LedEx
ONLED      
    ;为0 打开led灯
    ldr    r0, =b_flas
    mov    r1, #1
    str    r1, [r0]
    ;闪烁标志位置为1,下一状态为关闭灯
    ;PC.7输出1
    ldr    r0, =GPIOC_BSRR
    ldr    r1, [r0]
    orr    r1, #Bit7
    str    r1, [r0]
LedEx      
    pop    {r0 - r3}
    bx     lr
                           
 楼主| 狗啃模拟 发表于 2022-1-27 23:59 | 显示全部楼层
;异常程序
NMI_Handler
    bx     lr


HardFault_Handler
    bx     lr
            
SysTick_Handler
    ldr    r0, =SysTim
    ldr    r1, [r0]
    add    r1, #1
    str    r1, [r0]
    cmp    r1, #500
    bcc    TickExit
    mov    r1, #0
    str    r1, [r0]
    ldr    r0, =b_05s
    ;大于等于500次 清零时钟滴答计数器 设置0.5s标志位
    ;位带操作置1
    mov    r1, #1
    str    r1, [r0]
TickExit   
    bx     lr
                                                                          
    ALIGN           
    ;通过用零或空指令NOP填充,来使当前位置与一个指定的边界对齐
    END
豌豆爹 发表于 2022-1-28 10:23 来自手机 | 显示全部楼层
好帖是好帖就是发的零碎了点
alexzhou88 发表于 2022-1-30 23:25 来自手机 | 显示全部楼层
谢谢楼主分享,不错的资料!
skyred 发表于 2022-2-9 11:24 | 显示全部楼层
本来对汇编就不感冒,
这下更不懂了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部