当前位置:网站首页>STM32 GPIO LED和蜂鸣器实现【第四天】
STM32 GPIO LED和蜂鸣器实现【第四天】
2022-08-03 15:45:00 【红客白帽】
STM32 GPIO LED实现
原理图
寄存器总图

启动 汇编
时钟树
一 、STM32大小说明
栈大小:1024Kbyte
堆大小:512byte
单片机内存:192Kbyte CPU -> 寄存器->R0 =systemInit :初始化函数(配置) ->main执行主函数
二、STM32时钟分析
寄存器:寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成 在计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制寄存器。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
MCU: 微控制单元(MCU) ,又称单片微型计算机或者单片机,是把中央处理器(CPU)的频率与规格做适当缩减,并将
内存(memory)、计数器(Timer)、 USB、A/D转换、UART(通用异步收发传输器)、PLC(可编程逻辑控制器)、 DMA(直接内存访问)等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。
控制寄存器:相当一排可通过0/1进行设置外设功能的开关,程序中通过地址查找到对应的寄存器,所以说控制寄存器的地址是唯一。
芯片时钟:芯片工作时,是需要脉冲,脉冲相当于给芯片起振,可保证芯片的正常工作,类似于人,心脏正常跳动,人体生命特征才能正常。
1HZ:一秒产生1个脉冲
频率换算单位:
1GHZ = 1000MHZ = 1000 000KHZ = 1000 000 000HZ
STM32时钟源: 时钟源是可以产生器件。
LSIRC 32KHZ 32 kHz 低速内部 RC (LSIRC)
LSEOSC 32.168KHZ 32.768 kHz 低速外部晶振( LSE 晶振)
HSIRC 16MHZ 16MHZ 高速内部 RC (LSIRC)
HSEOSC 4-26MHZ 4-26MHZ高速外部晶振(HSE 晶振)
粤嵌开发板外部晶振为8MHZ
STM32主要总线时钟频率
SYSCLK 168MHZ
HCLK 168MHZ
AHB1/AHB2 168MHZ
APB1 42MHZ
APB2 84MHZ
三、GPIO分析
GPIO: GPIO(英语:General-purpose input/output),通用型之输入输出) GPIO分组
STM32F407ZET6(芯片型号)
- 一共有7组IO口(PA PB PC PD PE PF PG)
- 每组IO口有16个IO引脚
- 一共16X7=112个IO引脚
外加2个PH0和PH1
一共114个IO口引脚(I:input O:output) IO引脚口:114

每组(PA PB PC PD PE PF PG)通用 I/O 端口包括:
•4 个 32 位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)。
•2 个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)。
•1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、
•1 个 32 位锁定寄存器(GPIOx_LCKR)
•2 个 32 位复用功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。(高 低)
GPIO工作方式(寄存器设置GPIO工作方式)
4种输入模式
`浮空输入(没有上下拉电阻) 上拉输入(有上拉电阻) 下拉输入(有下拉电阻) 模拟输入`
4种输出模式
`开漏输出(带上拉或者下拉) 开漏复用功能(带上拉或者下拉) 推挽式输出(带上拉或者下拉) 推挽是复用功能(带上拉或者下拉)`
4种最大输出速度
`2MHZ 25MHZ 50MHZ 100MHZ`
1.注意点
开漏输出只能输出0(低电平),若想出输出1(高电平),需要外部接上拉电阻(类似到51单片机P0组)。
推挽式输出可输出0(低电平)或者1(高电平),这是常用模式
四、寄存器地址查找
寄存器地址 = 寄存组基地址+偏移地址

1、写出GPIOF外设的所有寄存器地址
GPIOF_MODER = 0x42001400 + 0x00 = 0x40021400
GPIOF_OTYPER = 0x42001400 + 0x04 = 0x40021404
GPIOF_OSPEEDR = 0x42001400 + 0x08 = 0x40021408
GPIOF_PUPDR = 0x42001400 + 0x0C = 0x4002140C
GPIOF_IDR = 0x42001400 + 0x10 = 0x40021410
GPIOF_ODR = 0x42001400 + 0x14 = 0x40021414
GPIOF_BSRR = 0x42001400 + 0x18 = 0x40021418
GPIOF_LCKR = 0x42001400 + 0x1C = 0x4002141C
GPIOF_AFRL = 0x42001400 + 0x20 = 0x40021420
GPIOF_AFRH = 0x42001400 + 0x24 = 0x4002142C

五、LED灯开发
1、理解led灯原理图
LED0连接在PF9
PF9输出低电平(0), 灯亮;
PF9输出高电平(1),灯灭;

2、打开GPIOF组时钟
//将第5位置1 使能GPIOF组时钟 RCC_AHB1ENR |= (0x01<<5);
设置PF9灯为输出模式 输出推挽上拉速度(50MHZ)
4、通过GPIOF_BSRR控制LED灯亮与灭
举例:
① 寄存器实现函数lcd.h RCC_AHB1ENR

5.设置时钟
#define RCC_AHB1ENR (*((unsigned int *)(0x40023800+0x30)))
//值强制类型转为地址,通过地址解引用,访问地址空间的值
设置端口模式 2y+1:2y y=寄存器的PFy

#define GPIOF_MODER (*((unsigned int *)(0x40021400+0x00)))
//值强制类型转为地址,通过地址解引用,访问地址空间的值 //板子灯:D1 D2
#define GPIOE_MODER (*((unsigned int *)(0x40021000+0x00)))
//值强制类型转为地址,通过地址解引用,访问地址空间的值 //板子灯:D3 D4
6.设置输出类型

#define GPIOF_OTYPER (*((unsigned int *)(0x40021400+0x04)))
//值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_OTYPER (*((unsigned int *)(0x40021000+0x04)))
//值强制类型转为地址,通过地址解引用,访问地址空间的值
设置端口速度 2y:2y+1 y=要配置的操作位
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08)))
//值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_OSPEEDR (*((unsigned int *)(0x40021000+0x08)))
//值强制类型转为地址,通过地址解引用,访问地址空间的值
7.设置上拉电阻

#define GPIOF_PUPDR (*((unsigned int *)(0x40021400+0x0C)))
//值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_PUPDR (*((unsigned int *)(0x40021000+0x0C)))
//值强制类型转为地址,通过地址解引用,访问地址空间的值

GPIOF_BSRR设置输出控制
#define GPIOF_ODR (*((unsigned int *)(0x40021400+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_ODR (*((unsigned int *)(0x40021000+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
GPIOF_BSRR设置控制位 灯亮和蜂鸣器
#define GPIOF_BSRR (*((unsigned int *)(0x40021400+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_BSRR (*((unsigned int *)(0x40021000+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
举例
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
//设置时钟
#define RCC_AHB1ENR (*((unsigned int *)(0x40023800+0x30))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_MODER (*((unsigned int *)(0x40021400+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_OTYPER (*((unsigned int *)(0x40021400+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_PUPDR (*((unsigned int *)(0x40021400+0x0C))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_ODR (*((unsigned int *)(0x40021400+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_BSRR (*((unsigned int *)(0x40021400+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_MODER (*((unsigned int *)(0x40021000+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_OTYPER (*((unsigned int *)(0x40021000+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_OSPEEDR (*((unsigned int *)(0x40021000+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_PUPDR (*((unsigned int *)(0x40021000+0x0C))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_ODR (*((unsigned int *)(0x40021000+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_BSRR (*((unsigned int *)(0x40021000+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
void Led_Init(void);
//分别初始化各个D1 -- D4的灯函数
void Led0(void);
void Led1(void);
void Led2(void);
void Led3(void);
void Beep(void); //蜂鸣器
#endif
② 寄存器实现函数lcd.c
void Led0() //针对D1 D2灯 GPIOF_XXXX形式
{
//设置GPIOF9为输出模式
GPIOF_MODER &= ~(0x01<<19); //19位清0
GPIOF_MODER |= (0x01<<18); //18位置1
//设置GPIOF9为输出推挽
GPIOF_OTYPER &= ~(0x01<<9); //9位清0
//设置GPIOF9为上拉
GPIOF_PUPDR &= ~(0x01<<19); //19位清0
GPIOF_PUPDR |= (0x01<<18); //18位置1
//设置GPIOF9输出速度50MHZ
GPIOF_OSPEEDR |= (0x01<<19); //19位置1
GPIOF_OSPEEDR &= ~(0x01<<18); //18位清0
}
//***************************************************************************************
void Led2() //针对D1 D2灯 GPIOE_XXXX形式
{
//设置GPIOF13为输出模式
GPIOE_MODER &= ~(0x01<<27); //27位清0
GPIOE_MODER |= (0x01<<26); //26位置1
//设置GPIOE输出速度为50MHZ
GPIOE_OSPEEDR |= (0x01<<26); //26位置1
GPIOE_OSPEEDR &= ~(0x01<<27); //27为清0
//设置GPIOE为上拉
GPIOE_PUPDR &= ~(0x01<<27); //27位清0
GPIOE_PUPDR |= (0x01<<26); //26位置1
//设置GPIOE为输出推挽
GPIOE_OTYPER &= ~(0x01<<13); //13位清0
}
解释:模式 速度 上拉 操作的对应位
D1(19 - 18位) D2 (21 -20):设置相关参数
D3(27 - 26位) D4 (29 -28):设置相关参数
解释:推挽 GPIOF_OTYPER 操作的对应位0
D1(9位清0) D2 (10位清0)
D3(13位清0) D4 (14位清0)
③ 寄存器实现函数main.c GPIOX_BSRR->ODR
板子:D1 --D2灯 GPIOF_BSRR
` BSRR 25位置1 ODR输出0 Led0灯亮 D1亮 BSRR 9位置1 ODR输出1 Led0灯灭 D1灭 BSRR 26位置1 ODR输出0 Led1灯亮 D2亮 BSRR 10位置1 ODR输出1 Led1灯灭 D2灭 `
板子:D3 --D4灯 GPIOE_BSRR
` BSRR 29位置1 ODR输出0 Led2灯亮 D3亮 BSRR 13位置1 ODR输出1 Led2灯灭 D3灭 BSRR 30位置1 ODR输出0 Led3灯亮 D4亮 BSRR 14位置1 ODR输出1 Led3灯灭 D4灭 `
六、蜂鸣器
蜂鸣器位的控制 复位和置位BSRR
` //BSRR 24位置1 ODR输出0 蜂鸣器关 GPIOE_BSRR |= (0x01<<24); //BSRR 8位置1 ODR输出1 蜂鸣器开 GPIOE_BSRR |= (0x01<<8); `
七、问题上、下拉电阻作用
> 1、请解释上、下拉电阻作用
上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。【灌电流】
1、当TTL电路驱动CMOS电路时,如果电路输出的高电平低于CMOS电路的最低高电平(一般为3.5V),
这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。U=IR 2、OC门电路必须使用上拉电阻,以提高输出的高电平值。
3、为增强输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。
4、在CMOS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻以降低输入阻抗, 提供泄荷通路。
5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限,增强抗干扰能力。
6、提高总线的抗电磁干扰能力,管脚悬空就比较容易接受外界的电磁干扰。
7、长线传输中电阻不匹配容易引起反射波干扰,加上、下拉电阻是电阻匹配,有效的抑制反射波干扰。
下拉电阻是直接接到地上,接二极管的时候电阻末端是低电平。【拉电流】
1、提高电压准位 同时管脚悬空就比较容易接受外界的电磁干扰。
2、电阻匹配,抑制反射波干扰:长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。
3、预设空间状态/缺省电位:在一些 CMOS 输入端接上或下拉电阻是为了预设缺省电位。 当你不用这些引脚的时候, 这些输入端下拉接 0
或上拉接 1。在I2C总线等总线上,空闲时的状态是由上下拉电阻获得
4、提高芯片输入信号的噪声容限:输入端如果是高阻状态,或者高阻抗输入端处于悬空状态,此时需要加上拉或下拉,以免收到随机电平而影响电路工作。
七、流水灯代码
MAIN.C
#include "stm32f4xx.h"
#include "led.h"
void delay(int n)
{
int i,j;
for(i=0; i<n; i++)
for(j=0; j<30000; j++);
}
int main(void)
{
Led_Init(); //初始化led
while(1)
{
//BSRR 25位置1 ODR输出0 Led0灯亮
GPIOF_BSRR |= (0x01<<25);
delay(1000);
//BSRR 9位置1 ODR输出1 灯灭
GPIOF_BSRR |= (0x01<<9);
//delay(1000);
//BSRR 26位置1 ODR输出0 Led1灯亮
GPIOF_BSRR |= (0x01<<26);
delay(1000);
//BSRR 10位置1 ODR输出1 灯灭
GPIOF_BSRR |= (0x01<<10);
//delay(1000);
//BSRR 29位置1 ODR输出0 Led2灯亮
GPIOE_BSRR |= (0x01<<29);
delay(1000);
//BSRR 13位置1 ODR输出1 灯灭
GPIOE_BSRR |= (0x01<<13);
//delay(1000);
//BSRR 30位置1 ODR输出0 Led3灯亮
GPIOE_BSRR |= (0x01<<30);
delay(1000);
//BSRR 14位置1 ODR输出1 灯灭
GPIOE_BSRR |= (0x01<<14);
delay(1000);
}
return 0;
}
LED.H
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
//设置时钟
#define RCC_AHB1ENR (*((unsigned int *)(0x40023800+0x30))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_MODER (*((unsigned int *)(0x40021400+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_OTYPER (*((unsigned int *)(0x40021400+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_PUPDR (*((unsigned int *)(0x40021400+0x0C))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_ODR (*((unsigned int *)(0x40021400+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_BSRR (*((unsigned int *)(0x40021400+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_MODER (*((unsigned int *)(0x40021000+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_OTYPER (*((unsigned int *)(0x40021000+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_OSPEEDR (*((unsigned int *)(0x40021000+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_PUPDR (*((unsigned int *)(0x40021000+0x0C))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_ODR (*((unsigned int *)(0x40021000+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_BSRR (*((unsigned int *)(0x40021000+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
void Led_Init(void);
//分别初始化各个D1 -- D4的灯函数
void Led0(void);
void Led1(void);
void Led2(void);
void Led3(void);
//void Beep(void);
#endif
LED.C
#include "led.h"
void Led_Init(void)
{
//将第5位置1 使能GPIOF组时钟
RCC_AHB1ENR |= (0x01<<5);
//将第4位置1 使能GPIOE组时钟
RCC_AHB1ENR |= (0x01<<4);
Led0();
Led1();
Led2();
Led3();
}
/********************************* 引脚说明: LED0 -- PF9 **********************************/
void Led0()
{
//设置GPIOF9为输出模式
GPIOF_MODER &= ~(0x01<<19); //19位清0
GPIOF_MODER |= (0x01<<18); //18位置1
//设置GPIOF9为输出推挽
GPIOF_OTYPER &= ~(0x01<<9); //9位清0
//设置GPIOF9为上拉
GPIOF_PUPDR &= ~(0x01<<19); //19位清0
GPIOF_PUPDR |= (0x01<<18); //18位置1
//设置GPIOF9输出速度50MHZ
GPIOF_OSPEEDR |= (0x01<<19); //19位置1
GPIOF_OSPEEDR &= ~(0x01<<18); //18位清0
}
/********************************* 引脚说明: LED1 -- PF10 **********************************/
void Led1()
{
//设置GPIOF10为输出模式
GPIOF_MODER &= ~(0x01<<21); //21位清0
GPIOF_MODER |= (0x01<<20); //20位置1
//设置GPIOF9为输出推挽
GPIOF_OTYPER &= ~(0x01<<10); //10位清0
//设置GPIOF9为上拉
GPIOF_PUPDR &= ~(0x01<<21); //21位清0
GPIOF_PUPDR |= (0x01<<20); //20位置1
//设置GPIOF9输出速度50MHZ
GPIOF_OSPEEDR |= (0x01<<21); //21位置1
GPIOF_OSPEEDR &= ~(0x01<<20); //20位清0
}
/********************************* 引脚说明: LED2 -- PE13 **********************************/
void Led2()
{
//将第4位置1 使能GPIOE组时钟
//RCC_AHB1ENR |= (0x01<<4);
//设置GPIOF13为输出模式
GPIOE_MODER &= ~(0x01<<27); //27位清0
GPIOE_MODER |= (0x01<<26); //26位置1
//设置GPIOE输出速度为50MHZ
GPIOE_OSPEEDR |= (0x01<<26); //26位置1
GPIOE_OSPEEDR &= ~(0x01<<27); //27为清0
//设置GPIOE为上拉
GPIOE_PUPDR &= ~(0x01<<27); //27位清0
GPIOE_PUPDR |= (0x01<<26); //26位置1
//设置GPIOE为输出推挽
GPIOE_OTYPER &= ~(0x01<<13); //13位清0
}
/********************************* 引脚说明: LED3 -- PE14 **********************************/
void Led3()
{
//设置GPIOE14为输出模式
GPIOE_MODER &= ~(0x01<<29); //29位清0
GPIOE_MODER |= (0x01<<28); //28位置1
//设置GPIOE输出速度为50MHZ
GPIOE_OSPEEDR |= (0x01<<28); //28位置1
GPIOE_OSPEEDR &= ~(0x01<<29); //29为清0
//设置GPIOE为上拉
GPIOE_PUPDR &= ~(0x01<<29); //29位清0
GPIOE_PUPDR |= (0x01<<28); //28位置1
//设置GPIOE为输出推挽
GPIOE_OTYPER &= ~(0x01<<14); //14位清0
}
八、蜂鸣器代码
main.c
#include "stm32f4xx.h"
#include "led.h"
void delay(int n)
{
int i,j;
for(i=0; i<n; i++)
for(j=0; j<30000; j++);
}
int main(void)
{
Led_Init();
while(1)
{
GPIOF_BSRR |= (0x01<<8); //开
delay(3000);
GPIOF_BSRR |= (0x01<<24); //关
}
return 0;
}
Led.c
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
//设置时钟
#define RCC_AHB1ENR (*((unsigned int *)(0x40023800+0x30))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_MODER (*((unsigned int *)(0x40021400+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_OTYPER (*((unsigned int *)(0x40021400+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_PUPDR (*((unsigned int *)(0x40021400+0x0C))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_ODR (*((unsigned int *)(0x40021400+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_BSRR (*((unsigned int *)(0x40021400+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_MODER (*((unsigned int *)(0x40021000+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_OTYPER (*((unsigned int *)(0x40021000+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_OSPEEDR (*((unsigned int *)(0x40021000+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_PUPDR (*((unsigned int *)(0x40021000+0x0C))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_ODR (*((unsigned int *)(0x40021000+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_BSRR (*((unsigned int *)(0x40021000+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
void Led_Init(void);
//分别初始化各个D1 -- D4的灯函数
void Led0(void);
void Led1(void);
void Led2(void);
void Led3(void);
void Beep(void);
#endif
led.c
#include "led.h"
void Led_Init(void)
{
//将第5位置1 使能GPIOF组时钟
RCC_AHB1ENR |= (0x01<<5);
//将第4位置1 使能GPIOE组时钟
RCC_AHB1ENR |= (0x01<<4);
Led0();
Led1();
Led2();
Led3();
Beep();
}
/********************************* 引脚说明: LED0 -- PF9 **********************************/
void Led0()
{
//设置GPIOF9为输出模式
GPIOF_MODER &= ~(0x01<<19); //19位清0
GPIOF_MODER |= (0x01<<18); //18位置1
//设置GPIOF9为输出推挽
GPIOF_OTYPER &= ~(0x01<<9); //9位清0
//设置GPIOF9为上拉
GPIOF_PUPDR &= ~(0x01<<19); //19位清0
GPIOF_PUPDR |= (0x01<<18); //18位置1
//设置GPIOF9输出速度50MHZ
GPIOF_OSPEEDR |= (0x01<<19); //19位置1
GPIOF_OSPEEDR &= ~(0x01<<18); //18位清0
}
/********************************* 引脚说明: LED1 -- PF10 **********************************/
void Led1()
{
//设置GPIOF10为输出模式
GPIOF_MODER &= ~(0x01<<21); //21位清0
GPIOF_MODER |= (0x01<<20); //20位置1
//设置GPIOF9为输出推挽
GPIOF_OTYPER &= ~(0x01<<10); //10位清0
//设置GPIOF9为上拉
GPIOF_PUPDR &= ~(0x01<<21); //21位清0
GPIOF_PUPDR |= (0x01<<20); //20位置1
//设置GPIOF9输出速度50MHZ
GPIOF_OSPEEDR |= (0x01<<21); //21位置1
GPIOF_OSPEEDR &= ~(0x01<<20); //20位清0
}
/********************************* 引脚说明: LED2 -- PE13 **********************************/
void Led2()
{
//将第4位置1 使能GPIOE组时钟
//RCC_AHB1ENR |= (0x01<<4);
//设置GPIOF13为输出模式
GPIOE_MODER &= ~(0x01<<27); //27位清0
GPIOE_MODER |= (0x01<<26); //26位置1
//设置GPIOE输出速度为50MHZ
GPIOE_OSPEEDR |= (0x01<<26); //26位置1
GPIOE_OSPEEDR &= ~(0x01<<27); //27为清0
//设置GPIOE为上拉
GPIOE_PUPDR &= ~(0x01<<27); //27位清0
GPIOE_PUPDR |= (0x01<<26); //26位置1
//设置GPIOE为输出推挽
GPIOE_OTYPER &= ~(0x01<<13); //13位清0
}
/********************************* 引脚说明: LED3 -- PE14 **********************************/
void Led3()
{
//设置GPIOE14为输出模式
GPIOE_MODER &= ~(0x01<<29); //29位清0
GPIOE_MODER |= (0x01<<28); //28位置1
//设置GPIOE输出速度为50MHZ 2y:2y 2*14:2*14+1 28:29
GPIOE_OSPEEDR |= (0x01<<28); //28位置1
GPIOE_OSPEEDR &= ~(0x01<<29); //29为清0
//设置GPIOE为上拉
GPIOE_PUPDR &= ~(0x01<<29); //29位清0
GPIOE_PUPDR |= (0x01<<28); //28位置1
//设置GPIOE为输出推挽
GPIOE_OTYPER &= ~(0x01<<14); //14位清0
}
//设置蜂鸣器
void Beep(void)
{
//设置GPIOE8为01 输出模式
GPIOF_MODER &= ~(0x01<<17); //0
GPIOF_MODER |= (0x01<<16); //1
//设置GPIOE输出速度为50MHZ
GPIOF_OSPEEDR |= (0x01<<17); //1
GPIOF_OSPEEDR &= ~(0x01<<16); //0
//设置GPIOE为上拉
GPIOF_PUPDR &= ~(0x01<<17); //0
GPIOF_PUPDR |= (0x01<<16); //1
//设置GPIOE为输出推挽
GPIOF_OTYPER &= ~(0x01<<24); //0
}
边栏推荐
- ubiquant量化竞赛
- Js array method is summarized
- 如何将二维空间先验注入到ViT中? UMA&港理工&阿里提出SP-ViT,为视觉Transformer学习2D空间先验知识!...
- 0 code 4 steps to experience IoT devices on the cloud
- 如何用二分法搜索、查找旋转数组中是否含有某个(目标)值? leetcode 81.搜索旋转排序数组
- 兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00
- 土耳其国防部:联合协调中心将对首艘乌克兰粮船进行安全检查
- leetcode:899. 有序队列【思维题】
- 问题6:下拉框测试点
- leetcode: 899. Ordered Queue [Thinking Question]
猜你喜欢

leetcode:899. 有序队列【思维题】

MySQL中的基数是啥?

DC-DC 2C (40W/30W) JD6606SX2 power back application

AWS China SDN Connector

【码蹄集新手村600题】将一个函数定义宏

30W 2C(JD6606S + FP6652X2)BOM

自定SvgIcon公用组件

力扣1206. 设计跳表--SkipList跳表是怎么跳的?

Daily practice------There are 10 numbers that are required to be output from large to small by selection method

Awesome!Coroutines are finally here!Thread is about to be in the past
随机推荐
【899. 有序队列】
The general trend, another key industry related to Sino-US competition, has reached a critical moment
一通骚操作,我把SQL执行效率提高了10000000倍!
GTK实现旋转加载动画
How to play deep paging with hundreds of millions of data?Compatible with MySQL + ES + MongoDB
ModelWhale 云端运行 WRF 中尺度数值气象模式,随时随地即开即用的一体化工作流
Flink作业调度详解
MySQL中的基数是啥?
2021年12月电子学会图形化三级编程题解析含答案:数星星
一次做数据报表的踩坑经历,让我领略了数据同步增量和全量的区别
问题7:功能测试花瓶用例
土耳其国防部:联合协调中心将对首艘乌克兰粮船进行安全检查
STM32H743VIT6配置ADC为1M采样率
微电网和直流电网中最优潮流(OPF)的凸优化(Matlab代码实现)
Awesome!Coroutines are finally here!Thread is about to be in the past
No inner demons, to dry!SQL optimization and diagnosis
方舟生存进化开服需要多少钱
随笔-UGUI中LayoutGroup来自适应长度图片长度
问题6:下拉框测试点
Windows服务器如何防止黑客入侵的安全设置


