stm32 汇编点灯程序

发布者:数字梦行最新更新时间:2019-03-29 来源: eefocus关键字:stm32  汇编  点灯程序 手机看文章 扫描二维码
随时随地手机看文章

;RCC寄存器地址映像            

RCC_BASE            EQU    0x40021000

RCC_CR              EQU    (RCC_BASE + 0x00)

RCC_CFGR            EQU    (RCC_BASE + 0x04)

RCC_CIR             EQU    (RCC_BASE + 0x08)

RCC_APB2RSTR        EQU    (RCC_BASE + 0x0C)

RCC_APB1RSTR        EQU    (RCC_BASE + 0x10)

RCC_AHBENR          EQU    (RCC_BASE + 0x14)

RCC_APB2ENR         EQU    (RCC_BASE + 0x18)

RCC_APB1ENR         EQU    (RCC_BASE + 0x1C)

RCC_BDCR            EQU    (RCC_BASE + 0x20)

RCC_CSR             EQU    (RCC_BASE + 0x24)

                             

;AFIO寄存器地址映像           

AFIO_BASE           EQU    0x40010000

AFIO_EVCR           EQU    (AFIO_BASE + 0x00)

AFIO_MAPR           EQU    (AFIO_BASE + 0x04)

AFIO_EXTICR1        EQU    (AFIO_BASE + 0x08)

AFIO_EXTICR2        EQU    (AFIO_BASE + 0x0C)

AFIO_EXTICR3        EQU    (AFIO_BASE + 0x10)

AFIO_EXTICR4        EQU    (AFIO_BASE + 0x14)

                                                          

;GPIOA寄存器地址映像             

GPIOA_BASE          EQU    0x40010800

GPIOA_CRL           EQU    (GPIOA_BASE + 0x00)

GPIOA_CRH           EQU    (GPIOA_BASE + 0x04)

GPIOA_IDR           EQU    (GPIOA_BASE + 0x08)

GPIOA_ODR           EQU    (GPIOA_BASE + 0x0C)

GPIOA_BSRR          EQU    (GPIOA_BASE + 0x10)

GPIOA_BRR           EQU    (GPIOA_BASE + 0x14)

GPIOA_LCKR          EQU    (GPIOA_BASE + 0x18)

                                                      

;GPIO C口控制                  

GPIOC_BASE          EQU    0x40011000

GPIOC_CRL           EQU    (GPIOC_BASE + 0x00)

GPIOC_CRH           EQU    (GPIOC_BASE + 0x04)

GPIOC_IDR           EQU    (GPIOC_BASE + 0x08)

GPIOC_ODR           EQU    (GPIOC_BASE + 0x0C)

GPIOC_BSRR          EQU    (GPIOC_BASE + 0x10)

GPIOC_BRR           EQU    (GPIOC_BASE + 0x14)

GPIOC_LCKR          EQU    (GPIOC_BASE + 0x18)

                                                          

;串口1控制                      

USART1_BASE         EQU    0x40013800

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)

                           

;NVIC寄存器地址               

NVIC_BASE           EQU    0xE000E000

NVIC_SETEN          EQU    (NVIC_BASE + 0x0010)    

;SETENA寄存器阵列的起始地址

NVIC_IRQPRI         EQU    (NVIC_BASE + 0x0400)    

;中断优先级寄存器阵列的起始地址

NVIC_VECTTBL        EQU    (NVIC_BASE + 0x0D08)    

;向量表偏移寄存器的地址    

NVIC_AIRCR          EQU    (NVIC_BASE + 0x0D0C)    

;应用程序中断及复位控制寄存器的地址                                               

SETENA0             EQU    0xE000E100

SETENA1             EQU    0xE000E104

                           

                             

;SysTick寄存器地址           

SysTick_BASE        EQU    0xE000E010

SYSTICKCSR          EQU    (SysTick_BASE + 0x00)

SYSTICKRVR          EQU    (SysTick_BASE + 0x04)

                             

;FLASH缓冲寄存器地址映像    

FLASH_ACR           EQU    0x40022000

                            

;SCB_BASE           EQU    (SCS_BASE + 0x0D00)

                            

MSP_TOP             EQU    0x20005000              

;主堆栈起始值               

PSP_TOP             EQU    0x20004E00              

;进程堆栈起始值            

                           

BitAlias_BASE       EQU    0x22000000              

;位带别名区起始地址        

Flag1               EQU    0x20000200

b_flas              EQU    (BitAlias_BASE + (0x200*32) + (0*4))              

;位地址

b_05s               EQU    (BitAlias_BASE + (0x200*32) + (1*4))              

;位地址

DlyI                EQU    0x20000204

DlyJ                EQU    0x20000208

DlyK                EQU    0x2000020C

SysTim              EQU    0x20000210









;常数定义

Bit0                EQU    0x00000001

Bit1                EQU    0x00000002

Bit2                EQU    0x00000004

Bit3                EQU    0x00000008

Bit4                EQU    0x00000010

Bit5                EQU    0x00000020

Bit6                EQU    0x00000040

Bit7                EQU    0x00000080

Bit8                EQU    0x00000100

Bit9                EQU    0x00000200

Bit10               EQU    0x00000400

Bit11               EQU    0x00000800

Bit12               EQU    0x00001000

Bit13               EQU    0x00002000

Bit14               EQU    0x00004000

Bit15               EQU    0x00008000

Bit16               EQU    0x00010000

Bit17               EQU    0x00020000

Bit18               EQU    0x00040000

Bit19               EQU    0x00080000

Bit20               EQU    0x00100000

Bit21               EQU    0x00200000

Bit22               EQU    0x00400000

Bit23               EQU    0x00800000

Bit24               EQU    0x01000000

Bit25               EQU    0x02000000

Bit26               EQU    0x04000000

Bit27               EQU    0x08000000

Bit28               EQU    0x10000000

Bit29               EQU    0x20000000

Bit30               EQU    0x40000000

Bit31               EQU    0x80000000













;向量表

    AREA RESET, DATA, READONLY

    DCD    MSP_TOP            ;初始化主堆栈

    DCD    Start              ;复位向量

    DCD    NMI_Handler        ;NMI Handler

    DCD    HardFault_Handler  ;Hard Fault Handler

    DCD    0                  

    DCD    0

    DCD    0

    DCD    0

    DCD    0

    DCD    0

    DCD    0

    DCD    0

    DCD    0

    DCD    0

    DCD    0

    DCD    SysTick_Handler    ;SysTick Handler

    SPACE  20                 ;预留空间20字节









                

;代码段

    AREA |.text|, CODE, READONLY

    ;主程序开始

    ENTRY                           

    ;指示程序从这里开始执行

Start

    ;时钟系统设置

    ldr    r0, =RCC_CR

    ldr    r1, [r0]

    orr    r1, #Bit16

    str    r1, [r0]

    ;开启外部晶振使能 

    ;启动外部8M晶振

                                           

ClkOk          

    ldr    r1, [r0]

    ands   r1, #Bit17

    beq    ClkOk

    ;等待外部晶振就绪

    ldr    r1,[r0]

    orr    r1,#Bit17

    str    r1,[r0]

    ;FLASH缓冲器

    ldr    r0, =FLASH_ACR

    mov    r1, #0x00000032

    str    r1, [r0]

           

    ;设置PLL锁相环倍率为7,HSE输入不分频

    ldr    r0, =RCC_CFGR

    ldr    r1, [r0]

    orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14)

    orr    r1, #Bit10

    str    r1, [r0]

    ;启动PLL锁相环

    ldr    r0, =RCC_CR

    ldr    r1, [r0]

    orr    r1, #Bit24

    str    r1, [r0]

PllOk

    ldr    r1, [r0]

    ands   r1, #Bit25

    beq    PllOk

    ;选择PLL时钟作为系统时钟

    ldr    r0, =RCC_CFGR

    ldr    r1, [r0]

    orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14)

    orr    r1, #Bit10

    orr    r1, #Bit1

    str    r1, [r0]

    ;其它RCC相关设置

    ldr    r0, =RCC_APB2ENR

    mov    r1, #(Bit14 :OR: Bit4 :OR: Bit2)

    str    r1, [r0]     



    ;IO端口设置

    ldr    r0, =GPIOC_CRL

    ldr    r1, [r0]

    orr    r1, #(Bit28 :OR: Bit29)         

    ;PC.7输出模式,最大速度50MHz 

    and    r1, #(~Bit30 & ~Bit31)  

    ;PC.7通用推挽输出模式

    str    r1, [r0]

           

    ;PA9串口0发射脚

    ldr    r0, =GPIOA_CRH

    ldr    r1, [r0]

    orr    r1, #(Bit4 :OR: Bit5)         

    ;PA.9输出模式,最大速度50MHz 

    orr    r1, #Bit7

    and    r1, #~Bit6

    ;10:复用功能推挽输出模式

    str    r1, [r0]   



    ldr    r0, =USART1_BRR  

    mov    r1, #0x271

    str    r1, [r0]

    ;配置波特率-> 115200

                  

    ldr    r0, =USART1_CR1  

    mov    r1, #0x200c

    str    r1, [r0]

    ;USART模块总使能 发送与接收使能

    ;71 02 00 00   2c 20 00 00

            

    ;AFIO 参数设置            

    ;Systick 参数设置

    ldr    r0, =SYSTICKRVR          

    ;Systick装初值

    mov    r1, #9000

    str    r1, [r0]

    ldr    r0, =SYSTICKCSR          

    ;设定,启动Systick

    mov    r1, #0x03

    str    r1, [r0]

           

    ;NVIC                    

    ;ldr   r0, =SETENA0

    ;mov   r1, 0x00800000

    ;str   r1, [r0]

    ;ldr   r0, =SETENA1

    ;mov   r1, #0x00000100

    ;str   r1, [r0]

             

    ;切换成用户级线程序模式

    ldr    r0, =PSP_TOP                  

    ;初始化线程堆栈

    msr    psp, r0

    mov    r0, #3

    msr    control, r0

             

    ;初始化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]

              

;主循环           

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

           

             

           

;子程序 串口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











                

;子程序 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

                               

;异常程序

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

关键字:stm32  汇编  点灯程序 引用地址:stm32 汇编点灯程序

上一篇:基于STM32利用按键点亮LED灯
下一篇:stm32串口点灯

推荐阅读最新更新时间:2024-03-16 16:26

STM32开发笔记80: 在构造函数中调用延时函数应注意的问题
单片机型号:STM32L053R8T6 W5500驱动程序完成后,运行时,单片机死机。W5500驱动程序先前已经在项目中具体应用过,运行的比较稳定。这次移植后,没有做改动,但是单片机运行时死机。 此项目与先前项目的不同点在于,项目中有FreeRTOS操作系统运行,原先的项目没有,最后将问题聚焦于W5500的构造函数上,如下程序所示: CW5500::CW5500(void):CSpi() { //uint8_t memsize = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}}; //注册相关的函数 reg_wizchip_cris_cbfunc(w5500_cris_enter
[单片机]
STM32外部中断方式按键操作(STM32_09)
一、中断配置的步骤 1、使能中断 2、设置中断优先级分组 void NVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup); #define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*0位抢占,4位响应 */ #define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*1位抢占,3位响应 */ #define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*2位抢占,2位响应 */ #define NVIC_Priori
[单片机]
STM32的GPIO工作方式与基本结构
GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F103ZET6芯片为144脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 STM32的大部分引脚除了当GPIO使用之外,还可以复用为外设功能引脚,比如串口。相关文章:学习STM32单片机,绕不开的串口。 GPIO基本结构 每个GPIO
[单片机]
<font color='red'>STM32</font>的GPIO工作方式与基本结构
STM32跑马灯遇到的问题及解决方法及体会
一、跑马灯程序运行所遇问题 1,按照正点原子stm32视频学习时,在编写跑马灯程序中,出现:“Error:L6218E:Undefined symbol main(reffered from __rtentry2.o)” 百度结果是可能 1)main拼写错误(我没有拼写错误); 2)主函数文件中没有调用主函数;(此时我还没有写主函数文件) 但是,我点击最左边的编译符号后,错误消失了。写完主函数后,此错误消失; 2,写完主函数后,出现:“Error:L6200E:Symbol delay_init multiply defined(by delay.o and main.o)
[单片机]
STM32别名区的理解
1. 什么是位段、位带别名区? 2. 它有什么好处? 答1: 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作, MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 ; 就是这样把P1口的第三个脚(BIT2)置0置。 而现在STM32的位段、位带别名区就为了实现这样的功能。 对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。 它是这样的。在寻址空间(32位地址是 4GB )另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT) 就对应SRAM或I/O的一位。 这样呢,1MB SRAM就 可以有32MB的对应别名区空间,就是1位膨
[单片机]
<font color='red'>STM32</font>别名区的理解
从零开始一起学stm32(十二)---SPI协议
SPI通信 -- W25Q64 -- flash芯片的使用 1、通信协议 2、SPI通信 3、STM32中SPI控制器的使用 4、W25Q64的操作过程以及软件编程 1.通信协议: 协议:两个相互通信的设备之间,进行数据传输的一种规定! 1.串口通信-- 物理层 所接管脚:TX(发送管脚) RX(接收管脚) GND(接地) 数据链接层---RS232协议 开始位+数据位+奇偶校验位+停止位 1 5~8 1 1 1.总线在发送或接收前应处于空闲状态--没有数据传输时,总线处于高电平状态! 2.开始位:要发送数据时,先发送一个低电平信号,这个信号叫开始信号,表示开
[单片机]
从零开始一起学<font color='red'>stm32</font>(十二)---SPI协议
C51与汇编语言混合编程之一
1、函数内部混合编程 若想在C语言函数内部使用汇编语言,应使用以下Cx51编译器控制命令: #pragma asm ;;; Assembly code #pragma endasm 功能作用: asm和endasm命令用于将其标记的汇编程序合并到.SRC文件中。这个带有asm和endasm块标记的源程序可看作是在线嵌入式汇编程序。从这点来说,此命令有些类似于#define命令。 具体实现: (1)编译器设置及SRC文件的产生 .SRC文件在命令行编译模式下是使用SRC编译器控制命令产生的,在IDE环境中可以为需要产生SRC文件的C源文件设置特定选项: l 右键单击Project Workspace下的文件标
[单片机]
Event Recoder调试组件在stm32上的使用
本文目标:Event_Recoder调试组件在stm32上的使用 按照本文的描述,应该可以在你所处的硬件上跑通代码。 先决条件:装有编译和集成的开发环境,比如:Keil uVision5。 板子硬件要求:无,属于调试功能。 起源 因为做产品开发,设计东西有时候考虑得多,mcu的并没有多余的串口供使用调试,在调试一些初期进行验证时,必要的调试的打印信息是需要的。 Event Recoder调试组件简介 嵌入式的Event_Recoder调试组件是一种可以在MDK开发环境下使用的高级调试工具,它可以记录软件运行的一些标志信息,并以图形化的形式显示出来。它可以帮助你了解和分析内部操作,支持Keil RTX操作系统调试以及MDK自带的
[单片机]
Event Recoder调试组件在<font color='red'>stm32</font>上的使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved