STM位带操作
  pbfHt7yP3Hym 2023年11月02日 62 0

主要是看公式:

外设: ((uint32_t) (0x42000000+(外设寄存器地址ODR/IDR-)*8*4+n*4)

外设寄存器地址可参考手册地址和偏移位

srom:((uint32_t) (0x22000000+(外设寄存器地址ODR/IDR)*8*4+n*4)

综合:

AliasAddr = ((A & 0xF0000000)+0x02000000+((A &0x00FFFFFF)<<5)+(n<<2))


A:外设寄存器地址

n:想要操作的位号


设计代码:参考野火的代码

//#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))  

//// 把位带别名区地址转换成指针

//#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))  //#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C    

//#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C    

//#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C    

//#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C    

//#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C    

//#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C      

//#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C      

//  

//#define GPIOA_IDR_Addr    (GPIOA_BASE+8)  //0x40010808    

//#define GPIOB_IDR_Addr    (GPIOB_BASE+8)  //0x40010C08    

//#define GPIOC_IDR_Addr    (GPIOC_BASE+8)  //0x40011008    

//#define GPIOD_IDR_Addr    (GPIOD_BASE+8)  //0x40011408    

//#define GPIOE_IDR_Addr    (GPIOE_BASE+8)  //0x40011808    

//#define GPIOF_IDR_Addr    (GPIOF_BASE+8)  //0x40011A08    

//#define GPIOG_IDR_Addr    (GPIOG_BASE+8)  //0x40011E08  



//// 单独操作 GPIO的某一个IO口,n(0,1,2...16),n表示具体是哪一个IO口

//#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出    

//#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入    

//  

//#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出    

//#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入    

//  

//#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出    

//#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入    

//  

//#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出    

//#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入    

//  

//#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出    

//#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入  

//  

//#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出    

//#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入  

//  

//#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出    

//#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

大概就是按公式填地址

使用:

PBout(0)=1;
	PBout(1)=1;
	PBout(5)=1;

也可以用赋值,但会报警告,不影响使用

int main(void)

{

u8 a=99;

 GPIO_InitTypeDef RGB_GPIO_InitStruct; //GPIO结构体名称


 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟

   RGB_GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP;//GPIO模式选择  

   RGB_GPIO_InitStruct.GPIO_Pin|= GPIO_Pin_0; //GPIO引脚选择可用|运算符同时选择多个,但为了灯的选择分开了。  

   RGB_GPIO_InitStruct.GPIO_Pin|= GPIO_Pin_1;

   RGB_GPIO_InitStruct.GPIO_Pin|= GPIO_Pin_5;

 RGB_GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

   GPIO_Init(GPIOB, &RGB_GPIO_InitStruct);//gpio初始化完成

 PBout(0)=1;

 PBout(1)=1;

 PBout(5)=1;

while(1)

{

if(PBout(5)=a);//if原则非0及真

}

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  UYSNSBVoGd8R   2023年12月08日   26   0   0 引脚#include#define
pbfHt7yP3Hym