C ARM编程

C ARM编程,c,arm,C,Arm,关于使用C语言编写ARM编程的寄存器,我有两个问题 第一:我正试图写入应用程序中断和复位控制寄存器或空转器。这是一个32位寄存器。我需要在16位到31位写入两个0x5FA值(需要寄存器)。我还需要修改一些其他的位,但很奇怪。我的意思是,只按位(0或1)。我知道当它只是一点点的时候该怎么做。使用*iser0 |=0UL为了清除变量的单个位,您不使用*寄存器|=0int32_t是由stdint.h定义的,您的typedef要么是冗余的,要么是非法的,要么执行返回0在main的末尾,或者在C99模式下

关于使用C语言编写ARM编程的寄存器,我有两个问题


第一:我正试图写入应用程序中断和复位控制寄存器或空转器。这是一个32位寄存器。我需要在16位到31位写入两个0x5FA值(需要寄存器)。我还需要修改一些其他的位,但很奇怪。我的意思是,只按位(0或1)。我知道当它只是一点点的时候该怎么做。使用
*iser0 |=0UL为了清除变量的单个位,您不使用
*寄存器|=0
int32_t
是由
stdint.h
定义的,您的typedef要么是冗余的,要么是非法的,要么执行
返回0在main的末尾,或者在C99模式下编译,我想知道您正在执行类似于
*iser0 |=0UL的操作的情况通常情况下,
C
main()
函数的最小签名是
intmain(void){…return 0;}
,或者更常见的
intmain(intargc,char*argv[]){…return 0}
设置一个位:
*寄存器|=1我在另一个程序中做的,我只需要修改几个位,在任何寄存器中不超过一位。同样,返回值是322225477,我的程序需要10秒才能终止,尽管它只有20-30行。有没有可能是因为我没有将Micro连接到PC?因为现在我没有权限访问我的micro,我只是在编码。顺便问一下,当你制作结构时,为什么有些uing32没有名字?我从未遇到过这种情况。我不熟悉微控制器编程。我是否可以阅读任何文档来理解这些结构以及它们与位操作的关系?在此之前,我只能使用structs来模拟面向对象的编程不,按位运算符是正确的方法。无论出于何种目的,使用位字段总是错误的,因为它们在C语言中的定义非常糟糕。@user694733 oops,typo^^^我在代码中没有看到
volatile
的任何用法,读/写寄存器时应使用它-请参阅和此。
#include <stdint.h>

typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;

int main()
{
    //Multi drive register
    uint32_t* muer=(uint32_t*) 0x400E0E50UL;
    *muer |= 1UL << 8;

    uint32_t* mudr=(uint32_t*) 0x400E0E54UL;
    *mudr |= 0UL << 8;

    //Pio controller register
    uint32_t* per=(uint32_t*) 0x400E0E00UL;
    *per |= 1UL << 8;

    uint32_t* pdr=(uint32_t*) 0x400E0E04UL;
    *pdr |= 0UL << 8;

    //output register
    uint32_t* oer=(uint32_t*) 0x400E0E10UL;
    *oer |= 0UL << 8;

    uint32_t* odr=(uint32_t*) 0x400E0E14UL;
    *odr |= 1UL << 8;

    //edge select
    uint32_t* esr=(uint32_t*) 0x400E0EC0;
    *esr |= 1UL << 8;

    //level select
    uint32_t* lsr=(uint32_t*) 0x400E0EC4;
    *lsr |= 0UL << 8;

    //Rising edge
    uint32_t* rehlsr=(uint32_t*) 0x400E0ED4;
    *rehlsr |= 1UL << 8;

    //Falling edge edge
    uint32_t* fellsr=(uint32_t*) 0x400E0ED8;
    *fellsr |= 0UL << 8;

    //Interrupt set-enable register
    uint32_t* iser0=(uint32_t*) 0xE000E100;
    *iser0 |= 1UL << 11;

    //Interrupt clear-enable register
    uint32_t* icer0=(uint32_t*) 0xE000E180;
    *icer0 |= 0UL << 11;

    //AIRCR
    uint32_t* aircr=(uint32_t*) 0xFA050000;

    //VECTKEY
    *aircr |= 0x5FA << 16;

    //ENDIANESS
    *iser0 |= 0UL << 15;

    //PRIGRIOUP
    *iser0 |= 5UL << 8;

    //SYSRESETREQ
    *iser0 |= 0UL << 2;

    //VECTCLRACTIVE
    *iser0 |= 0UL << 1;

    //SYSRESETREQ
    *iser0 |= 0UL;
}
#include<stdint.h>


int main()
{

//Pull up register
volatile uint32_t* puer=(uint32_t*) 0x400E0E64UL;
*puer &= 1 << 8;


volatile uint32_t* pudr=(uint32_t*) 0x400E0E60UL;
*pudr |= 1UL << 8;


//Multi drive register
volatile uint32_t* muer=(uint32_t*) 0x400E0E50UL;
*muer &= 1 << 8;

volatile uint32_t* mudr=(uint32_t*) 0x400E0E54UL;
*mudr |= 1UL << 8;

//Pio controller register
volatile uint32_t* per=(uint32_t*) 0x400E0E00UL;
*per |= 1UL << 8;

volatile uint32_t* pdr=(uint32_t*) 0x400E0E04UL;
*pdr &= 1 << 8;


//ABSR register
volatile uint32_t* absr=(uint32_t*) 0x400E0E70UL;
*absr &= 1 << 8;

//output register
volatile uint32_t* oer=(uint32_t*) 0x400E0E10UL;
*oer |= 1UL << 8;

volatile uint32_t* odr=(uint32_t*) 0x400E0E14UL;
*odr &= 1 << 8;

}
*register &= 0x7 << 4
*register |= (value & 0x7) << 4;
union
{
    struct
    {
        uint32_t vectreset     :1;
        uint32_t vectclractive :1;
        uint32_t sysresetreq   :1;
        uint32_t               :5;
        uint32_t prigroup      :3;
        uint32_t               :4;
        uint32_t endianness    :1;
        uint32_t vectkey       :0;
    };
    uint32_t u32;
} *aircr = (void*)0xFA050000;