当前位置: 首页 > news >正文

STM32常见配置

二. GPIO配置

2.1 初始化 GPIO时钟

使能所需GPIO端口的时钟:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

2.2 配置 GPIO 引脚

创建一个GPIO初始化结构体并配置引脚‘

GPIO_InitTypeDef GPIO_InitStruct;// 配置引脚为推挽输出模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; // 选择引脚5
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // 输出模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 速度50MHz
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // 无上拉/下拉
GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA

2.3 设置引脚状态

通过标准库函数设置引脚的高低电平:

GPIO_SetBits(GPIOA, GPIO_Pin_5); // 设置引脚5为高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 设置引脚5为低电平

三 外部中断配置

void External_Interrupt_Configuration(void) {// 开启GPIOA和GPIOB的时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);// 配置PB0为输出模式,用于LEDGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // LED引脚GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // 输出模式GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 速度GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // 不上拉/下拉GPIO_Init(GPIOB, &GPIO_InitStruct);// 配置PA0为输入模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 使用引脚PA0GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; // 输入模式GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉电阻GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置外部中断SYSCFG_InitTypeDef SYSCFG_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);// 将PA0引脚连接到外部中断线0SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);// 配置外部中断的触发方式EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_Line = EXTI_Line0; // 选择中断线0EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 使能中断EXTI_Init(&EXTI_InitStruct);// 配置中断优先级NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; // 外部中断0NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; // 优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 子优先级NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能中断NVIC_Init(&NVIC_InitStruct);
}

四. 定时器配置

4.1 初始化定时器时钟

使能定时器的时钟:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 以TIM2为例

4.2 配置定时器

设置定时器的基础参数,如计数器的重装载值、预分频器等:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;// 预分频器,假设APB1时钟为42MHz
uint16_t PrescalerValue = 42000 - 1; // 设置为1kHz的定时器频率TIM_TimeBaseStruct.TIM_Period = 1000 - 1; // 设置为1秒计数
TIM_TimeBaseStruct.TIM_Prescaler = PrescalerValue; // 设置预分频器
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct); // 初始化TIM2

4.3 使能定时器

TIM_Cmd(TIM2, ENABLE); // 使能TIM2

4.4 配置定时器中断(可选)

如果需要使用定时器中断,可以配置中断并使能:

// 配置定时器中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 使能更新中断// 中断优先级设置
NVIC_SetPriority(TIM2_IRQn, 1);
NVIC_EnableIRQ(TIM2_IRQn); // 使能中断

4.5 中断处理程序

实现定时器中断服务程序:

void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {// 处理中断TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中断标志}
}

五. PWM 配置

5.1 初始化GPIO

void GPIO_Configuration(void) {GPIO_InitTypeDef GPIO_InitStruct;// 使能GPIO时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);// 配置引脚为复用功能(比如PA0用于TIM2的CH1)GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 使用PA0GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 复用模式GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // 无上拉/下拉GPIO_Init(GPIOA, &GPIO_InitStruct);// 设置复用功能GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM2);
}

5.2 初始化定时器

void TIM_Configuration(void) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;TIM_OCInitTypeDef TIM_OCStruct;// 使能TIM2时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// 预分频器设置(假设APB1时钟为42MHz,目标频率1kHz)uint16_t PrescalerValue = 42000 - 1; TIM_TimeBaseStruct.TIM_Prescaler = PrescalerValue;TIM_TimeBaseStruct.TIM_Period = 1000 - 1; // PWM周期为1ms(1kHz)TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct);
}

5.3 配置PWM模式

PWM模式:设置输出比较模式为PWM模式1.在PWM模式1中,输出将在计数器值小于TIM_Pulse时为高电平,大于时为低电平。

输出状态:启用输出状态,表示该通道的PWM输出将被激活

占空比:设置TIM_Pulse为500

极性:设置输出极性为高电平有效,

void PWM_Configuration(void) {TIM_OCInitTypeDef TIM_OCStruct;// 设置PWM模式TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCStruct.TIM_Pulse = 500; // 占空比50%(500/1000)TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平有效TIM_OC1Init(TIM2, &TIM_OCStruct); // 初始化TIM2的通道1
}

5.4 启动定时器和PWM输出

void Start_PWM(void) {TIM_Cmd(TIM2, ENABLE); // 启动定时器TIM_CtrlPWMOutputs(TIM2, ENABLE); // 启动PWM输出
}

六. 串口配置

void USART_Configuration(void) {USART_InitTypeDef USART_InitStruct;// 开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);// 开启GPIOA的时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);// 配置GPIOA的引脚9和10(USART1的TX和RX引脚)GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // TX和RXGPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 复用功能GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 速度GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉GPIO_Init(GPIOA, &GPIO_InitStruct);// 将引脚设置为复用功能GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); // TX引脚GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); // RX引脚// USART配置USART_InitStruct.USART_BaudRate = 115200; // 波特率USART_InitStruct.USART_WordLength = USART_WordLength_8b; // 数据位8位USART_InitStruct.USART_StopBits = USART_StopBits_1; // 停止位1位USART_InitStruct.USART_Parity = USART_Parity_No; // 无奇偶校验USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无流控制USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 发送和接收USART_Init(USART1, &USART_InitStruct); // 初始化USART1// 启动USARTUSART_Cmd(USART1, ENABLE);
}

七. IIC配置

I2C_ClockSpeed:设置I2C总线的时钟频率;

I2C_Mode:

        I2C_Mode_I2C:标准I2C模式,用于一般应用

        I2C_Mode_SMBus:用于SMBus(系统管理总线),更具特色,适合特定应用。

I2C_DutyCycle:指定在快速模式下的时钟高低电平的比例。

  • I2C_DutyCycle_2:高电平和低电平各占50%。
  • I2C_DutyCycle_16_9:高电平占约69%,低电平占约31%。这个选项适用于某些特定的快速模式应用

I2C_OwnAddress1:设置从设备的I2C地址。

I2C_Ack:设置应答模式。

  • I2C_Ack_Enable:启用应答,在数据传输中,主设备发送数据后会等待从设备的应答。
  • I2C_Ack_Disable:禁用应答,主设备发送数据后不等待应答。

I2C_AcknowledgedAddress:设置地址类型。

  • I2C_AcknowledgedAddress_7bit:使用7位地址(通常)。
  • I2C_AcknowledgedAddress_10bit:使用10位地址,适用于特定应用

I2C_Init:将配置应用于指定的I2C接口(如I2C1)

void I2C_Configuration(void) {I2C_InitTypeDef I2C_InitStruct;// 开启I2C1的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);// 开启GPIOB的时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);// 配置GPIOB的引脚6和7(I2C1的SCL和SDA引脚)GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // SCL和SDAGPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 复用功能GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 速度GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; // 开漏输出GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉GPIO_Init(GPIOB, &GPIO_InitStruct);// 将引脚设置为复用功能GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1); // SCL引脚GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1); // SDA引脚// I2C配置I2C_InitStruct.I2C_ClockSpeed = 100000; // I2C频率100kHzI2C_InitStruct.I2C_Mode = I2C_Mode_I2C; // I2C模式I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; // 2分之一I2C_InitStruct.I2C_OwnAddress1 = 0x30; // 从地址I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; // 使能应答I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; // 7位地址I2C_Init(I2C1, &I2C_InitStruct); // 初始化I2C1// 启动I2CI2C_Cmd(I2C1, ENABLE);
}

八. SPI配置

void SPI_Configuration(void) {SPI_InitTypeDef SPI_InitStruct;// 开启SPI1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);// 开启GPIOA的时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);// 配置GPIOA的引脚5、6、7(SPI1的SCK、MISO、MOSI引脚)GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // SCK、MISO、MOSIGPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 复用功能GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 速度GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // 不上拉/下拉GPIO_Init(GPIOA, &GPIO_InitStruct);// 将引脚设置为复用功能GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); // SCK引脚GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); // MISO引脚GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); // MOSI引脚// SPI配置SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 全双工模式SPI_InitStruct.SPI_Mode = SPI_Mode_Master; // 主模式SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // 数据大小8位SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; // 时钟极性SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; // 时钟相位SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; // 波特率预分频SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; // 先发送高位SPI_InitStruct.SPI_CRCPolynomial = 10; // CRC多项式(可选)SPI_Init(SPI1, &SPI_InitStruct); // 初始化SPI1// 启动SPISPI_Cmd(SPI1, ENABLE);
}

相关文章:

  • LM393 电压比较器和典型电路
  • Ubuntu 镜像替换为阿里云镜像:简化你的下载体验
  • JavaScript 网页设计案例:打造一个交互式用户界面
  • 迈瑞嵌入式面试及参考答案
  • 软件测试学习笔记丨Mock的价值与实战
  • 【算法业务】关于数据驱动的用户增长思考
  • Ubuntu 开机自启动 .py / .sh 脚本,可通过脚本启动 roslaunch/roscore等
  • DMDSC更换DCR和VOTE磁盘
  • MySQL-数据库设计
  • tomcat的安装,管理与配置
  • ECMAScript与Python、Java和C++比较的详细的代码案例
  • Excel中查找某个值的位置,用位置取值
  • 浅谈stm32的GPIO引脚配置模式
  • 在Ubuntu 16.04上安装Virtualmin与Webmin、LAMP、BIND和PostFix的方法
  • Swagger配置且添加小锁(asp.net)(笔记)
  • [Vue CLI 3] 配置解析之 css.extract
  • Angular2开发踩坑系列-生产环境编译
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • GraphQL学习过程应该是这样的
  • HTTP中GET与POST的区别 99%的错误认识
  • IOS评论框不贴底(ios12新bug)
  • Java基本数据类型之Number
  • Map集合、散列表、红黑树介绍
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • React 快速上手 - 07 前端路由 react-router
  • 工作中总结前端开发流程--vue项目
  • 来,膜拜下android roadmap,强大的执行力
  • 爬虫模拟登陆 SegmentFault
  • 用element的upload组件实现多图片上传和压缩
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • mysql面试题分组并合并列
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ‌[AI问答] Auto-sklearn‌ 与 scikit-learn 区别
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (~_~)
  • (003)SlickEdit Unity的补全
  • (27)4.8 习题课
  • (7)摄像机和云台
  • (9)STL算法之逆转旋转
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计高校学生选课系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (回溯) LeetCode 46. 全排列
  • (一)u-boot-nand.bin的下载
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • .dwp和.webpart的区别
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net 流——流的类型体系简单介绍
  • .net打印*三角形
  • .NET分布式缓存Memcached从入门到实战
  • .NET应用架构设计:原则、模式与实践 目录预览