STM32C092RC 的 GPIO 配置虽然比 51 单片机复杂点,但官方库函数HAL/LL 库已经封装好了,照着例程改引脚号和参数就能用。
开时钟(让 GPIO 模块通电) 设置模式(输入/输出/上拉/下拉) 读写引脚(直接赋值 1 或 0) 虽然寄存器操作对新手不友好,建议直接用库函数,别硬啃手册,其实说白了就是那几个步骤。
STM32C092RC 有 32 个 GPIO 引脚具体型号可能不同,大部分支持复用功能UART、I2C、PWM 等一些外设。 GPIO 速度和驱动能力支持 2MHz/10MHz/50MHz 三种输出速度,实际是驱动能力调节,不是通信速率。
这里就不多讲了,现在开始对C092进行认真的了解与熟悉。
GPIO主要特性 输出状态:推挽或开漏+上拉/下拉 从输出数据寄存器(GPIOXODR)或外设(复用功能输出)输出数据 可为每个//0选择不同的速度输入 状态:浮空、上拉/下拉、I/0模拟模式 将数据输入到输入数据寄存器(GPIOxIDR)或外设(复用功能输入) 置位和复位寄存器(GPIOxBSRR),对GPIOxODR具有按位写权限
锁定机制(GPIOx LCKR),可冻结//0 端口配置模拟功能复用功能选择寄存器(一个 10 最多可具有 16 个复用功能)快速翻转,每次翻转最快只需要两个时钟周期引脚复用非常灵活,允许将/0 引脚用作 GPI0 或多种外设功能中的一种GPI0 功能描述根据数据手册中列出的每个 !/0端口的特性,可通过软件将通用 I/O(GPIO) 端口的各个端口位分别配置为多种模式:输入浮空输入上拉输入下拉模拟具有上拉或下拉功能的开漏输出具有上拉或下拉功能的推挽输出具有上拉或下拉功能的复用功能推换具有上拉或下拉功能的复用功能开漏
框图 下面看一下框图: 输出配置: 功能配置: 通用 I/0 (GPIO) 在复位期间及复位刚刚完成后,复用功能尚未激活,大多数 I0 端口被配置为模拟模式。复位后,调试引脚处于复用功能上拉/下拉状态: PA14:SWCLK 处于下拉状态 PA13:SWDIO 处于上拉状态 PA14 与BOOT0 功能共用。使用时需小心谨慎,因为调试器件可能会篡改BOOTO 引脚值。当引脚配置为输出后,写入到输出数据寄存器(GPIOx ODR) 的值将在 I/0 引脚上输出。可以在推挽模式下或开漏模式(仅驱动低电平,高电平为高阻态)下使用输出驱动器。输入数据寄存器(GPIOx IDR) 每隔1个 AHB 时钟周期捕获一次 I/O 引脚的数据。所有 GPIO 引脚都具有内部弱上拉及下拉电阻,可根据 GPIOx PUPDR 寄存器中的值来打开/关闭。 GPIO 引脚支持以下工作模式: GPIO:输出、输入或模拟 I/0,具体取决于 GPIOx MODER 寄存器设置复用功能 具有调试复用功能的 GPIO 在复位后设为复用功能模式。 附加功能 仅限部分 GPIO 引脚,附加功能模式通过相应功能模块(例如 ADC、DAC、RTC、RCC 和 PWR)的控制寄存器来设置,与 GPIOx MODER 寄存器设置无关。当某个 I/0 设为附加功能模式时,建议在 GPIOx MODER 寄存器中将其相应的 GPIO复用器设为模拟模式。 寄存器 GPIO 端口模式寄存器(GPIOX MODER)(x=A、B、C、D 和 F) GPlO port mode register 偏移地址:0x00 复位值:0xEBFF FFFF(端口A) 复位值:0XFFFF FFFF(端口A以外的端口) 位 31:0 MODEy[1:0]: |/0y的端口x配置(Port x configuration for l/0 y)(y= 15 到 0)这些位通过软件写入,用于将 1/0 设为四种工作模式之一。00:输入 01:输出 10:复用功能 11:模拟
GPI0 端口输出类型寄存器(GPIOXOTYPER)(x=A、B、C、D和F) GPlO port output type register 偏移地址:0x04
复位值:0x0000 0000 GPI0 端口输出速度寄存器(GPIOXOSPEEDR)(x=A、B、C、D和F) GPlO port output speed register 偏移地址:0x08 复位值:0xOC00 0000(端口A)
复位值:0x0000 0000(端口A以外的端口)
这里就把几个基本的例出来。
代码 LED1_GPIO_CLK_ENABLE();
LED2_GPIO_CLK_ENABLE();
/* -2- Configure IO in output push-pull mode to drive external LEDs */
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = LED1_PIN;
HAL_GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LED2_PIN;
HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_PIN);
/* Insert delay 100 ms */
HAL_Delay(100);
HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
/* Insert delay 100 ms */
HAL_Delay(100);
效果
|