STM8 GPIO 学习(驱动LED、Button)

本文介绍了STM8 GPIO的结构,包括输出数据寄存器、输入数据寄存器、数据方向寄存器等,并详细阐述了GPIO的不同工作模式。还提供了GPIO的固件库函数示例,通过示例代码展示了如何使用GPIO控制LED灯闪烁和读取Button状态。

STM8中GPIO寄存器有:输出寄存器(ODR),输入寄存器(IDR),方向寄存器(DDR),控制寄存器1CR1)和控制寄存器2CR2.后面三个寄存器组和可以配置为8GPIO的模式

定义如下:

/**
  * @brief General Purpose I/Os (GPIO)
  */
typedef struct GPIO_struct
{
  __IO uint8_t ODR; /*!< Output Data Register */
  __IO uint8_t IDR; /*!< Input Data Register */
  __IO uint8_t DDR; /*!< Data Direction Register */
  __IO uint8_t CR1; /*!< Configuration Register 1 */
  __IO uint8_t CR2; /*!< Configuration Register 2 */
}
GPIO_TypeDef;

相关的配置模式定义如下

/**
  * @defgroup GPIO_Modes
  *
  * @brief
  *     
  * Bits definitions:
  * - Bit 7: 0 = INPUT mode
  *          1 = OUTPUT mode
  *          1 = PULL-UP (input) or PUSH-PULL (output)
  * - Bit 5: 0 = No external interrupt (input) or No slope control (output

### STM32 GPIO 使用教程 #### 配置环境 为了开始使用STM32的GPIO,首先需要准备好开发环境。这通常意味着安装并配置好STM32CubeIDE和其他必要的工具链。确保已经下载了适用于所选MCU系列的HAL库版本[^1]。 #### 初始化GPIO引脚 初始化过程涉及选择特定的功能模式(如输入、输出),以及设定内部电阻状态(上拉/下拉)。对于简单的LED控制例子来说: ```c // 定义 LED 连接的端口和引脚编号 #define LED_PIN GPIO_PIN_5 #define LED_PORT GPIOD void MX_GPIO_Init(void){ __HAL_RCC_GPIOD_CLK_ENABLE(); // 启用GPIOD时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 设置为推挽输出, 速度高 GPIO_InitStruct.Pin = LED_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct); } ``` 这段代码展示了如何定义一个连接到`PD5`上的LED,并将其设为高速推挽输出模式。 #### 控制输出电平 一旦完成了上述初始化工作之后就可以轻松地改变指定管脚的状态从而点亮或熄灭LED灯泡: ```c int main(void){ /* Reset of all peripherals, Initializes the Flash interface and Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); while (1){ HAL_GPIO_TogglePin(LED_PORT, LED_PIN); // 切换 PD5 的高低电平 HAL_Delay(500); // 延迟半秒 } } ``` 此循环会不断切换LED的状态,在每次迭代之间暂停一段时间以实现闪烁效果。 #### 处理外部中断请求 当涉及到检测按钮按下事件或其他类型的瞬态条件时,则可能需要用到外部中断特性。这里给出一段用于捕捉按键按下的简单ISR处理逻辑作为示范: ```c extern void EXTI0_IRQHandler(void){ HAL_NVIC_ClearPendingIRQ(EXTI0_IRQn); // 清除挂起位 HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 调用回调函数 } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == GPIO_PIN_0){ // 如果是PA0触发 static uint8_t count=0; count++; printf("Button pressed %d times\n",count); } } ``` 该片段说明了怎样注册一个针对某个具体引脚(这里是PA0)发生的边沿敏感型中断的服务例程,并在其中执行自定义的动作——在此处只是打印一条消息表示已收到一次点击操作[^2]。 #### 不同的工作模式详解 除了最基本的输入输出之外,STM32还支持更多种类的操作方式,包括但不限于复用功能、模拟量采集等。例如,“开漏”与“推挽”的主要差异在于前者仅能驱动低电平而后者既能提供也可以吸收电流;同样地,“浮空”代表没有任何内置保护措施因而容易受到噪声干扰影响,相比之下带有上下拉选项则更加稳定可靠[^3]。 #### 输入配置实例 对于那些希望利用GPIO来进行数据获取而非单纯发送指令的情况而言,了解其各种可用参数就显得尤为重要了。下面是一些有关于设置成不同形式接收器的具体做法: - **浮空输入**: `GPIO_InitStruct.Pull = GPIO_NOPULL;` - **上拉输入**: `GPIO_InitStruct.Pull = GPIO_PULLUP;` - **下拉输入**: `GPIO_InitStruct.Pull = GPIO_PULLDOWN;` 这些语句分别对应着三种常见情形的选择方法[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值