学习STM32第十九天

PWR电源控制

一、电源系统

  1. STM32F4xx电源供电结构框图如下
    PWR框图
    电压管理器(Voltage Regulator)共有三种模式
  • run mode
    此模式下,电压管理去稳定向核心、内存和外设提供1.2V电压,输出电压可由软件变换。
  • stop mode
    此模式下,寄存器和内部SRAM不会丢失数据。
  • standby mode
    此模式下,电压管理器不再工作,而由待机电池供电。
  1. 电压调节器
    • 上电/掉电复位
      Power-on Reset(POR)Power-down Reset(PDR),电压大于POR时解除复位,小于PDR时复位。设置这两个阈值就是防止电压在某个阈值附近波动造成输出也来回抖动,两个阈值中间电压正常时不复位。
      PWR复位
    • 可编程电压检测器
      Programmable Voltage Detector(PVD),可通过比较PWR_CR寄存器中的PLS[2:0]位设置的阈值来检测 V D D V_{DD} VDD,可触发中断(外部中断)用于紧急关闭任务。
      PWR_PVD
    • 低功耗模式
      低功耗模式有三种,睡眠模式、终止模式(停机模式/最低功耗睡眠模式)和待机模式。只有高优先级NVIC中断可唤醒并中断MCU。
      PWR低功耗
      通过SLEEPDEEP位同时FPU控制寄存器清空可进入睡眠模式,唤醒睡眠模式后程序从暂停的地方继续运行,只把CPU时钟关了程序暂停运行,对其他电路没有任何操作同时关闭时钟时寄存器和存储器内数据继续保存不丢失
      通过SLEEPDEEP位同时FPU控制寄存器就绪可进入停机模式,如果Flash程序在运行会等到其结束才进入停机模式,任一外部中断都可唤醒,关闭了所有1.2V区域时钟同时关闭HSI和HSE振荡器,CPU和外设的寄存器数据不会丢失。
      通过SLEEPDEEP位同时FPU控制寄存器就绪可进入待机模式,此模式下多用于实时时钟,只有在WKUP引脚上升沿、RTC闹钟事件、RTC唤醒事件、RTC入侵事件、RTC时间戳事件、外部BRST引脚复位和IWDG复位,此模式下电压调节器关闭,寄存器和存储器数据丢失所有引脚变为高阻态

程序一直运行在主循环内会徒增功耗,为此可设置低功耗模式,在空闲状态关闭不必要的硬件只保留必要的唤醒电路。

### STM32H7与OLED显示开发 #### 初始化OLED显示屏 为了初始化基于STM32H7微控制器的OLED屏幕,通常需要配置I2C接口来通信。下面是一个简单的初始化函数示例: ```c #include "stm32h7xx_hal.h" #include "i2c.h" #include "ssd1306.h" void OLED_Init(void) { HAL_I2C_MspInit(&hi2c1); // I2C外设初始化 SSD1306_Init(); // OLED显示器初始化 } ``` 这段代码展示了如何通过调用`HAL_I2C_MspInit()`方法设置I2C总线,并随后调用了SSD1306库中的`SSD1306_Init()`完成OLED屏的具体参数设定[^1]。 #### 硬件连接说明 当涉及到硬件接线时,一般情况下,OLED模块的数据传输依赖于两根信号线——SDA(数据线)和SCL(时钟线),这两者需分别接到MCU对应的I2C端口上。对于STM32H7来说,具体的引脚分配取决于所使用的型号及其内部资源布局;然而,在大多数应用场合下,默认的选择可能是PB8作为SCL而PB9则用于SDA。此外还需要注意电源供电部分,确保VCC接入到合适的电压等级(通常是3.3V或5V),GND接地即可正常工作。 #### 示例程序展示 这里给出一段完整的测试代码片段,它不仅包含了上述提到的初始化过程,还实现了向屏幕上打印字符串的功能: ```c int main(void) { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); SystemClock_Config(); OLED_Init(); // 初始化OLED while (1){ char str[] = "Hello World!"; SSD1306_ClearScreen(); // 清除当前画面 SSD1306_GotoXY(0, 0); // 设置光标位置为左上角 SSD1306_Puts(str, &Font_11x18, 1); HAL_Delay(1000); // 延迟一秒刷新一次 } } // 配置系统时钟 static void SystemClock_Config(void){ RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){ Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){ Error_Handler(); } } ``` 此段代码首先完成了系统的初步准备工作,接着执行了OLED设备的启动流程,并在一个无限循环体内持续更新着显示内容。每次迭代都会清除旧的画面并将新的消息放置在指定坐标处。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值