25/1/15 嵌入式笔记 初学STM32F108

embedded/2025/1/20 12:27:40/

GPIO初始化函数

GPIO_Ini:初始化GPIO引脚的模式,速度和引脚号

GPIO_Init(GPIOA, &GPIO_InitStruct);  // 初始化GPIOA的引脚0

GPIO输出控制函数

GPIO_SetBits:将指定的GPIO引脚设置为高电平

GPIO_SetBits(GPIOA, GPIO_Pin_0);  // 将GPIOA的引脚0设置为高电平

GPIO_ResetBits:将指定的GPIO引脚设置为低电平

GPIO_ResetBits(GPIOA, GPIO_Pin_0);  // 将GPIOA的引脚0设置为低电平

GPIO_WriteBit:写入指定的电平状态到GPIO引脚

GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);  // 将GPIOA的引脚0设置为高电平

GPIO_Write:写入一个16位值到GPIO端口

GPIO_Write(GPIOA, 0x0001);  // 将GPIOA的引脚0设置为高电平,其他引脚为低电平

GPIO输入读取函数

GPIO_ReadInputDataBit:读取指定GPIO引脚的电平状态

if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) {
    // 引脚0为高电平
}

GPIO_ReadInputData:读取整个GPIO端口的输入状态

uint16_t portValue = GPIO_ReadInputData(GPIOA);  // 读取GPIOA的输入状态

GPIO时钟使能函数

RCC_APB2PeriphClockCmd:使能GPIO端口的时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // 使能GPIOA的时钟

时钟使能是指为某个外设(如GPIO、USART、SPI等)提供时钟信号,使其能够正常工作。

GPIO复用功能配置

GPIO_PinAFConfig:配置GPIO引脚的复用功能

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);  // 配置GPIOA的引脚9为USART1功能

GPIO引脚的复用功能是指将GPIO引脚用于除普通输入输出之外的其他功能。STM32的GPIO引脚不仅可以作为普通的数字输入或输出,还可以配置为其他外设功能(如USART、SPI、I2C、定时器等)的引脚。

点亮LED

#include "stm32f10x.h"  // 包含STM32F10x系列的头文件int main(void) {// 使能GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 定义并初始化GPIO结构体GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 修正拼写错误:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  // 选择引脚0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 设置输出速度为50MHz// 初始化GPIOA的引脚GPIO_Init(GPIOA, &GPIO_InitStructure);// 将GPIOA的引脚0设置为低电平GPIO_ResetBits(GPIOA, GPIO_Pin_0);  // 修正拼写错误:GPIO_ResetLBits -> GPIO_ResetBits// 主循环while (1) {// 可以在这里添加其他逻辑}
}

LED闪烁

#include "stm32f10x.h"  // 包含STM32F10x系列的头文件
#include "Delay.h"
int main(void) {// 使能GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 定义并初始化GPIO结构体GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 修正拼写错误:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  // 选择引脚0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 设置输出速度为50MHz// 初始化GPIOA的引脚GPIO_Init(GPIOA, &GPIO_InitStructure);// 主循环while (1) {GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);Delay_ms(500);}
}

流水灯

#include "stm32f10x.h"  // 包含STM32F10x系列的头文件
#include "Delay.h"
int main(void) {// 使能GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 定义并初始化GPIO结构体GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 修正拼写错误:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1|GPIO_Pin_2; // 选择引脚0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 设置输出速度为50MHzGPIO_Init(GPIOA,&GPIO_InitStructure);// 主循环while (1) {GPIO_Write(GPIOA,~0x0001);Delay_ms(500);GPIO_Write(GPIOA,~0x0002);Delay_ms(500);GPIO_Write(GPIOA,~0x0004);Delay_ms(500);GPIO_Write(GPIOA,~0x0008);Delay_ms(500);GPIO_Write(GPIOA,~0x00010);Delay_ms(500);GPIO_Write(GPIOA,~0x00020);Delay_ms(500);GPIO_Write(GPIOA,~0x00040);Delay_ms(500);GPIO_Write(GPIOA,~0x00080);Delay_ms(500);}
}

蜂鸣器

#include "stm32f10x.h"  // 包含STM32F10x系列的头文件
#include "Delay.h"
int main(void) {// 使能GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 定义并初始化GPIO结构体GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 修正拼写错误:GPIO_Mode_OUT_PP -> GPIO_Mode_Out_PPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 选择引脚0GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 设置输出速度为50MHzGPIO_Init(GPIOA,&GPIO_InitStructure);// 主循环while (1) {GPIO_Write(GPIOB,GPIO_Pin_12);Delay_ms(500);GPIO_Write(GPIOB,GPIO_Pin_12);Delay_ms(500);}
}

GPIO使用步骤:初始化时钟,然后定义结构体,赋值结构体

GPIO_Mode选择输入输出模式

GPIO_Pin选择引脚

GPIO_Speed选择速度 

OLED:有机发光二极管

OLED驱动函数

STM32中断系统

外部中断

定时器

输出比较功能

输出比较(Output Compare,OC) 是定时器(Timer)的一种功能,用于生成精确的时间信号或控制外部设备(如PWM信号、脉冲生成等)。输出比较功能通过比较定时器的计数器值(CNT)和捕获/比较寄存器(CCR)的值,来触发特定的事件(如翻转输出、产生中断等)。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"uint8_t i;			//定义在定时器中断里自增的变量int main(void)
{/*模块初始化*/OLED_Init();		//OLED初始化PWM_Init();		//定时中断初始化while (1){for(i=0;i<=100;i++){PWM_SetComparel(i);Delay_ms(10);}for(i=0;i<=100;i++){PWM_SetComparel(100-i);Delay_ms(10);}
}

http://www.ppmy.cn/embedded/155486.html

相关文章

2025年1月19日(振动控制研究历史)

振动控制研究的历史可以追溯到19世纪末&#xff0c;随着工程和物理学的快速发展&#xff0c;特别是在机械、土木和航空工程领域。以下是振动控制研究历史的一些关键节点&#xff1a; 1. 早期阶段 (19世纪末 - 20世纪初) 在19世纪末&#xff0c;工程师开始注意到机械和建筑物的…

MyBatis动态SQL标签的案例

1. 使用<if>进行条件查询 假设我们有一个用户表users&#xff0c;包含字段id, name, age。我们要根据名字和年龄来查找用户&#xff0c;但这两个条件都是可选的。 <select id"findUsers" parameterType"map" resultType"User">SEL…

今天你学C++了吗?——C++中的STL

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

嵌入式知识点总结(一)-C/C++关键字

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.C语言宏中"#“和"##"的用法 1.1.(#)字符串化操作符 1.2.(##)符号连接操作符 2.关键字volatile有什么含意?并举出三个不同的例子? 2.1.并行设备的硬件寄存…

JavaScript 代码规范

JavaScript 代码规范 1. 引言 JavaScript 是一种广泛使用的编程语言,尤其在网页开发中占据重要地位。为了确保代码的质量、可读性和可维护性,遵循一套统一的代码规范至关重要。本规范旨在为 JavaScript 开发者提供一个清晰、一致的编码标准,以促进团队合作和代码共享。 2…

RocketMQ中的一些细节

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》&#xff0c;我本人觉得这个作者还是不错&#xff0c;都是从场景来进行分析&#xff0c;感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔…

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

&#x1f525; 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用&#xff08;Enabled&#xff09; 2.3 坐标系&#xff08;Geometry&#xff09; **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题&#xff08;windowTiltle&a…

与“神”对话:Swift 语言在 2025 中的云霓之望

0. 引子 夜深人静&#xff0c;是一片极度沉醉的黑&#xff0c;这便于我与深沉的 macbook 悄悄隐秘于其中。一股异香袭来&#xff0c;恍惚着&#xff0c;撸码中身心极度疲惫、头脑昏沉的我仿佛感觉到了一束淡淡的微光轻洒在窗边。 我的对面若隐若现逐渐浮现出一个熟悉的身影。他…