1、-_接触了 STM32 的开发板快一周了,拿到板子厂商提供了些 DEMO 程序,其他想自己学习,看了 ST 的资料手册,感觉看下来,一个工具还是不知道怎么用,还好现在网络强大, 在论坛上可以去找自己需要的资料. 我把搜集的资料整理了一下,以及自己加了一些自己的,方便自己以后再用到, 方便查找,同时和网友们一起分享, 希望你们有什么新的想法也提出来,一起分享.开始吧!嘿嘿简述1STM32 的输入输出管脚有下面 8 种可能的配置:(4 输入+2 输出+2 复用输出)-_ 浮空输入_IN_FLOATING 带上拉输入_IPU 带下拉输入_IPD (所谓上拉就是接一电阻到电源;下拉就是接一电阻到地。也
2、就是说带上拉就是口初始的时候是高电平,下拉就是低电平。) 模拟输入_AIN 开漏输出_OUT_OD 推挽输出_OUT_PP 复用功能的推挽输出_AF_PP 复用功能的开漏输出_AF_OD1.1 I/O 口的输出模式下,有 3 种输出速度可选(2MHz、10MHz和 50MHz),这个速度是指 I/O 口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在 I/O 口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出
3、频率时,请选用低频驱动电路,这样非常有利于提高系统的 EMI 性能。当然如果要输出较高频率的信号,但却选用了较-_低频率的驱动模块,很可能会得到失真的输出信号。关键是 GPIO 的引脚速度跟应用匹配(推荐 10 倍以上?)。比如:1.1.1 对于串口,假如最大波特率只需 115.2k,那么用 2M 的GPIO 的引脚速度就够了,既省电也噪声小。1.1.2 对于 I2C 接口,假如使用 400k 波特率,若想把余量留大些,那么用 2M 的 GPIO 的引脚速度或许不够,这时可以选用 10M 的GPIO 引脚速度。1.1.3 对于 SPI 接口,假如使用 18M 或 9M 波特率,用 10M 的G
4、PIO 的引脚速度显然不够了,需要选用 50M 的 GPIO 的引脚速度。输入模式。1.4 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。1.5 GPIO 口的配置具有上锁功能,当配置好 GPIO 口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。2 在 STM32 中如何配置片内外设使用的 IO 端口首先,一个外设经过 配置输入的时钟和 初始化后即被激活(开启);如果使用该外设的输入输出管脚,则需要配置相应的 GPIO 端口-_(否则该外设对应的输入输出管脚可以做普通 GPIO 管脚使用);再对外设进行详细配置。对应到外设的输入输出功能有下述三种情况:一、外设
5、对应的管脚为输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。二、外设对应的管脚为输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。三、ADC 对应的管脚:配置管脚为模拟输入。 如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。将管脚配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。 3 通用 IO 端口(GPIO)初始化:3.1 GPIO 初始化3.1.1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B | C, ENABLE):使能 APB2 总
6、线外设时钟3.1.2 RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):释放 GPIO 复位-_3.2 配置各个 PIN 端口(模拟输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU 、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP 、推挽式复用输出 _AF_PP、开漏复用输出_AF_OD)3.3 GPIO 初始化完成=最近刚开始学习 STM32,所以从最基本的 GPIO 开始学起;首先看看STM32 的 datasheet 上对 GPIO 口的简单介绍:每个 GPI/O 端口有两个
7、 32 位配置寄存器 (GPIOx_CRL,GPIOx_CRH),两个 32 位数据寄存器(GPIOx_IDR,GPIOx_ODR) ,一个 32 位置位/复位寄存器(GPIOx_BSRR),一个 16 位复位寄存器(GPIOx_BRR)和一个 32 位锁定寄存器(GPIOx_LCKR)。GPIO 端口的每个位可以由软件分别配置成多种模式。每个 I/O 端口位可以自由编程,然而 I/0 端口寄存器必须按 32 位字被访问(不允许半字或字节访问)。GPIOx_BSRR 和 GPIOx_BRR 寄存器允许对任何 GPIO 寄存器的读/ 更改的独立访问;这样,在读和更改访问之间产生 IRQ 时不会发
8、生危险。端口位配置 CNFx1:0=xxb,MODEx1:0=xxb-_再看 GPIO 功能很强大:1.通用 I/O(GPIO):最最基本的功能,可以驱动 LED、可以产生PWM、可以驱动蜂鸣器等等;2.单独的位设置或位清除:方便软体作业,程序简单。端口配置好以后只需 GPIO_SetBits(GPIOx, GPIO_Pin_x)就可以实现对 GPIOx 的pinx 位为高电平;3.外部中断/唤醒线:端口必须配置成输入模式时,所有端口都有外部中断能力;4.复用功能(AF):复用功能的端口兼有 IO 功能等。复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式:(CNFx1:0=
9、01b,MODEx1:0=00b)。5.软件重新映射 I/O 复用功能:为了使不同器件封装的外设 I/O 功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成。这时,复用功能就不再映射到它们的原始引脚上了;-_6.GPIO 锁定机制:当在一个端口位上执行了所定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。GPIO 基本设置GPIOMode_TypeDef GPIO mode 定义及偏移地址GPIO_Mode_AIN = 0x0, /模拟输入GPIO_Mode_IN_FLOATING = 0x04, /悬空输入GPIO_Mode_IP
10、D = 0x28, /下拉输入GPIO_Mode_IPU = 0x48, /上拉输入GPIO_Mode_Out_OD = 0x14, /开漏输出GPIO_Mode_Out_PP = 0x10, /推挽输出GPIO_Mode_AF_OD = 0x1C, /开漏复用GPIO_Mode_AF_PP = 0x18 /推挽复用GPIO 输入输出速度选择:typedef enum GPIO_Speed_10MHz = 1,-_GPIO_Speed_2MHz, GPIO_Speed_50MHzGPIOSpeed_TypeDef;#define IS_GPIO_SPEED(SPEED) (SPEED = GP
11、IO_Speed_10MHz) | (SPEED = GPIO_Speed_2MHz) | (SPEED = GPIO_Speed_50MHz)做一个 GPIO 输出的试验当 I/O 端口被配置为推挽模式输出时:输出寄存器上的 0 激活 N-MOS,而输出寄存器上的 1 将激活 P-MOS。用这段程序实现:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;int main(void)#ifdef DEBUGdebug();#endif-_/* 设置系统时钟 */RCC_Configuration();/* 嵌套中断设置*/NVIC_Configur
12、ation();/* 激活 GPIOC clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/* Configure PC.04, PC.05, PC.06 and PC.07 as Output push-pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, while (1) -_/*本试验仅能实现 LED1 亮、熄功能*/GPIO_SetBits(GPIOC, GPIO_Pin_4); /设置 PC.04 pin 为高电平,点亮LED1Delay();GPIO_ResetBits(GPIOC, GPIO_Pin_4); /设置 PC.04 pin 为低电平,熄灭LED1Delay();再来一个网上的 DEMO:硬件电路