历史上的今天
今天是:2025年01月10日(星期五)
2021年01月10日 | STM32L--GPIO
2021-01-10 来源:eefocus
1. 每个GPIO均有以下寄存器:
4个32位配置寄存器:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR和GPIOx_PUPDR
GPIOx_MODER :配置IO端口方向为输入/输出/AF/模拟
GPIOx_OTYPER :选择输出类型:推挽/开漏
GPIOx_OSPEEDR :选择IO速度(与IO端口方向无关)
GPIOx_PUPDR :选择上拉/下拉电阻(与IO端口方向无关)
2个32位数据寄存器:GPIOx_IDR、GPIOx_ODR
1个32位置位/复位寄存器:GPIOx_BSRR(使用该寄存器读写寄存器可以避免在读写期间被IRQ中断,该读写操作属于一个原子操作)
该寄存器允许置位/复位GPIOx_ODR上指定的一位,GPIOx_ODR上每位关联到两个控制位:GPIOx_BSRR:BSRR(i) [Bits 15:0]和 GPIOx_BSRR:BSRR(i+SIZE)[Bits31:16];往GPIOx_BSRR:BSRR(i) [Bits 15:0]写1 可以置位对应的ODR;往GPIOx_BSRR:BSRR(i) [Bits 31:16]写1 可以置位对应的ODR;往该寄存器写0不会产生任何影响
1个32位锁定寄存器:GPIOx_LCKR
必需通过通过一个特殊的读写时序才能写入该寄存器,但时序正确时,bit16会置位(lock key active),bits[15:0]显示哪些IO端口被锁定了,端口被锁定之后直到下一个复位才能解锁,锁定之后以下寄存器将被冻结:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRH、GPIOx_AFRL
2个复用功能寄存器:GPIOx_AFRH、GPIOx_AFRL
2. 每个GPIO端口均可单独设置为以下模式:
输入+悬空
输入+上拉
输入+下拉
模拟(用作ADC、DAC输出或者捕获输入情况下)
输出+开漏+上拉/下拉(输出模式下GPIO的输出速度是可配置的)
输出+推挽+上拉/下拉
复用功能+推挽+上拉/下拉
复用功能+开漏+上拉/下拉
下图为GPIO的架构图:

3. GPIO一般用途
默认情况或者刚复位后,所有IO端口被设置为输入+悬空模式,除了调试接口默认设置为了复用功能+上拉/下拉
当端口被设置为输出的时候,修改GPIOx_ODR对应可改变输出高低电平(一般会使用推挽或者开漏输出(输出低电平时,只有N-MOS是接通的))
当端口被设置为输入的时候,每个AHB总线时钟均会捕获端口上高低电平,并存放在GPIOx_IDR寄存器
所有的GPIO端口均可通过配置寄存器使能或不使能内部弱上拉/弱下拉

4 .I/O端口多路复用及映射
IO端口通过一个内部的多路选择器以允许在同一时刻只使用一种复用功能,这样使得多个外围电路共享同样的IO端口
每个IO端口可以通过配置GPIOx_AFRL和GPIOx_AFRH设置所使能的复用功能(AF0~AF15)
复位之后,所有的IO连接到复用功能0(AF0)
外围电路的复用功能映射到AF1~AF14
Cortex-M3 EVENTOUT映射到AF15
以下说明如何使用复用功能:
System Function:配置IO端口使能的复用功能(JTAG/SWD,在复位之后对应端口会被调试器设置为调试功能下且不受GPIO寄存器的控制;RTC_50HZ,对应端口需要设置为输入+悬空;MCO,该端口必需配置在复用模式下)
GPIO:根据需要配置GPIOx_MODER设置IO端口工作模式(输入、输入/模拟)
Perpheral‘s Alternate Function:对于ADC/DAC,配置IO为模拟;对于其他外围功能,配置GPIOx_MODER、GPIOx_OTYPE、GPIOx_PUPDR、GPIOx_OSPEEDER
EVENTOUT:配置IO端口复用功能AF15,用于输出Cortex-M3 EVENTOUT信号
5. 外部中断/唤醒
所有的IO端口均有外部中断功能,使用外部中断功能时,IO端口必需设置为输入模式
6. 输入模式配置
当IO端口配置为输入模式时:
输出模式被禁用
施密特触发器被激活
根据GPIOx_PUPDR寄存器使能上拉/下拉电阻
每个AHB时钟均会采样IO端口上的值存放到输入数据寄存器中
通过读取输入数据寄存器可以检测IO状态

7. 输出模式配置
当IO端口配置为输出模式时:
输出模式使能
施密特出发器被激活
-- 开漏模式时:输出0时,N-MOS导通(P-MOS任何情况下不会导通)
-- 推挽模式时:输出0时,N-MOS导通;输出1时,P-MOS导通
根据GPIOx_PUPDR寄存器使能弱上拉/下拉
每个AHB时钟均会采样IO端口上的值存放到输入数据寄存器中
通过读取输入数据寄存器可以检测IO状态
通过读取输出数据寄存器可以得到最后写入的值

8. 复用功能配置
当IO端口配置为复用功能时:
输出模式下可配置为开漏或推挽
复用功能的输出信号将驱动输出缓冲区
输入端的施密特触发器被激活
根据GPIOx_PUPDR寄存器使能弱上拉/下拉
每个AHB时钟均会采样IO端口上的值存放到输入数据寄存器中
通过读取输入数据寄存器可以检测IO状态

9. 模拟模式配置
当IO端口配置为模拟模式时:
输出模式被禁用
输入模式下的施密特触发器被激活(为每个IO口的模拟值提供零功耗,施密特触发器的输出端被强制输出为0)
弱上拉/下拉被禁用
读取输入寄存器获取到0

10. 外部时钟/外部晶振端口复用
没有使用LSE时,OSC32_IN和OSC32_OUT 可配置为一般用途的IO端口
没有使用HSE时,OSC_IN和OSC_OUT 可配置为一般用途的IO端口
11. 选择RTC_AF1复用功能
STM32L152XX拥有以下特性
两个GPIO端口可配置为唤醒源WKUP1和WKUP3
一个GPIO端口可配置为唤醒源WKUP2,可用于检测篡改、时间戳事件,输出RTC AFO_ALARM、AFO_CALIB
RTC_AF1端口(PC13)可配置为以下功能:
唤醒源(WKUP2):配置PWR_CSR寄存器中的EWUP2位
RTC AFO_ALARM输出:根据RTC_CR寄存器中的OSEL[1:0]输出可配置为:RTC Alarm A、 RTC Alarm B、RTC Wakeup
RTC AFO_CALIB输出:配置RTC_CR寄存器中的COE[23]位
RTC AFI_TAMPER1 : 篡改事件检测
时间戳事件检测
12. 初始化GPIO端口例子
void Init_GPIOS(void){
GPIO_InitTypeDef GPIO_InitStructure; //定义初始化结构体
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); //使能对应AHB总线时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //根据需求配置GPIO工作模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO端口
}
史海拾趣
|
网上流传的大都是关于apache1.3.39的交叉编译步骤,我下载的http-2.2.9,找到一个此版本的交叉编译方法:http://203.208.37.104/search?q=cache:hrIbS-XEbrYJ:blog.xuite.net/bunny/blog/19764280+srclib/apr+arm&cd=2&hl=zh-CN&ct=clnk&gl=cn&st_u ...… 查看全部问答> |
|
我的嵌入式产品用的DM9000a, 用一台电脑能ping 通(偶尔丢包),不断电情况下,切换成另一台电脑,有时能ping通,有时ping 不通,并且10M/100M以及LINK灯灭,怎么回事啊?谢谢 … 查看全部问答> |
|
在将CE6.0的触摸屏驱动移植到FS2410时,编译通过了,但却得不到有效的触摸信息。得到的部分调试信息如下: 11941 PID:400002 TID:b1000a RELFSD: Opening file FS2410Touch.dll from desktop PB Debugger Loaded symbols for \'C:\\W ...… 查看全部问答> |
|
参考了一些桌面上的方案,发现在CE4.2下面都用不了,要么是mutex函数不支持多个参数,要么就是用不了Process类,大家能不能帮忙想想办法啊,看怎么实现判断程序是否运行的效果,如果已经运行了就不要再运行。… 查看全部问答> |
|
使用的芯片是413 采用TA1的捕获模式从P1.2口测量频率周期,在测试板上使用按键模拟待测脉冲信号,结果发现按一次键会发生很多次捕获中断,为查明中断源有查TAIV,结果令人差异。代码如下: #include "msp430x41x.h" unsigned int m=1,l=1,o=1 ...… 查看全部问答> |
|
请问MSP430F149的C语言指令,一条指令就是一个时钟周期吗? 如果用汇编语言来写,一条指令就是一个周期对吗? 如果采用8MHZ的主时钟,一条指令就是125ns对吗? 从MSP430F149输出的MCLK是TTL电平吗?如果驱动COMS的串行时钟输入端要加上拉电阻吗 ...… 查看全部问答> |
|
最近一直在做温度传感器ds18b20的读写控制,感觉读写时序已经没有问题了,但是读出的数据始终是0,希望好心哥哥指点一下啊,我用ise 平台,vhdl语言写的代码~~~~ 芯片手册看了几百次了~求助啊… 查看全部问答> |





