Embedded 如何在stm32的GPIO MODER寄存器中定义位

Embedded 如何在stm32的GPIO MODER寄存器中定义位,embedded,stm32,Embedded,Stm32,我需要将端口D的引脚15定义为通用输出模式,为此我需要将引脚31,30设置为01。 GPIOD->MODER是我的寄存器 (1GPIOD->MODER=((GPIOD->MODER&~(1uLGPIOD->MODER=((GPIOD->MODER&~(1uL)如果您不想更改任何其他位,则需要先将它们归零,然后再进行设置 typedef enum { GPIO_MODER_INPUT = 0b00, GPIO_MODER_OUTPUT = 0b01, GPIO_MODER_

我需要将端口D的引脚15定义为通用输出模式,为此我需要将引脚31,30设置为01。 GPIOD->MODER是我的寄存器
(1
GPIOD->MODER=((GPIOD->MODER&~(1uL
GPIOD->MODER=((GPIOD->MODER&~(1uL)如果您不想更改任何其他位,则需要先将它们归零,然后再进行设置

typedef enum
{
    GPIO_MODER_INPUT = 0b00,
    GPIO_MODER_OUTPUT = 0b01,
    GPIO_MODER_ALTERNATE = 0b10,
    GPIO_MODER_ANALOG   = 0b11,
}GPIO_MODER;

void GPIO_SetMODER(GPIO_TypeDef *gpio, int pin, GPIO_MODER mode)
{
    uint32_t reg = gpio -> MODER;

    reg &= ~(0b11 << (pin * 2));
    reg |= (mode & 0b11) << (pin * 2);

    gpio -> MODER = reg;
}
typedef枚举
{
GPIO_MODER_输入=0b00,
GPIO_MODER_输出=0b01,
GPIO_MODER_ALTERNATE=0b10,
GPIO_MODER_模拟=0b11,
}GPIO_MODER;
无效GPIO_设置模式(GPIO_类型定义*GPIO,int引脚,GPIO_模式)
{
uint32\u t reg=gpio->MODER;

reg&=~(0b11如果您不想更改任何其他位,则需要先将其归零,然后再进行设置

typedef enum
{
    GPIO_MODER_INPUT = 0b00,
    GPIO_MODER_OUTPUT = 0b01,
    GPIO_MODER_ALTERNATE = 0b10,
    GPIO_MODER_ANALOG   = 0b11,
}GPIO_MODER;

void GPIO_SetMODER(GPIO_TypeDef *gpio, int pin, GPIO_MODER mode)
{
    uint32_t reg = gpio -> MODER;

    reg &= ~(0b11 << (pin * 2));
    reg |= (mode & 0b11) << (pin * 2);

    gpio -> MODER = reg;
}
typedef枚举
{
GPIO_MODER_输入=0b00,
GPIO_MODER_输出=0b01,
GPIO_MODER_ALTERNATE=0b10,
GPIO_MODER_模拟=0b11,
}GPIO_MODER;
无效GPIO_设置模式(GPIO_类型定义*GPIO,int引脚,GPIO_模式)
{
uint32\u t reg=gpio->MODER;

reg&=~(0b11请不要使用
(1你好,科林,我在哪里可以找到位域及其含义?同时我们在第30位1上设置了它。所以GPIO->MODER |=0B01000000,0…00用于在MODER中设置1,我们需要重置第31位,所以GPIO->MODER&=~(0B10000000,0…00)有没有一种更简单的方法,可以把一个普通的二进制数b2b1b0放到我们想要的任何位置,而不看b2b1b0是什么?Thanks@Lundin他正在使用CMIS。他不需要。他需要学习位运算only@ron398您可能会在从中获取
GPIOD
的相同标题中找到它们,搜索
>GPIO_MODER
请不要使用
(你好,科林,我在哪里可以找到位字段及其含义?同时,我们在第30位1上设置了它。所以GPIO->MODER |=0B01000000,0…00用于在MODER中设置1,我们需要重置第31位,所以GPIO->MODER&=~(0B10000000,0…00)有没有一种更简单的方法,可以把一个普通的二进制数b2b1b0放到我们想要的任何位置,而不看b2b1b0是什么?Thanks@Lundin他正在使用CMIS。他不需要。他需要学习位运算only@ron398您可能会在从中获取
GPIOD
的相同标题中找到它们,搜索
>GPIO_MODER
你没有阅读问题的第一行。它清楚地写着“成为01”,这正是这一行所做的。位31设置为零,位30设置为1。没有理由先清除要设置的位。改天他会问如何设置另一位。然后呢?虽然这段代码可能提供了一个问题的解决方案,但最好添加上下文,说明它为什么/如何工作。这可以帮助未来的用户学习n并将这些知识应用到他们自己的代码中。当代码被解释时,你也可能得到用户的积极反馈/赞成票。这使得人们不能接受发表粗鲁和事实上不真实的评论。0_uu_u_u你需要道歉并删除你的攻击性评论,说我的答案在完整和正确的情况下是不正确的对所问问题的正确回答。(它只是没有包含任何未要求的额外细节。)你没有阅读问题的第一行。它清楚地说“to be 01”,这正是这一行所做的。位31设置为零,位30设置为1。没有理由先清除要设置的位。改天他会问如何设置另一位。然后呢?虽然这段代码可能提供了一个问题的解决方案,但最好添加上下文,说明它为什么/如何工作。这可以帮助未来的用户学习n并将这些知识应用到他们自己的代码中。当代码被解释时,你也可能得到用户的积极反馈/赞成票。这使得人们不能接受发表粗鲁和事实上不真实的评论。0_uu_u_u你需要道歉并删除你的攻击性评论,说我的答案在完整和正确的情况下是不正确的对所问问题的直接回答。(它只是不包含任何未要求的额外细节。)