首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Raspberry PI Pico RP2040上乞讨C语言的低级编程

在Raspberry PI Pico RP2040上乞讨C语言的低级编程
EN

Stack Overflow用户
提问于 2021-09-22 22:13:15
回答 3查看 752关注 0票数 0

我想变矮。昨天我有一个Pico,昨天晚上我做了一个眨眼(从Raspberry站点)通过Linux在mi Pico上工作,然后我让它工作起来。

现在,我想要在低级编程(寄存器和所有这些)中使用myblk.c,这是一个眨眼器。但我上一次做低级编程是在5年前的一个MSP430上,我已经不记得基本的东西了。有人能帮帮我吗?抱歉的。我如何使这个低水平的编程在C编译一个uf2文件,这使我的覆盆子皮闪烁他的LED,这是在25针?它编译,但是Pico什么也不做。显然,这个代码是不正确的,我可以修改什么来使它工作呢?谢谢。

下面是mybrak.c和CMakeLists.txt:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

#define SIO_BASE        0xd0000000
#define GPIO_IN         0xd0000004
#define GPIO_HI_IN      0xd0000008
#define GPIO_OUT        0xd0000010
#define GPIO_OUT_SET    0xd0000014
#define GPIO_OUT_CLR    0xd0000018
#define GPIO_OUT_XOR    0xd000001c
#define GPIO_OE         0xd0000020
#define GPIO_OE_SET     0xd0000024
#define GPIO_OE_CLR     0xd0000028
#define GPIO_OE_XOR     0xd000002c
#define GPIO_HI_OUT     0xd0000030

typedef unsigned int uint;

void write32(uint dst, uint val){
    uint dst_u = (uint)dst;
    dst_u = val;  
    return;
}

uint read32(uint src){
    uint src_u = (uint)src;
    return src;
}

int main(){
    uint gpoes = read32(GPIO_OE);
    gpoes |= (1<<25);
    write32(GPIO_OE, gpoes);

    //int i=0;

    while(1){
        //turn on pin 0
        write32(GPIO_OUT, 1<<25);
        //delay
        //while (i < 0x80000){
        //    i++;    
        //}
        //turn off pin 0
        //write32(GPIO_OUT_CLR, 1<<25);
        //delay
        //while (i < 0x80000){
        //    i++;    
        //}
    }        
}
代码语言:javascript
复制
cmake_minimum_required(VERSION 3.12)

# PUll in PICO SDK (must be before project)
include(pico_sdk_import.cmake)

project(myblink C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})

# Initialize the SDK
pico_sdk_init()

add_executable(myblink
    myblink.c
    )

# Pull in our pico_stdlib which pulls in common
target_link_libraries(myblink pico_stdlib)

# create map/bin/hex file etc.
pico_add_extra_outputs(myblink)
EN

回答 3

Stack Overflow用户

发布于 2021-11-27 16:42:41

下面是它在汇编程序中的执行方式:

代码语言:javascript
复制
void write32(uint dst, uint val){
    uint dst_u = (uint)dst; //a register gets the value from stack pop (dst) 
    dst_u = val; // that same register gets overwritten from stack pop (val)
    return; // ret and nothing was achieved by this function
}

如果这个函数的目的是用val更改GPIO_OUT所指向的位置的值,那么您必须通过引用传递它:

代码语言:javascript
复制
void write32(uint &dst, uint val){
    dst = val;
}
票数 1
EN

Stack Overflow用户

发布于 2021-09-23 08:50:20

我没有使用这个特定的目标,但是通常情况下,如果您没有预定义的寄存器映射,并且所有这些寄存器都已经定义好了,那么您可以按照以下建议定义它们:如何从固件访问硬件寄存器?

然后,我们可以这样修复您的代码:

代码语言:javascript
复制
// #include <stdio.h> avoid stdio.h on microcontrollers
#include <stdint.h>

#define SIO_BASE (*(volatile uint32_t*)0xd0000000u)
// ... and so on

// typedef unsigned int uint; get rid of home-made garage standard types

// replace "magic numbers" with meaningful names, "PORTX_PIN25" or whatever it might be called in hw
#define MEANINGFUL_NAME_HERE (1u << 25) 

int main(){
    GPIO_OE |= MEANINGFUL_NAME_HERE;

    while(1){
        GPIO_OUT |= MEANINGFUL_NAME_HERE;

        // write an actually working busy-delay loop by including volatile:
        for(volatile int i=0; i<0x80000; i++)
        {}

        GPIO_OUT_CLR |= MEANINGFUL_NAME_HERE;
        // I'm assuming GPIO_OUT &= ~MEANINGFUL_NAME_HERE; would work too

        for(volatile int i=0; i<0x80000; i++)
        {}
    }        
}

也许您也可以稍微切换一下:GPIO_OUT_CLR ^= ... (按位XOR)。那你只需要一个延迟循环。

票数 0
EN

Stack Overflow用户

发布于 2021-09-22 22:45:18

尝试纠正您的读写功能。

下面是读取函数的样子:

代码语言:javascript
复制
uint read32(addr){
    uint* base = (uint*)addr;
    uint value = *base;
    return value; }

以下是写函数应该是什么样子:

代码语言:javascript
复制
void write32(void *dst, uint val){
    uint* dst_u = (uint*)dst;
    *dst_u = val;
    return;
}

毕竟,我对Rpi pico不太了解,但这似乎是您代码中的一个问题。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69291863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档