首页 > 其他分享 >STM32_引脚初始化与时钟基础

STM32_引脚初始化与时钟基础

时间:2024-12-28 21:52:47浏览次数:5  
标签:初始化 引脚 STM32 define Mode GPIO APB2Periph uint32 RCC

为什么每用一个GPIO引脚,都要初始化一次时钟?

TM32 微控制器采用了 时钟门控(Clock Gating)机制,这是现代微控制器的一种功耗管理策略。时钟门控机制的核心思想是,只有在外设需要运行时,才使能相应外设的时钟,而在不使用时关闭时钟,以减少功耗和节省电源。

    //初始化时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    //GPIO引脚初始化
    GPIO_InitTypeDef GPIO_InitStructure; 
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4; 
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
    //把初始化的值重新在检查赋值一次,与硬件对应上
	GPIO_Init(GPIOA, &GPIO_InitStructure);

时钟设置

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    //RCC->APB2ENR寄存器对应的RCC_APB2Periph位被置位1,选择响应的时钟
    RCC->APB2ENR |= RCC_APB2Periph;
  }
  else
  {
    //RCC->APB2ENR寄存器对应的RCC_APB2Periph位被置位0,其余为不变,关闭响应的时钟
    RCC->APB2ENR &= ~RCC_APB2Periph;
  }
}

GPIO引脚的参数选择

typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */
  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */
  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
//速度可选项
typedef enum
{ 
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
//模式可选项
typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 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
}GPIOMode_TypeDef;

每个外设(如 GPIO、USART、SPI、ADC 等)都有自己的时钟源。

#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
//ABCDEFG 其实是代表不同的 GPIO 端口组,而每个端口组下面可以包含多个 GPIO 引脚(Pin)

//GPIOA代表一个时钟组,00000004代表位掩码    用于给寄存器RCC->APB2ENR确定是那一组的时钟使能
//RCC->APB2ENR |= RCC_APB2Periph_GPIOA;  

#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)

#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)

标签:初始化,引脚,STM32,define,Mode,GPIO,APB2Periph,uint32,RCC
From: https://www.cnblogs.com/blogofzcfu/p/18638014

相关文章

  • 【江协STM32】6-3/4 TIM输出比较、PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机
    1.输出比较简介OC(OutputCompare)输出比较,主要用来输出PWM波输出比较可以通过比较CNT与CCR寄存器(捕获/比较寄存器)值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形CCR:使用输入捕获时,它就是捕获寄存器;使用输出比较时,它就是比较寄存器。在输出比......
  • 【江协STM32】6-1/2 TIM定时中断、定时器定时中断&定时器外部时钟
    1. TIM定时中断1.1TIM简介TIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16位计数器(执行计数定时的一个寄存器,每来一个时钟,计数器加1)、预分频器(可以对计数器的时钟进行分频,使计数更灵活)、自动重装寄存器(计数的目标值,就是想要计多少个时钟申......
  • STM32单片机芯片与内部48 CAN 数据手册 寄存器
    目录一、CAN控制和状态寄存器1、CAN主控制寄存器(CAN_MCR)2、CAN主状态寄存器(CAN_MSR)3、CAN发送状态寄存器(CAN_TSR)4、CAN接收FIFO0寄存器(CAN_RF0R)5、CAN接收FIFO1寄存器(CAN_RF1R)6、CAN中断使能寄存器(CAN_IER)7、CAN错误状态寄存器(CAN_ESR)8、CAN位......
  • STM32单片机芯片与内部49 CAN双机通讯 标准库 HAL库
    目录一、CAN通讯——标准库1、CAN_InitTypeDef2、CAN_FilterInitTypeDef3、GPIO4、NVIC5、CAN接收6、CAN发送7、中断服务函数8、CAN_DEBUG_ARRAY二、CAN通讯——HAL库1、CAN_HandleTypeDef2、CAN_FilterConfTypeDef3、GPIO4、NVIC5、CAN接收6、CAN发送7、中断......
  • 江科大STM32学习:10 DMA直接存储器取存
    参考STM32F0xxx参考手册>2.存储器和总线架构<>10.DMA<1.DMA简介2.存储器映像类型起始地址存储器用途ROM0x08000000程序存储器Flash存储C语言编译后的程序代码0x1FFFF000系统存储器存储BootLoader,用于串口下载0x1FFFF800选项字节存储一些独立于程序代码的配置参数RAM......
  • C++中for (int i; i<track_object.region_num; i++)这样写没有对i进行初始化0也不会报
    在C++中,未初始化的局部变量(如 inti)会包含未定义的值,可能导致未定义行为(undefinedbehavior,UB)。对于以下代码:for(inti;i<track_object.region_num;i++){//Loopbody}i 没有显式初始化,因此它的初始值是未定义的。然而,你观察到代码运行时没有报错的原因可能......
  • STM32 学习笔记(八)USART串口
    该系列为笔者在学习STM32过程(主线是江科大的视频)中的记录与发散思考。初学难免有所纰漏、错误,还望大家不吝指正,感谢~1.通信接口与串口通信1.1通信接口概述通信接口是用于设备间传输数据的硬件接口。常见的通信接口包括并行接口和串行接口。双工:全双工可以同时接收、发......
  • stm32边缘AI
    STM32边缘AI是指基于STM32微控制器(MCU)或微处理器(MPU)实现的边缘人工智能解决方案。以下是对STM32边缘AI的详细解析:一、概念与定义边缘人工智能,又称为“边缘计算”,是指在边缘侧使用人工智能算法和模型处理和分析数据,而不是将数据传输到中央服务器进行处理。STM32边缘AI则是利用......
  • Idea、pycharm初始化设置
    IDEA、pycharm配置,下文真对IDEA设置,pycharm可参考5.详细设置5.1如何打开详细配置界面1.显示工具栏 2、选择详细配置菜单或按钮  5.2系统设置1、默认启动项目配置 启动IDEA时,默认自动打开上次开发的项目?还是自己选择?如果去掉Reopenprojectsonstartup前面......
  • PostgreSQL 初始化配置设置
    title:PostgreSQL初始化配置设置date:2024/12/27updated:2024/12/27author:cmdragonexcerpt:PostgreSQL是一款广泛应用于企业级应用、数据仓库以及Web应用程序的强大数据库管理系统。在完成数据库的安装后,进行合理而有效的初始配置是确保数据库性能和安全性的......