stm32 相关资料
stm32 相关资料
=======================================================
0. Cortex-M3里,对于GPIO的配置种类有8种之多
http://blog.csdn.net/kevinhg/article/details/17490273
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出
自家链接: http://www.cnblogs.com/TS-qrt/articles/linux_output.html
1. 寄存器端口结构 PortX
typedef struct { __IO uint32_t CRL; __IO uint32_t CRH; __IO uint32_t IDR; __IO uint32_t ODR; __IO uint32_t BSRR; __IO uint32_t BRR; __IO uint32_t LCKR; } GPIO_TypeDef;
说明:
GPIO_TypeDef 这段代码,这个代码用 typedef 关键字声明了名为 GPIO_TypeDef 的结构体类型,结构体内又定义了 7 个 __IO uint32_t 类型的变量。这些变量每个都为 32 位,也就是每个变量占内存空间 4 个字节。在 c 语言中,结构体内变量的存储空间是连续的,也就是说假如我们定义了一个 GPIO_TypeDef ,这个结构体的首地址(变量 CRL 的地址)若为 0x4001 1000, 那么结构体中第二个变量(CRH)的地址即为 0x4001 1000 +0x04 ,加上的这个 0x04 ,正是代表 4 个字节地址的偏移
2. 各个寄存器端口对应的使能时钟(盗图一张)

ps: STM32参考资料\STM32中文参考手册_V10.pdf
3. 各个寄存器,偏移,复位,访问等信息
时钟控制寄存器(RCC_CR) 偏移地址: 0x00 复位值: 0x000 XX83,X代表未定义 访问: 无等待状态, 字, 半字 和字节访问 时钟配置寄存器(RCC_CFGR) 偏移地址: 0x04 复位值: 0x0000 0000 访问: 0到2个等待周期,字,半字和字节访问 只有当访问发生在时钟切换时,才会插入1或2个等待周期。 时钟中断寄存器(RCC_CIR) 偏移地址: 0x08 复位值: 0x0000 0000 访问:无等待周期, 字, 半字 和字节访问 APB2外设复位寄存器(RCC_APB2RSTR) 偏移地址: 0x0C 复位值: 0x0000 0000 访问:无等待周期, 字, 半字 和字节访问 APB1外设复位寄存器(RCC_APB1RSTR) 偏移地址:0x10 复位值:0x0000 0000 访问:无等待周期,字, 半字和字节访问 AHB外设时钟使能寄存器(RCC_AHBENR) 偏移地址:0x14 复位值:0x0000 0014 访问:无等待周期, 字, 半字 和字节访问 APB2外设时钟使能寄存器(RCC_APB2ENR) 偏移地址:0x18 复位值:0x0000 0000 访问:字,半字和字节访问 通常无访问等待周期。 但在APB2总线上的外设被访问时,将插入等待状态直到APB2的外设访问结束。 APB1外设时钟使能寄存器(RCC_APB1ENR) 偏移地址:0x1C 复位值:0x0000 0000 访问:字、半字和字节访问 通常无访问等待周期。 但在APB1总线上的外设被访问时,将插入等待状态直到APB1外设访问结束 备份域控制寄存器(RCC_BDCR) 偏移地址:0x20 复位值:0x0000 0000,只能由备份域复位有效复位 访问:0到3等待周期,字、半字和字节访问 当连续对该寄存器进行访问时,将插入等待状态。 控制/状态寄存器(RCC_CSR) 偏移地址:0x24 复位值:0x0C00 0000,除复位标志外由系统复位清除,复位标志只能由电源复位清除。 访问:0到3等待周期,字、半字和字节访问 当连续对该寄存器进行访问时,将插入等待状态。 AHB外设时钟复位寄存器(RCC_AHBRSTR) 偏移地址:0x28 复位值:0x0000 0000 访问:无等待周期,字、半字和字节访问 时钟配置寄存器2(RCC_CFGR2) 偏移地址:0x2C 复位值:0x0000 0000 访问:无等待周期,字、半字和字节访问 AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接,作为SoC的片上系统总线,它包括以下一些特性:单个时钟边沿操作;非三态的实现方式;支持突发传输;支持分段传输;支持多个主控制器;可配置32位~128位总线宽度;支持字节、半字和字的传输 。AHB 系统由主模块、从模块和基础结构 (Infrastructure)3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。基础结构则由仲裁器(arbiter)、主模块到从模块的多路器、从模块到主模块的多路器、译码器(decoder)、虚拟从模块(dummy Slave)、虚拟主模块(dummy Master)所组成。 其互连结构如图1所示。针对Soc设计中IP复用问题提出了一种新的解决办法。 传统的方法是将特定功能模块的非标准接口标准化为AHB主/从设备接口。本文提出了一种新的基于ARM的Soc通用平台设计寄存器总线标准接口,这种设计使整个系统的结构清晰,增强系统的通用性与系统中功能模块的可移植性。 APB主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。其特性包括:两个时钟周期传输;无需等待周期和回应信号;控制逻辑简单,只有四个控制信号。
4. PortX Pin脚设置
1. 端口配置低寄存器

2. 端口配置高寄存器

5. stm32 的ODR,BSRR,BRR
stm32 的ODR,BSRR,BRR 直接来控制引脚输出状态
1. ODR: 可读可写:既能控制管脚为高电平,也能控制管脚为低电平。 1 gpio 管脚为高电平 0 gpio 管脚为低电平 2 BSRR 只写:既能控制管脚为高电平,也能控制管脚为低电平 对寄存器高 16bit 写1 对应管脚为低电平, 对寄存器低 16bit 写1 对应管脚为高电平。 写 0 ,无动作 3 BRR 只写寄存器: 只能改变管脚状态为低电平, 对寄存器管脚对应位 写1 相应管脚会为低电平 写 0 无动作
问1. 既然ODR 能控制管脚高低电平为什么还需要BSRR和SRR寄存器?
答1:就是你用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。 用ODR操作GPIO的伪代码如下: disable_irq() save_gpio_pin_sate = read_gpio_pin_state(); save_gpio_pin_sate = xxxx; chang_gpio_pin_state(save_gpio_pin_sate); enable_irq(); 关闭中断明显会延迟或丢失一事件的捕获,所以控制GPIO的状态最好还是用SBRR和BRR
----------- end
浙公网安备 33010602011771号