野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 323|回复: 5

位带操作问题-用的STM32-F103的板子,求大佬指导

[复制链接]
发表于 2023-11-8 23:08:00 | 显示全部楼层 |阅读模式
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"


#define GPIOB_ODR_addr  (GPIOB_BASE + 0x0C)
#define PBout(n)        *(unsigned int *)((GPIOB_ODR_addr & 0xF0000000)+0x02000000+((GPIOB_ODR_addr & 0x00FFFFFF)<<5)+(n<<2))

#define GPIOA_IDR_addr  (GPIOA_BASE + 0x08)
#define PAin(n)         *(unsigned int *)((GPIOA_IDR_addr & 0xF0000000)+0x02000000+((GPIOA_IDR_addr & 0x00FFFFFF)<<5)+(n<<2))

#define GPIOC_IDR_addr  (GPIOC_BASE + 0x08)
#define PCin(n)         *(unsigned int *)((GPIOC_IDR_addr & 0xF0000000)+0x02000000+((GPIOC_IDR_addr & 0x00FFFFFF)<<5)+(n<<2))

void Delay(uint32_t zhi)
{
        for(; zhi != 0 ; zhi--);
}

int main(void)
{

        LED_GPIO_Config_G();
        KEY_GPIO_Config();
        KEY1_GPIO_Config();
        LED_G(ON);
#if 0
        while(1)
{
                PBout(0) = 1;
                //LED_G(OFF);
                Delay(0xfffff);
          PBout(0) = 0;
                //LED_G(ON);
                Delay(0xfffff);
}

#else
while(1)
{

        if(PAin(0) == KEY_ON)
        {
                while(PAin(0) == KEY_ON);
                LED_G_TOGGLE;
                //LED_G(OFF);
        }
if(PCin(13) == KEY_ON)
        {
                while(PCin(13) == KEY_ON);
                LED_G_TOGGLE;
                //LED_G(ON);
        }

}

#endif
}

回复

使用道具 举报

 楼主| 发表于 2023-11-8 23:10:13 | 显示全部楼层
PBout(0) 控制输出没有问题,就是输入的问题,调试了一下,if语句执行了,进入while后就调不出来了,怎么按按钮都没有用
回复 支持 反对

使用道具 举报

发表于 2023-11-10 16:27:24 | 显示全部楼层
IO对应的时钟初始化了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-11 14:43:53 | 显示全部楼层
初始化了,我用固件库方式读取IDR就可以,用这个就不行
回复 支持 反对

使用道具 举报

发表于 2023-11-13 10:49:05 | 显示全部楼层
本帖最后由 Nalimca 于 2023-11-13 10:50 编辑

举例,你这个PBout(n) = 1,定义的寄存器地址是对的吗,正确应该是 *(volatile unsigned int*)(0x4001 0C0C)  |= (1 << n); PBout(n) = 0,对应操作等同*(volatile unsigned int*)(0x4001 0C0C) &= ~(1 << n);
我不理解为什么你的n<<2?.寄存器的详细描述我也截图给你了.

我建议在断点模式下,看一下你操作寄存器,与固件库操作寄存器,同一个寄存器,你们操作完后数值是一样的吗?

野火论坛202311131034462519..png
野火论坛202311131045479005..png
回复 支持 反对

使用道具 举报

发表于 2023-11-13 11:05:26 | 显示全部楼层
本帖最后由 Nalimca 于 2023-11-13 11:07 编辑

再补充一下读取的话操作以GPIOA为例 a =  (*(volatile unsigned int*)(0x0x4001 0800 + 0x08) & (1 << n)) >> n;

n取决与你的IO编号

野火论坛202311131105192791..png
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-27 13:53 , Processed in 0.113247 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表