Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Jérémy
ASM: Hello World sur PIC32MX
Salut,
Dans la foulée de F6FCO, je mets un exemple de clignotement led avec un pic32, j'avais fait ça en 1997. Assemblage et debug avec MPLAB, toujours à la hauteur. Il y aura au moins un programme pic32 sur le forum
Cela donne une idée de l'assembleur MIP32, assez accessible tout de même, sur les MIPS il faut régler le Cache, le Prefetch et les Wait states. Je ne sais pas si cette architecture va perdurer chez Microchip.
32MX_Test_01.S
config.inc
macros.inc
Dans la foulée de F6FCO, je mets un exemple de clignotement led avec un pic32, j'avais fait ça en 1997. Assemblage et debug avec MPLAB, toujours à la hauteur. Il y aura au moins un programme pic32 sur le forum
Cela donne une idée de l'assembleur MIP32, assez accessible tout de même, sur les MIPS il faut régler le Cache, le Prefetch et les Wait states. Je ne sais pas si cette architecture va perdurer chez Microchip.
32MX_Test_01.S
Code : Tout sélectionner
#----------------------------------------------------------------------
# asm 32MX fichier .S pour utiliser le préprocesseur C
#----------------------------------------------------------------------
#include <p32xxxx.h>
#include "config.inc"
#include "macros.inc"
#----------------------------------------------------------------------
# defines
#----------------------------------------------------------------------
#define INT_MULTI_VECT # avec interruptions multi-vecteurs
# #define WAIT_BCL # tempo 1s par boucle
#define WAIT_CP0 # tempo 1s par core timer
#----------------------------------------------------------------------
# code
#----------------------------------------------------------------------
.global main # symbole global
.text
.set noreorder # pas d'optimisation, pas d'ajout nop après sauts
#----------------------------------------------------------------------
main:
#----------------------------------------------------------------------
#ifdef IS_CACHE_AND_PREFETCH
jal cache_prefetch_on # activer cache et prefetch flash
nop
#endif
#ifdef INT_MULTI_VECT
jal int_multi_vect_on # activer interruptions multi-vecteurs
#endif
nop
#ifdef __32MX220F032B__
s0_a CFGCON # accès port B (inhiber jtag)
s0_a ANSELB # port B numérique
#else
# s0_a DDPCON # accès port A (inhiber jtag)
# si_a AD1PCFG,0xffff # port B numérique
#endif
si_a TRISBCLR,LED # output led
#----------------------------------------------------------------------
#ifdef WAIT_CP0
#----------------------------------------------------------------------
.equ CP01S, (FCY/2) # 1 seconde
mtc0 zero,CP0_COUNTER # clr core timer
si_cp0 CP0_COMPARE,CP01S # set core timer 1s
si_a IPC0CLR,0x1f # set priority 3 core timer int
si_a IPC0SET,3<<2
si_a IFS0CLR,1 # clr core timer int flag
si_a IEC0SET,1 # enable core timer int
bcl1: j bcl1
nop
#endif
#ifdef WAIT_BCL
bcl2: li a0,1000 # wait 1s
jal wait_a0_ms
nop
jal led_toggle # toggle led
nop
j bcl2
nop
#-----------------------------------------------------------------
# tempo de a0 ms
#-----------------------------------------------------------------
.equ MSEC, (10000000/TCY/2) # si boucle de 2 instructions
wait_a0_ms: sub_2 t0,t1
move t1,zero
waita0_10: beq t1,a0,waita0_exit
li t0,MSEC # raz timout 1 ms
waita0_20: bnez t0,waita0_20 # .
addiu t0,t0,-1 # . boucle de tempo 1 ms
j waita0_10
addiu t1,t1,1
waita0_exit:end_2 t0,t1
#endif
#-----------------------------------------------------------------
# toggle led
#-----------------------------------------------------------------
led_toggle: sub_1 s0
si_a LATBINV,LED
end_1 s0
#ifdef INT_MULTI_VECT
#-----------------------------------------------------------------
int_multi_vect_on:
#-----------------------------------------------------------------
# activer interruptions avec plusieurs vecteurs
mfc0 s0,CP0_CAUSE
lui a0,0x0080
or s0,s0,a0
mfc0 s0,CP0_CAUSE
jr ra
ei
#endif
#ifdef IS_CACHE_AND_PREFETCH
#-----------------------------------------------------------------
cache_prefetch_on:
#-----------------------------------------------------------------
# le reset se fait avec cache off, prefetch off, 7 flash wait states, 1 sram wait state
# en activant cache et prefetch, boucle wait_ms 10 fois plus rapide
mfc0 s0,CP0_CONFIG # set kseg0 cache on
li a0,0xfffffff8
and s0,s0,a0
ori s0,s0,3
mtc0 s0,CP0_CONFIG
si_a CHECONSET,0x30 # set uncached/cached predictive prefetch on
jr ra
nop
#endif
#----------------------------------------------------------------------
#ifdef WAIT_CP0
#----------------------------------------------------------------------
#ifdef INT_MULTI_VECT
.section .vector_0, code
#else
.section .bev_handler, code # marche pas !
#endif
j core_timer_isr
nop
.text
core_timer_isr:
rdpgpr sp,sp # read GPR from Previous Shadow Set
mfc0 k0,CP0_CAUSE # read CAUSE register
mfc0 k1,CP0_EPC # read EPC register
srl k0,k0,10 # align RIPL to bit 0
addiu sp,sp,-16 # 4 words space on stack
sw k1,12(sp) # save EPC on stack
mfc0 k1,CP0_STATUS # read STATUS register
sw k1,8(sp) # save STATUS on stack
ins k1,k0,10,6 # place 6 bits CAUSE.RIPL to STATUS.IPL field
ins k1,zero,1,4 #
mtc0 k1,CP0_STATUS # write STATUS register (erl=0, exl=0, ie=1)
sw ra,4(sp) # save Return Addr on stack
sw a0,0(sp) # save A0 on stack
si_a LATBINV,LED
si_a IFS0CLR,1 # clr core timer int flag
mfc0 s0,CP0_COMPARE
li a0,CP01S # add core timer 1s
addu s0,s0,a0
mtc0 s0,CP0_COMPARE
lw a0, 0(sp) # restore A0 from stack
lw ra, 4(sp) # restore Return Addr from stack
di # disable interrupts
lw k0, 12(sp) # restore EPC from stack
mtc0 k0, $14
lw k0, 8(sp) # restore STATUS from stack
addiu sp, sp, 16 # adjust stack
mtc0 k0, $12
ei # enable interrupts
eret # return from interrupt
#endif
#----------------------------------------------------------------------
# data en flash
#----------------------------------------------------------------------
data1: .word 1
data2: .word 0b1111111111111110
data3: .word 0xaaaabbbb
#-----------------------------------------------------------------
config.inc
Code : Tout sélectionner
#------------------------------------------------------------------------------
# constantes
#------------------------------------------------------------------------------
.equ FCY, 80000000 # 80 MHz
.equ TCY, (1000000000/(FCY/10)) # durée de 10 cycles en ns
.equ CP0_COUNTER, $9 # registres CP0
.equ CP0_COMPARE, $11
.equ CP0_STATUS, $12
.equ CP0_CAUSE, $13
.equ CP0_EPC, $14
.equ CP0_CONFIG, $16
#ifdef __32MX220F032B__
.equ LED, 0x80 # led en B7
#endif
#ifdef __32MX795F512H__
#define IS_CACHE_AND_PREFETCH
.equ LED, 0x01 # led en B0
#endif
#ifdef __32MX795F512L__
#define IS_CACHE_AND_PREFETCH
.equ LED, 0x01 # led en B0
#endif
#------------------------------------------------------------------------------
# config hardware 32MX220F032B
#------------------------------------------------------------------------------
#ifdef __32MX220F032B__
.section .config_BFC00BFC,code
.word 0x7EFFFFF8 # CP off, BWP off, PWP off, ICESEL=1, JTAGEN off, DEBUG on
.section .config_BFC00BF8,code
.word 0xFF60CF59 # FWDTWINSZ=25%, FWDTEN off, WINDIS off, WDTPS=PS1, FCKSM off, FBDIV=DIV_1
# OSCIOFNC off, POSCMD off, IESO off, FSOSCEN off, FNOSC=FRCPLL
.section .config_BFC00BF4,code
.word 0xfff8f9d9 # FPLLODIV=DIV_1, UPLLEN off, UPLLIDIV=DIV_2, FPLLMUL=MUL_20, FPLLIDIV=DIV_2
.section .config_BFC00BF0,code
.word 0xdfffffff # FVBUSONIO on, FUSBIDO on, IOL1WAY off, PMDL1WAY on, USERID=0xffff
#------------------------------------------------------------------------------
# config hardware 32MX795F512X
#------------------------------------------------------------------------------
#else
.section .config_BFC02FFC,code
#ifdef __32MX795F512H__
.word 0x7EFFFFF6 # CP off, BWP off, PWP off, ICESEL=1, DEBUG on
#else
.word 0x7EFFFFFE # CP off, BWP off, PWP off, ICESEL=2, DEBUG on
#endif
.section .config_BFC02FF8,code
.word 0xFF60CF59 # FWDTWINSZ=25%, FWDTEN off, WINDIS off, WDTPS=PS1, FCKSM off, FBDIV=DIV_1
# OSCIOFNC off, POSCMD off, IESO off, FSOSCEN off, FNOSC=FRCPLL
.section .config_BFC02FF4,code
.word 0xfff8f9d9 # FPLLODIV=DIV_1, UPLLEN off, UPLLIDIV=DIV_2, FPLLMUL=MUL_20, FPLLIDIV=DIV_2
.section .config_BFC02FF0,code
.word 0xffffffff # FVBUSONIO on, FUSBIDO on, FCANIO def, FETHIO def, FMIIEN on, FSRSSEL=7, USERID=0xffff
#endif
#------------------------------------------------------------------------------
macros.inc
Code : Tout sélectionner
#------------------------------------------------------------------------------
# macros pour bootloader pic à instructions 32 bits 01/05/2019
#------------------------------------------------------------------------------
# lw_a reg_dst,adr # reg32 <- (adr32) (s0)
# s0_a adr_dst # (adr32) <- 0 (s0)
# sui_a adr_dst,d16 # (adr32) <- d16<<16 (s0,a0)
# si_a adr_dst,d32 # (adr32) <- d32 ou d16 (s0,a0)
# sui_cp0 cp0_reg,d16 # cp0_reg32 <- d16<<16 (a0)
# si_cp0 cp0_reg,d32 # cp0_reg32 <- d32 ou d16 (a0)
#------------------------------------------------------------------------------
.macro lw_a reg_dst,adr # reg32 <- (adr32)
la s0,\adr # modifie s0
lw \reg_dst,0(s0)
.endm
.macro s0_a adr_dst # (adr32) <- 0
la s0,\adr_dst # modifie s0
sw zero,0(s0)
.endm
.macro sui_a adr_dst,d16 # (adr32) <- d16<<16
la s0,\adr_dst # modifie s0,a0
lui a0,\d16
sw a0,0(s0)
.endm
.macro si_a adr_dst,d32 # (adr32) <- d32 ou d16
la s0,\adr_dst # modifie s0,a0
li a0,\d32
sw a0,0(s0)
.endm
.macro sui_cp0 cp0_reg,d16 # cp0_reg <- d16<<16
lui a0,\d16 # modifie a0
mtc0 a0,\cp0_reg
.endm
.macro si_cp0 cp0_reg,d32 # cp0_reg <- d32 ou d16
li a0,\d32 # modifie a0
mtc0 a0,\cp0_reg
.endm
#------------------------------------------------------------------------------
# macros début/fin de sous-programme avec sauvegarde/restitution registres
#------------------------------------------------------------------------------
.macro sub_0 # début sous-programme avec
addiu sp,sp,-4 # sauvegarde registre ra
sw \reg,4(sp)
sw ra,0(sp)
.endm
.macro end_0 # retour de sous-programme après
lw ra,0(sp) # restitution registre ra
jr ra
addiu sp,sp,4
.endm
.macro sub_1 reg # début sous-programme avec
addiu sp,sp,-4-4*1 # sauvegarde registres reg et ra
sw \reg,4(sp)
sw ra,0(sp)
.endm
.macro end_1 reg # retour de sous-programme après
lw \reg,4(sp) # restitution registres reg et ra
lw ra,0(sp)
jr ra
addiu sp,sp,4+4*1
.endm
.macro sub_2 reg0,reg1 # début sous-programme avec
addiu sp,sp,-4-4*2 # sauvegarde de 2 registres et ra
sw \reg1,8(sp)
sw \reg0,4(sp)
sw ra,0(sp)
.endm
.macro end_2 reg0,reg1
lw \reg1,8(sp)
lw \reg0,4(sp)
lw ra,0(sp)
jr ra
addiu sp,sp,4+4*2
.endm
#------------------------------------------------------------------------------
Modifié en dernier par satinas le mar. 14 mai 2024 18:42, modifié 1 fois.
ASM: Hello World sur PIC32MX
ASM: Hello World sur PIC32MX
ASM: Hello World sur PIC32MX
ASM: Hello World sur PIC32MX
- Gérard

Expert- Messages : 1937
- Âge : 67
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
F6FCO a écrit :Hello,
Il faudrait montrer çà à l'épouse de Gérard, il nous a dit qu'elle adorait voir clignoter une led de façon simple
Mais comment tu sais?
Tu connais ma moitié?
Je vois que toi aussi tu te moques : surtout n'arrête pas.
Retourner vers « Recueil de mini programmes »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

