像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)
   ;//检测到低电平

时间: 2024-10-09 23:35:04

像51一样操作STM32的IO的相关文章

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

源:像51一样操作STM32的IO //----------------------------------------------------------------------------------------------------- //别名区 ADDRESS=0x4200 0000 + (0x0001 100C*0x20) + (bitx*4) ;bitx:第x位 // 把“位段地址+位序号”转换别名地址宏 #define BITBAND(addr, bitnum) ((addr &

将GY-302感光模块从51移植到stm32

这个感光模块主要就是用i2c通信,移植的时候其实就是改一下延时,把端口的模式设置正确就行了 为了尽量减少工作量,我尽量多用宏定义定义,少修改代码,对于延时函数,可以用define 把它替换成stm32里的延时函数 对于变量,注意在stm32里int是四个字节,而51是两个字节,再者就是很关键的一点,51里有bit变量,可以位寻址  而stm32却没有,而且也没有sbit,对于前者,我就直接把它变成uchar,而后者是有解决办法的,就是位带操作. 位带操作就是,设定了一块特殊的地方,映射到其他地址

STM32的IO口

STM32 的 IO 口 可以由软件配置成如下 8 种模式: 1.输入浮空 2.输入上拉 3.输入下拉 4.模拟输入 5.开漏输出 6.推挽输出 7.推挽式复用功能 8.开漏复用功能 每个 IO 口可以自由编程,但 IO 口寄存器必须要按 32 位字被访问.STM32 的很多 IO 口都是 5V 兼容的,这些 IO 口在与 5V 电平的外设连接的时候很有优势,具体哪些 IO 口是 5V 兼容的,可以从该芯片的数据手册管脚描述章节查到(I/O Level 标 FT 的就是 5V 电平兼容的). S

STM32的IO口的8种配置

STM32的IO口的8种配置 1 STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出) ① 浮空输入_IN_FLOATING ② 带上拉输入_IPU ③ 带下拉输入_IPD ④ 模拟输入_AIN ⑤ 开漏输出_OUT_OD ⑥ 推挽输出_OUT_PP ⑦ 复用功能的推挽输出_AF_PP ⑧ 复用功能的开漏输出_AF_OD 1.1 I/O口的输出模式下,有3种输出速度可选(2MHz.10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信

标准文件IO详解(一)---文件IO操作和标准文件IO操作的区别

POSIX IO操作称为文件IO,也称为低级文件IO,是操作系统提供的系统调用,属于没有缓冲区的文件操作方式.执行该种操作后,内容会直接被写入到内核中的提供给磁盘的专门缓冲区中,内核会定期的刷新该缓冲区,将内容同步到磁盘当中. ANSI  C IO操作称为标准文件IO,也称为高级文件IO,是C库函数提供的,属于带有缓冲区的文件操作方式.执行该种操作后,内容首先会将内容写入到用户空间的缓冲区中,待缓冲区满或者需要刷新的时候再去调用文件IO,将内容写入到内核的磁盘缓冲区当中. 相比于低级文件IO,高

FPGA配置芯片EPCS读写操作--STM32读写

注意事项: (1)首先STM32需要设置nCE和nConfig信号,即nCE置高,nConfig拉低,获得EPCS的控制权,而后对EPCS操作,操作完成后需要释放这两个管脚,即nCE拉低,nConfig置高. (2)EPCS的极性为:sck为空闲状态为高电平,采样边沿为SCK的第二个跳变沿,(即上升沿,注意前提是SCK空闲为高) SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_Da

STM32中IO口的8中工作模式

该文摘自:http://blog.csdn.net/kevinhg/article/details/17490273 一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定.         推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小.效率高.输出既可以向负载灌电流,也

Linux设备驱动第七篇:高级字符驱动操作之阻塞IO

我们之前介绍过简单的read,write操作,那么会有一个问题:当驱动无法立即响应请求该怎么办?比如一个进程调用read读取数据,当没有数据可读时该怎么办,是立即返回还是等到有数据的时候:另一种情况是进程调用write向设备写数据,如果缓冲区满了或者设备正忙的时候怎么办,是立即返回还是继续等待直到设备可写?这种情况下,一般的缺省做法是使进程睡眠直到请求可以满足为止.本篇就介绍遇到这类问题驱动的处理方法. 睡眠 什么是睡眠?一个进程睡眠意味着它暂时放弃了CPU的运行权,直到某个条件发生后才可再次被

关于stm32的IO口的封装

前言:STM32的PA,PB各有16脚,用不上那么多,该怎样处理呢? 注:unchar 是 unsigned char 关于输出同时操作8位 1 //***************************************************************/ 2 #define part_a_o PBout(0)// */ 3 #define part_b_o PBout(1)// */ 4 #define part_c_o PBout(2)// */ 5 #define p