我想变矮。昨天我有一个Pico,昨天晚上我做了一个眨眼(从Raspberry站点)通过Linux在mi Pico上工作,然后我让它工作起来。
现在,我想要在低级编程(寄存器和所有这些)中使用myblk.c,这是一个眨眼器。但我上一次做低级编程是在5年前的一个MSP430上,我已经不记得基本的东西了。有人能帮帮我吗?抱歉的。我如何使这个低水平的编程在C编译一个uf2文件,这使我的覆盆子皮闪烁他的LED,这是在25针?它编译,但是Pico什么也不做。显然,这个代码是不正确的,我可以修改什么来使它工作呢?谢谢。
下面是mybrak.c和CMakeLists.txt:
#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++;
//}
}
}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)发布于 2021-11-27 16:42:41
下面是它在汇编程序中的执行方式:
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所指向的位置的值,那么您必须通过引用传递它:
void write32(uint &dst, uint val){
dst = val;
}发布于 2021-09-23 08:50:20
我没有使用这个特定的目标,但是通常情况下,如果您没有预定义的寄存器映射,并且所有这些寄存器都已经定义好了,那么您可以按照以下建议定义它们:如何从固件访问硬件寄存器?。
然后,我们可以这样修复您的代码:
// #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)。那你只需要一个延迟循环。
发布于 2021-09-22 22:45:18
尝试纠正您的读写功能。
下面是读取函数的样子:
uint read32(addr){
uint* base = (uint*)addr;
uint value = *base;
return value; }以下是写函数应该是什么样子:
void write32(void *dst, uint val){
uint* dst_u = (uint*)dst;
*dst_u = val;
return;
}毕竟,我对Rpi pico不太了解,但这似乎是您代码中的一个问题。
https://stackoverflow.com/questions/69291863
复制相似问题