AKever

导航

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

 

posted on 2017-07-11 11:24  AKever  阅读(287)  评论(0)    收藏  举报