OpenEdv-开源电子网

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

关于systick程序中位带设置的问题

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2014-9-4
在线时间
3 小时
发表于 2014-9-4 14:15:16 | 显示全部楼层 |阅读模式
5金钱
有个网上程序原先是F1的,我移植到F4一直调试未遂。目的是为了点亮灯再灭,一直循环,但是现在却是复位后灯熄灭大概2秒后长亮,这个结果倒不重要,主要是不理解这个位带操作。
其中的位带操作一直没有太想清楚。大概的初始化是这样的,我的理解是,用bflas和b_05s来决定20000200的Bit 1 和 Bit 4,只是不知道这个systim的设定起什么作用呢?我看到中断路径中有这个systim量的load和store。




///////////////////////////////////////////
原程序在这儿,有点长。。
           IMPORT PLL_getV
;RCC寄存器地址映像
GPIO_PORTD_Mode    EQU 0x40020C00 ;Moder[0:1] from [31...0] 01 for output 
GPIO_PORTD_ODR     EQU 0x40020C14  
GPIO_PORTD_en   EQU 0x40023830
GPIO_PORTD_BSRR    EQU 0x40020C18 ;BSRR [0:15] for set and[16:31] FOR  reset
 
;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)
 

;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           200
;***************************************************************************************
                AREA            |.text|, CODE, READONLY
;主程序开始
                ENTRY                           ;指示程序从这里开始执行
Start
;时钟系统设置
                BL  LL_getV
 
               
;AFIO 参数设置
                
;Systick 参数设置
                ldr             r0,=SYSTICKRVR          ;Systick装初值
                ldr             r1,=21000 ;168000/8=21000
                str             r1,[r0]
                ldr             r0,=SYSTICKCSR          ;设定、启动Systick
                mov             r1,#0x03
                str             r1,[r0]
LDR R1, =GPIO_PORTD_en          
LDR R0, [R1]                 
ORR R0, R0, #0x08               
STR R0, [R1]                  
NOP
NOP                              
LDR R1,=GPIO_PORTD_Mode
LDR R0, =0x55000000
STR R0, [R1]
NOP
                NOP;方便调试,嘿嘿!
;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
                beq             main                    ;主程序0.5s走一次
                ldr             r0,=b_05s               ;位带操作清零0.5s标志
                mov             r1,#0
                str             r1,[r0]
                bl              LedFlas
                b               main
;子程序**********************************************************************************
LedFlas
                push            {r0-r3}
                ldr             r0,=Flag1
                ldr             r1,[r0]
                tst             r1,#Bit0
                beq             ONLED
                
                ldr             r0,=b_flas
                mov             r1,#0
                str             r1,[r0]
                C.4输出1
                ldr             r0,=GPIO_PORTD_ODR
                ldr             r1,[r0]
                orr             r1,#Bit14
                str             r1,[r0]
                b               LedEx
ONLED
                ldr             r0,=b_flas
                mov             r1,#1
                str             r1,[r0]
                C.4输出0
                ldr             r0,=GPIO_PORTD_ODR
                ldr             r1,[r0]
                orr             r1,#Bit14
                str             r1,[r0]
LedEx
                pop            {r0-r3}
                bx              lr
;异常程序*******************************************************************************
NMI_Handler
                ;xxxxxxxxxxxxxxxxxx
                bx              lr
;-----------------------------
HardFault_Handler
                ;xxxxxxxxxxxxxxxxxx
                bx              lr
;-----------------------------
SysTick_Handler
                ldr             r0,=SysTim
                ldr             r1,[r0]
                add             r1,#1
                str             r1,[r0]
                cmp             r1,#250
                bcc             TickExit
                mov             r1,#0
                str             r1,[r0]
                ldr             r0,=b_05s               ;位带操作置1
                mov             r1,#1
                str             r1,[r0]
TickExit
                bx              lr
;***************************************************************************************
                ALIGN           ;通过用零或空指令NOP填充,来使当前位置与一个指定的边界对齐
;-----------------------------
                END

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-9-5 00:03:10 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 22:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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