STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器

1、简要说明与电路图

LED灯与蜂鸣器都是GPIO的输出操作,给高低电平实现。GPIO操作也是后续操作的基础,没有什么难度,记不住寄存器没关系,只要把流程理清楚就可以了。

端口配置成推挽输出模式,高低电平均有驱动能力。

端口配置成开漏输出模式,低电平有驱动能力,高电平无驱动能力。

2、具体步骤

(1)开启外设时钟

为了实现低功耗,STM32默认所有外设总线时钟全部关闭。要使用相应的外设,首先开启相应外设总线的时钟。由上图可知,四个LED灯都是接GPIOA组的0-3口。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

APB1是低速外设总线,APB2是高速外设总线,GPIO都是挂在APB2上的。

(2)配置GPIOA的引脚属性

a、定义GPIO结构体变量,属于GPIO结构体类型

GPIO_InitTypeDef GPIO_InitStructure;

b、配置4个端口的属性为推挽输出模式和速度为50MHZ

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //引脚4

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //引脚输入输出模式为推挽输出模式

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //引脚输出速度为50MHZ

c、初始化各端口和设置端口初值

GPIO_Init(GPIOA, &GPIO_InitStructure); //根据上面设置好的GPIO_InitStructure参数,初始化引脚GPIOA_PIN0-3

GPIO_SetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); //初始化设置引脚GPIOA0-3为高电平

(3)将这些过程操作封装成函数,可以在主程序中调用

led.c与led.h

cpp 复制代码
#include "led.h" 
#include "stm32f10x_gpio.h" 

//LED硬件初始化函数定义
void LED_Init(void)
{
	
	GPIO_InitTypeDef GPIO_InitStructure; //定义一个引脚初始化的结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟,GPIOA挂载在APB2时钟下,在STM32中使用IO口前都要使能对应时钟
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //引脚4
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //引脚输入输出模式为推挽输出模式
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //引脚输出速度为50MHZ
	GPIO_Init(GPIOA, &GPIO_InitStructure); //根据上面设置好的GPIO_InitStructure参数,初始化引脚GPIOA_PIN0-3
	
	GPIO_SetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); //初始化设置引脚GPIOA0-3为高电平
}
cpp 复制代码
#ifndef __LED_H //与 #endif 一起使用,避免重复引用头文件,提高编译效率
#define __LED_H //如果没有引用过头文件,则进入以下定义

void LED_Init(void); //定义函数原型(函数声明),一般头文件(.h文件)内都是函数原型,
                     //.c文件内都是函数定义
//该函数为LED硬件初始化函数
#endif //定义完毕,或者引用过头文件到达这一步

3、main函数

#include "stm32f10x.h" // Device header

#include "delay.h"

#include "LED.h"

#include "sys.h"

int main(void)

{

LED_Init(); //调用初始化LED函数,引用"led.h"后可使用

delay_init(); //调用初始化延迟函数,引用"delay.h"后可使用

while(1)

{

unsigned char i;

for(i=0;i<4;i++)

{

GPIO_Write(GPIOA,~(0x0001<<i));//同时对16个端口进行操作

delay_ms(300);

} //延迟300毫秒,引用"delay.h"后可使用

}

}

蜂鸣器的操作和LED一模一样,只是换个GPIO口而已,也是低电平鸣叫,这个要根据电路图来。

相关推荐
huangyuchi.18 分钟前
【Linux】LInux下第一个程序:进度条
linux·运维·服务器·笔记·进度条·c/c++
黑客老李1 小时前
JavaSec | SpringAOP 链学习分析
java·运维·服务器·开发语言·学习·apache·memcached
海的诗篇_1 小时前
移除元素-JavaScript【算法学习day.04】
javascript·学习·算法
大写-凌祁2 小时前
论文阅读:HySCDG生成式数据处理流程
论文阅读·人工智能·笔记·python·机器学习
Unpredictable2222 小时前
【VINS-Mono算法深度解析:边缘化策略、初始化与关键技术】
c++·笔记·算法·ubuntu·计算机视觉
欢乐熊嵌入式编程2 小时前
欢乐熊大话蓝牙知识14:用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞!
stm32·单片机·嵌入式硬件
傍晚冰川2 小时前
FreeRTOS任务调度过程vTaskStartScheduler()&任务设计和划分
开发语言·笔记·stm32·单片机·嵌入式硬件·学习
月初,3 小时前
MongoDB学习和应用(高效的非关系型数据库)
学习·mongodb·nosql
casual_clover3 小时前
Android 之 kotlin 语言学习笔记四(Android KTX)
android·学习·kotlin
Love__Tay4 小时前
【学习笔记】Python金融基础
开发语言·笔记·python·学习·金融