像51一样操作STM32的IO(转)

源:像51一样操作STM32的IO

//-----------------------------------------------------------------------------------------------------
//别名区    ADDRESS=0x4200 0000 + (0x0001 100C*0x20) + (bitx*4) ;bitx:第x位
// 把“位段地址+位序号”转换别名地址宏
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
//把该地址转换成一个指针
#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 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 PA0   BIT_ADDR(GPIOA_ODR_Addr, 0)  //输出
#define PA1   BIT_ADDR(GPIOA_ODR_Addr, 1)  //输出
#define PA2   BIT_ADDR(GPIOA_ODR_Addr, 2)  //输出
#define PA3   BIT_ADDR(GPIOA_ODR_Addr, 3)  //输出
#define PA4   BIT_ADDR(GPIOA_ODR_Addr, 4)  //输出
#define PA5   BIT_ADDR(GPIOA_ODR_Addr, 5)  //输出
#define PA6   BIT_ADDR(GPIOA_ODR_Addr, 6)  //输出
#define PA7   BIT_ADDR(GPIOA_ODR_Addr, 7)  //输出
#define PA8   BIT_ADDR(GPIOA_ODR_Addr, 8)  //输出
#define PA9   BIT_ADDR(GPIOA_ODR_Addr, 9)  //输出
#define PA10  BIT_ADDR(GPIOA_ODR_Addr, 10) //输出
#define PA11  BIT_ADDR(GPIOA_ODR_Addr, 11) //输出
#define PA12  BIT_ADDR(GPIOA_ODR_Addr, 12) //输出
#define PA13  BIT_ADDR(GPIOA_ODR_Addr, 13) //输出
#define PA14  BIT_ADDR(GPIOA_ODR_Addr, 14) //输出
#define PA15  BIT_ADDR(GPIOA_ODR_Addr, 15) //输出


#define PA0in   BIT_ADDR(GPIOA_IDR_Addr, 0)  //输入
#define PA1in   BIT_ADDR(GPIOA_IDR_Addr, 1)  //输入
#define PA2in   BIT_ADDR(GPIOA_IDR_Addr, 2)  //输入
#define PA3in   BIT_ADDR(GPIOA_IDR_Addr, 3)  //输入
#define PA4in   BIT_ADDR(GPIOA_IDR_Addr, 4)  //输入
#define PA5in   BIT_ADDR(GPIOA_IDR_Addr, 5)  //输入
#define PA6in   BIT_ADDR(GPIOA_IDR_Addr, 6)  //输入
#define PA7in   BIT_ADDR(GPIOA_IDR_Addr, 7)  //输入
#define PA8in   BIT_ADDR(GPIOA_IDR_Addr, 8)  //输入
#define PA9in   BIT_ADDR(GPIOA_IDR_Addr, 9)  //输入
#define PA10in  BIT_ADDR(GPIOA_IDR_Addr, 10) //输入
#define PA11in  BIT_ADDR(GPIOA_IDR_Addr, 11) //输入
#define PA12in  BIT_ADDR(GPIOA_IDR_Addr, 12) //输入
#define PA13in  BIT_ADDR(GPIOA_IDR_Addr, 13) //输入
#define PA14in  BIT_ADDR(GPIOA_IDR_Addr, 14) //输入
#define PA15in  BIT_ADDR(GPIOA_IDR_Addr, 15) //输入


//-----------------------------------------------------
#define PB0   BIT_ADDR(GPIOB_ODR_Addr, 0)  //输出
#define PB1   BIT_ADDR(GPIOB_ODR_Addr, 1)  //输出
#define PB2   BIT_ADDR(GPIOB_ODR_Addr, 2)  //输出
#define PB3   BIT_ADDR(GPIOB_ODR_Addr, 3)  //输出
#define PB4   BIT_ADDR(GPIOB_ODR_Addr, 4)  //输出
#define PB5   BIT_ADDR(GPIOB_ODR_Addr, 5)  //输出
#define PB6   BIT_ADDR(GPIOB_ODR_Addr, 6)  //输出
#define PB7   BIT_ADDR(GPIOB_ODR_Addr, 7)  //输出
#define PB8   BIT_ADDR(GPIOB_ODR_Addr, 8)  //输出
#define PB9   BIT_ADDR(GPIOB_ODR_Addr, 9)  //输出
#define PB10  BIT_ADDR(GPIOB_ODR_Addr, 10) //输出
#define PB11  BIT_ADDR(GPIOB_ODR_Addr, 11) //输出
#define PB12  BIT_ADDR(GPIOB_ODR_Addr, 12) //输出
#define PB13  BIT_ADDR(GPIOB_ODR_Addr, 13) //输出
#define PB14  BIT_ADDR(GPIOB_ODR_Addr, 14) //输出
#define PB15  BIT_ADDR(GPIOB_ODR_Addr, 15) //输出


#define PB0in   BIT_ADDR(GPIOB_IDR_Addr, 0)  //输入
#define PB1in   BIT_ADDR(GPIOB_IDR_Addr, 1)  //输入
#define PB2in   BIT_ADDR(GPIOB_IDR_Addr, 2)  //输入
#define PB3in   BIT_ADDR(GPIOB_IDR_Addr, 3)  //输入
#define PB4in   BIT_ADDR(GPIOB_IDR_Addr, 4)  //输入
#define PB5in   BIT_ADDR(GPIOB_IDR_Addr, 5)  //输入
#define PB6in   BIT_ADDR(GPIOB_IDR_Addr, 6)  //输入
#define PB7in   BIT_ADDR(GPIOB_IDR_Addr, 7)  //输入
#define PB8in   BIT_ADDR(GPIOB_IDR_Addr, 8)  //输入
#define PB9in   BIT_ADDR(GPIOB_IDR_Addr, 9)  //输入
#define PB10in  BIT_ADDR(GPIOB_IDR_Addr, 10) //输入
#define PB11in  BIT_ADDR(GPIOB_IDR_Addr, 11) //输入
#define PB12in  BIT_ADDR(GPIOB_IDR_Addr, 12) //输入
#define PB13in  BIT_ADDR(GPIOB_IDR_Addr, 13) //输入
#define PB14in  BIT_ADDR(GPIOB_IDR_Addr, 14) //输入
#define PB15in  BIT_ADDR(GPIOB_IDR_Addr, 15) //输入
//----------------------------------------------------
#define PC0   BIT_ADDR(GPIOC_ODR_Addr, 0)  //输出
#define PC1   BIT_ADDR(GPIOC_ODR_Addr, 1)  //输出
#define PC2   BIT_ADDR(GPIOC_ODR_Addr, 2)  //输出
#define PC3   BIT_ADDR(GPIOC_ODR_Addr, 3)  //输出
#define PC4   BIT_ADDR(GPIOC_ODR_Addr, 4)  //输出
#define PC5   BIT_ADDR(GPIOC_ODR_Addr, 5)  //输出
#define PC6   BIT_ADDR(GPIOC_ODR_Addr, 6)  //输出
#define PC7   BIT_ADDR(GPIOC_ODR_Addr, 7)  //输出
#define PC8   BIT_ADDR(GPIOC_ODR_Addr, 8)  //输出
#define PC9   BIT_ADDR(GPIOC_ODR_Addr, 9)  //输出
#define PC10  BIT_ADDR(GPIOC_ODR_Addr, 10) //输出
#define PC11  BIT_ADDR(GPIOC_ODR_Addr, 11) //输出
#define PC12  BIT_ADDR(GPIOC_ODR_Addr, 12) //输出
#define PC13  BIT_ADDR(GPIOC_ODR_Addr, 13) //输出
#define PC14  BIT_ADDR(GPIOC_ODR_Addr, 14) //输出
#define PC15  BIT_ADDR(GPIOC_ODR_Addr, 15) //输出


#define PC0in   BIT_ADDR(GPIOC_IDR_Addr, 0)  //输入
#define PC1in   BIT_ADDR(GPIOC_IDR_Addr, 1)  //输入
#define PC2in   BIT_ADDR(GPIOC_IDR_Addr, 2)  //输入
#define PC3in   BIT_ADDR(GPIOC_IDR_Addr, 3)  //输入
#define PC4in   BIT_ADDR(GPIOC_IDR_Addr, 4)  //输入
#define PC5in   BIT_ADDR(GPIOC_IDR_Addr, 5)  //输入
#define PC6in   BIT_ADDR(GPIOC_IDR_Addr, 6)  //输入
#define PC7in   BIT_ADDR(GPIOC_IDR_Addr, 7)  //输入
#define PC8in   BIT_ADDR(GPIOC_IDR_Addr, 8)  //输入
#define PC9in   BIT_ADDR(GPIOC_IDR_Addr, 9)  //输入
#define PC10in  BIT_ADDR(GPIOC_IDR_Addr, 10) //输入
#define PC11in  BIT_ADDR(GPIOC_IDR_Addr, 11) //输入
#define PC12in  BIT_ADDR(GPIOC_IDR_Addr, 12) //输入
#define PC13in  BIT_ADDR(GPIOC_IDR_Addr, 13) //输入
#define PC14in  BIT_ADDR(GPIOC_IDR_Addr, 14) //输入
#define PC15in  BIT_ADDR(GPIOC_IDR_Addr, 15) //输入


//----------------------------------------------------
#define PD0   BIT_ADDR(GPIOD_ODR_Addr, 0)  //输出
#define PD1   BIT_ADDR(GPIOD_ODR_Addr, 1)  //输出
#define PD2   BIT_ADDR(GPIOD_ODR_Addr, 2)  //输出
#define PD3   BIT_ADDR(GPIOD_ODR_Addr, 3)  //输出
#define PD4   BIT_ADDR(GPIOD_ODR_Addr, 4)  //输出
#define PD5   BIT_ADDR(GPIOD_ODR_Addr, 5)  //输出
#define PD6   BIT_ADDR(GPIOD_ODR_Addr, 6)  //输出
#define PD7   BIT_ADDR(GPIOD_ODR_Addr, 7)  //输出
#define PD8   BIT_ADDR(GPIOD_ODR_Addr, 8)  //输出
#define PD9   BIT_ADDR(GPIOD_ODR_Addr, 9)  //输出
#define PD10  BIT_ADDR(GPIOD_ODR_Addr, 10) //输出
#define PD11  BIT_ADDR(GPIOD_ODR_Addr, 11) //输出
#define PD12  BIT_ADDR(GPIOD_ODR_Addr, 12) //输出
#define PD13  BIT_ADDR(GPIOD_ODR_Addr, 13) //输出
#define PD14  BIT_ADDR(GPIOD_ODR_Addr, 14) //输出
#define PD15  BIT_ADDR(GPIOD_ODR_Addr, 15) //输出


#define PD0in   BIT_ADDR(GPIOD_IDR_Addr, 0)  //输入
#define PD1in   BIT_ADDR(GPIOD_IDR_Addr, 1)  //输入
#define PD2in   BIT_ADDR(GPIOD_IDR_Addr, 2)  //输入
#define PD3in   BIT_ADDR(GPIOD_IDR_Addr, 3)  //输入
#define PD4in   BIT_ADDR(GPIOD_IDR_Addr, 4)  //输入
#define PD5in   BIT_ADDR(GPIOD_IDR_Addr, 5)  //输入
#define PD6in   BIT_ADDR(GPIOD_IDR_Addr, 6)  //输入
#define PD7in   BIT_ADDR(GPIOD_IDR_Addr, 7)  //输入
#define PD8in   BIT_ADDR(GPIOD_IDR_Addr, 8)  //输入
#define PD9in   BIT_ADDR(GPIOD_IDR_Addr, 9)  //输入
#define PD10in  BIT_ADDR(GPIOD_IDR_Addr, 10) //输入
#define PD11in  BIT_ADDR(GPIOD_IDR_Addr, 11) //输入
#define PD12in  BIT_ADDR(GPIOD_IDR_Addr, 12) //输入
#define PD13in  BIT_ADDR(GPIOD_IDR_Addr, 13) //输入
#define PD14in  BIT_ADDR(GPIOD_IDR_Addr, 14) //输入
#define PD15in  BIT_ADDR(GPIOD_IDR_Addr, 15) //输入


//----------------------------------------------------
#define PE0   BIT_ADDR(GPIOE_ODR_Addr, 0)  //输出
#define PE1   BIT_ADDR(GPIOE_ODR_Addr, 1)  //输出
#define PE2   BIT_ADDR(GPIOE_ODR_Addr, 2)  //输出
#define PE3   BIT_ADDR(GPIOE_ODR_Addr, 3)  //输出
#define PE4   BIT_ADDR(GPIOE_ODR_Addr, 4)  //输出
#define PE5   BIT_ADDR(GPIOE_ODR_Addr, 5)  //输出
#define PE6   BIT_ADDR(GPIOE_ODR_Addr, 6)  //输出
#define PE7   BIT_ADDR(GPIOE_ODR_Addr, 7)  //输出
#define PE8   BIT_ADDR(GPIOE_ODR_Addr, 8)  //输出
#define PE9   BIT_ADDR(GPIOE_ODR_Addr, 9)  //输出
#define PE10  BIT_ADDR(GPIOE_ODR_Addr, 10) //输出
#define PE11  BIT_ADDR(GPIOE_ODR_Addr, 11) //输出
#define PE12  BIT_ADDR(GPIOE_ODR_Addr, 12) //输出
#define PE13  BIT_ADDR(GPIOE_ODR_Addr, 13) //输出
#define PE14  BIT_ADDR(GPIOE_ODR_Addr, 14) //输出
#define PE15  BIT_ADDR(GPIOE_ODR_Addr, 15) //输出


#define PE0in   BIT_ADDR(GPIOE_IDR_Addr, 0)  //输入
#define PE1in   BIT_ADDR(GPIOE_IDR_Addr, 1)  //输入
#define PE2in   BIT_ADDR(GPIOE_IDR_Addr, 2)  //输入
#define PE3in   BIT_ADDR(GPIOE_IDR_Addr, 3)  //输入
#define PE4in   BIT_ADDR(GPIOE_IDR_Addr, 4)  //输入
#define PE5in   BIT_ADDR(GPIOE_IDR_Addr, 5)  //输入
#define PE6in   BIT_ADDR(GPIOE_IDR_Addr, 6)  //输入
#define PE7in   BIT_ADDR(GPIOE_IDR_Addr, 7)  //输入
#define PE8in   BIT_ADDR(GPIOE_IDR_Addr, 8)  //输入
#define PE9in   BIT_ADDR(GPIOE_IDR_Addr, 9)  //输入
#define PE10in  BIT_ADDR(GPIOE_IDR_Addr, 10) //输入
#define PE11in  BIT_ADDR(GPIOE_IDR_Addr, 11) //输入
#define PE12in  BIT_ADDR(GPIOE_IDR_Addr, 12) //输入
#define PE13in  BIT_ADDR(GPIOE_IDR_Addr, 13) //输入
#define PE14in  BIT_ADDR(GPIOE_IDR_Addr, 14) //输入
#define PE15in  BIT_ADDR(GPIOE_IDR_Addr, 15) //输入


 


//举例:


//输出


PA0=0;


PA1=1;


 


//输入


if(PB0==0)


   ;//检测到低电平

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于STM32IO模拟IIC的完整例程: 首先,需要在STM32的CubeMX中配置GPIO口,使其能够模拟IIC的时钟和数据线。具体方法如下: 1. 打开CubeMX软件,选择相应的芯片型号。 2. 在Pinout选项卡中,选择需要使用的GPIO引脚,右键单击进入Pinout Configuration。 3. 在Pinout Configuration中,将引脚的Mode设置为GPIO_Output,并将Type设置为Open-Drain。 4. 在Configuration选项卡中,选择I2C模块,将I2C的Mode设置为I2C GPIO模拟,并将SCL和SDA引脚分别设置为上一步中配置的GPIO引脚。 接下来,可以使用以下代码实现IO模拟IIC的读写操作: ``` #include "iic.h" #define IIC_SCL_PIN GPIO_PIN_8 #define IIC_SDA_PIN GPIO_PIN_9 #define IIC_SCL_LOW() HAL_GPIO_WritePin(GPIOB, IIC_SCL_PIN, GPIO_PIN_RESET) #define IIC_SCL_HIGH() HAL_GPIO_WritePin(GPIOB, IIC_SCL_PIN, GPIO_PIN_SET) #define IIC_SDA_LOW() HAL_GPIO_WritePin(GPIOB, IIC_SDA_PIN, GPIO_PIN_RESET) #define IIC_SDA_HIGH() HAL_GPIO_WritePin(GPIOB, IIC_SDA_PIN, GPIO_PIN_SET) #define IIC_SDA_READ() HAL_GPIO_ReadPin(GPIOB, IIC_SDA_PIN) void delay_us(uint32_t nus) { uint32_t ticks = nus * (SystemCoreClock / 1000000) / 5; while (ticks--) { __NOP(); } } void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = IIC_SCL_PIN | IIC_SDA_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); IIC_SCL_HIGH(); IIC_SDA_HIGH(); } void IIC_Start(void) { IIC_SDA_HIGH(); IIC_SCL_HIGH(); delay_us(5); IIC_SDA_LOW(); delay_us(5); IIC_SCL_LOW(); } void IIC_Stop(void) { IIC_SDA_LOW(); IIC_SCL_HIGH(); delay_us(5); IIC_SDA_HIGH(); delay_us(5); } uint8_t IIC_WriteByte(uint8_t data) { uint8_t i, res; for (i = 0; i < 8; i++) { if (data & 0x80) { IIC_SDA_HIGH(); } else { IIC_SDA_LOW(); } delay_us(5); IIC_SCL_HIGH(); delay_us(5); IIC_SCL_LOW(); data <<= 1; } IIC_SDA_HIGH(); delay_us(5); IIC_SCL_HIGH(); delay_us(5); res = IIC_SDA_READ(); IIC_SCL_LOW(); return res; } uint8_t IIC_ReadByte(uint8_t ack) { uint8_t i, res = 0; IIC_SDA_HIGH(); for (i = 0; i < 8; i++) { delay_us(5); IIC_SCL_HIGH(); res <<= 1; if (IIC_SDA_READ()) { res |= 0x01; } IIC_SCL_LOW(); } if (ack) { IIC_SDA_LOW(); } else { IIC_SDA_HIGH(); } delay_us(5); IIC_SCL_HIGH(); delay_us(5); IIC_SCL_LOW(); IIC_SDA_HIGH(); return res; } ``` 在以上代码中: - `IIC_Init()`函数用于初始化GPIO引脚。 - `IIC_Start()`函数用于发送起始信号。 - `IIC_Stop()`函数用于发送停止信号。 - `IIC_WriteByte()`函数用于向IIC总线写入一个字节的数据。 - `IIC_ReadByte()`函数用于从IIC总线读取一个字节的数据。 使用以上代码时,只需要在需要读写数据的地方调用相应的函数即可。例如: ``` IIC_Start(); // 发送起始信号 IIC_WriteByte(0x50); // 向IIC总线写入设备地址 IIC_WriteByte(0x00); // 向IIC总线写入寄存器地址 IIC_Start(); // 发送重复起始信号 IIC_WriteByte(0x51); // 向IIC总线写入设备地址(读模式) data = IIC_ReadByte(1); // 从IIC总线读取数据,并发送ACK IIC_Stop(); // 发送停止信号 ``` 以上代码实现了IO模拟IIC的读写操作。在实际使用时,还需要根据实际情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值