2635|2

1万

帖子

25

TA的资源

版主

楼主
 

【RPi PICO】用内联汇编实现触发器ADC采样和寄存器查看 [复制链接]

 

原帖:https://forum.micropython.org/viewtopic.php?t=9910&p=55444

 

查看硬件寄存器,并在adc0提供采样。它以给定的频率(最高 500.000 次/秒)将数据放入缓冲区

 

title= "inlineG.py" # http://docs.micropython.org/en/v1.9.3/pyboard/pyboard/tutorial/assembler.html
# by CWE
from rp2 import *
from machine import *
from time import *
import uarray

led= Pin(25,Pin.OUT)
#led(1)
#sleep(0.2)
#led(0)

adc0=ADC(0)

ledData = uarray.array('i',[
                0xd0000000 + 0x010, # 0 SIO OUT
                0xd0000000 + 0x018, # 4 SIO OUT_CLR
                0xd0000000 + 0x014, # 8 SIO OUT_SET
                1<<25 # 12 LED MASK
                ])


@micropython.asm_thumb
def regPeek(r0): # Address
    mov(r1,r0)
    ldr(r0,[r1,0])

@micropython.asm_thumb
def regPoke(r0, r1): # Address, Data
    str(r1,[r0,0])
    mov(r0,r1)
    
def regSet(adress, mask):
    regPoke(adress, regPeek(adress) | mask)


rGPIO26= 0x4001c000+0x6c # S. 312
regPoke( rGPIO26, 1<<7 ) # switch off ADC0 input and output

adcBuf = uarray.array('h',range(0,20)) # 320 signed short



adcCtrl = uarray.array('i',[
    0x4004c000, # BASE 0 CS, 4 Result, 8 FCS, 12 FIFO, 16 DIV S. 570
    1, # 4 Status: 0 done, 1 start
    len(adcBuf), # 8
    1, # 12 trig sign 1= positive
    2048 - 100, # 16 trigLevel
    2048 + 100 # 20 trigger level
    ])



@micropython.asm_thumb
def adcGet(r0, r1): # BufferAddress, Ctrl-Array

    b(Entry)
    #b(StartSample)
    
    label(GetAdc) # get one sample out of the fifo
    ldr(r2,[r1,0])
    ldrh(r2,[r2,10]) # read upper Half of FCS - something in the fifo?
    cmp(r2,0)
    bls(GetAdc)
    ldr(r2,[r1,0])
    ldr(r2,[r2,12]) # read FIFO
    bx(lr)
    
    label(Entry)
    mov(r4,r0) # BufferAdress
    ldr(r3,[r1,16]) # Trigger Level
    mov(r0,r3)

    #cpsid(1)
    bl(GetAdc) # empty fifo
    bl(GetAdc)
    bl(GetAdc)
    bl(GetAdc)
    bl(GetAdc)
    bl(GetAdc)
    
    label(WaitLow)
    bl(GetAdc)
    cmp(r2,r3)
    bgt(WaitLow)

    ldr(r3,[r1,20]) # Upper Trigger Level
    label(WaitHigh)
    bl(GetAdc)
    cmp(r3,r2)
    bgt(WaitHigh)
    
    label(StartSample)
    ldr(r3,[r1,8]) # Buffer Length
    label(GetNext)
    bl(GetAdc)
    strh(r2,[r4,0])
    add(r4,r4,2) # next address
    sub(r3,r3,1)
    cmp(r3,0)
    bhi(GetNext)
    
    #cpsie(1)
    label(End)




print(title)

adc0.read_u16() # set up the channel
maxSample= 48e6 # Hz
fSample= 250_000 # This is the sampling frequency!
div= int(maxSample/fSample)
print("Div:", div)
regPoke(0x4004c000 + 0x10, div<<8) # set DIV register
#print("Div:", "{0:b}".format(regPeek(0x4004c000 + 0x10)))

regSet(0x4004c000 + 0x08, 1) # set fifo enable
#print("CS:", "{0:b}".format(regPeek(0x4004c000 + 0x00)))

regSet(0x4004c000, 1<<3) # set startmany
#print("CS:", "{0:b}".format(regPeek(0x4004c000 + 0x00)))

#while True:
#print(adcGet(adcBuf, adcCtrl))
led(1)
adcGet(adcBuf, adcCtrl)
led(0)
for i in range(0,len(adcBuf)):
    print(adcBuf[i])
     

 

最新回复

又看到MOV指令了   详情 回复 发表于 2021-2-27 08:23
点赞 关注
 
 

回复
举报

128

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

高级!

 
 
 

回复

2万

帖子

340

TA的资源

版主

板凳
 

又看到MOV指令了

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表