STM32学习

STM32简介

系统架构
在这里插入图片描述

新建工程

建立工程文件夹,Keil中新建工程,选择型号(STM32F103C8)
工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里
工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹
工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER
在这里插入图片描述

工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run
在这里插入图片描述

解决STLink驱动问题

在这里插入图片描述
驱动文件keil自带(64位):C:\Keil_v5\ARM\STLink\USBDriver\dpinst_amd64.exe

使用寄存器点灯

#include "stm32f10x.h"                  // Device header
int main(void)
{
	//配置三个寄存器就可以点灯
	RCC->APB2ENR=0x00000010;//打开GPIOC时钟
	GPIOC->CRH=0X00300000;//配置PC13口的模式
//	GPIOC->ODR=0x00002000;//熄灭
	GPIOC->ODR=0x00000000;//点亮
	while(1){
		
	}
}

RCC->APB2ENR=0x00000010

RCC 是 Reset and Clock Control 的缩写,用于控制STM32微控制器的时钟和重置功能。
RCC->APB2ENR:APB2 外设时钟使能寄存器
Advanced Peripheral Bus 2 Enable Register
在这里插入图片描述

GPIOC->CRH=0X00300000;

GPIOC 代表了GPIO端口C,是微控制器上一个用于通用输入输出的端口。
CRH 是 Control Register High 的缩写,用于设置GPIO端口的高位引脚(通常是8-15号引脚)的模式和输出类型。
0000 0000 0011 0000 0000 0000 0000 0000,其中 0011 对应13号引脚
在这里插入图片描述

GPIOC->ODR=0x00002000;

ODR 是 Output Data Register 的缩写,用于控制GPIO端口上的引脚输出。
0x00002000 是用来设置端口输出的数据。这个值在二进制中为 0000 0000 0000 0000 0010 0000 0000 0000,这里主要设置了13号引脚为高电平,通常这意味着点亮连接到该引脚的LED灯
在这里插入图片描述

在这里插入图片描述

使用库函数点灯

	//使用库函数点灯
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//启用了GPIOC的时钟
	//配置端口模式
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//0x10,设置GPIO端口的模式为推挽输出(Push-Pull Output)
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//配置的引脚是13号引脚
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//引脚的速度为50MHz,这是输出信号变化的最大频率。
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	//GPIO_SetBits(GPIOC,GPIO_Pin_13);//设置Pin13高电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);//设置Pin13低电平
	while(1){
		
	}

GPIO

  • GPIO(General Purpose Input Output)通用输入输出口
  • 可配置为8种输入输出模式
  • 引脚电平:0V~3.3V,部分引脚可容忍5V
  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
    在这里插入图片描述
    在这里插入图片描述
    一个端口只能有一个输出,但可以有多个输入
    在GPIO的这8种模式中,除了模拟输入这个模式会关闭数字的输入功能,其他模式,输入功能均有效
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

TTL肖特基触发器(施密特触发器)阙值,防抖在这里插入图片描述

GPIO输出

在这里插入图片描述

开漏输出、开漏复用输出、推挽输出、推挽复用输出

开漏输出

I2C通信的引脚
P-MOS无效,N-MOS有效
当数据为0时 上管无效,下管导通,输出直接接到VSS,就是输出低电平
在这里插入图片描述
当数据为1时 上管无效,下管断开 高阻模式

在这里插入图片描述
输出5v的电平信号(高电平)
在这里插入图片描述

复用开漏输出

复用推挽输出

在这里插入图片描述

推挽输出

P-MOS N-MOS均有效
推挽模式下,STM32对IO口具有绝对的控制权,高低电平都由STM32说的算.
数据寄存器位为1时:上管导通,下管断开,输出直接接到VDD,就是输出高电平
在这里插入图片描述

数据寄存器位为0时:上管断开,下管导通,输出直接接到VSS,就是输出低电平
在这里插入图片描述

LED闪烁&LED流水灯&蜂鸣器

LED闪烁

\STM32入门教程资料\程序源码\STM32Project-无注释版\1-1 接线图
在这里插入图片描述

在这里插入图片描述
操作STM-32的GPIO需要三个步骤
第一步:使用RCC开启GPIO时钟
第二步:使用GPIO_Init初始化GPIO
第三步:使用输出或输入函数控制GPIO

测试开漏模式的高电平

LED流水灯

在这里插入图片描述

	//时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//初始化
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	while(1){
		//给电 流水灯点亮
		unsigned char i=0;
		for(i=0;i<8;i++){
			GPIO_Write(GPIOA, ~(0x001<<i));	//0000 0000 0000 0001,PA0引脚为低电平,其他引脚均为高电平,注意数据有按位取反
			Delay_ms(500);				//延时100ms
		}
	}

蜂鸣器

在这里插入图片描述

	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//开启GPIOB的时钟
															//使用各个外设前必须开启时钟,否则对外设的操作无效
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				//GPIO引脚,赋值为第12号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
															//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOB的初始化
	
	/*主循环,循环体内的代码会一直循环执行*/
	while (1)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_11);		//将PB12引脚设置为低电平,蜂鸣器鸣叫
		Delay_ms(100);							//延时100ms
		GPIO_SetBits(GPIOB, GPIO_Pin_11);		//将PB12引脚设置为高电平,蜂鸣器停止
		Delay_ms(100);							//延时100ms
		GPIO_ResetBits(GPIOB, GPIO_Pin_11);		//将PB12引脚设置为低电平,蜂鸣器鸣叫
		Delay_ms(100);							//延时100ms
		GPIO_SetBits(GPIOB, GPIO_Pin_11);		//将PB12引脚设置为高电平,蜂鸣器停止
		Delay_ms(700);							//延时700ms
	}

GPIO输入

输出断开
在这里插入图片描述

浮空输入

P-MOS,N-MOS均无效,电平取决于输入数据
在这里插入图片描述

上拉输入

P-MOS有效

下拉输入

N-MOS有效

模拟输入

两个MOS管均无效,端口的信号由外部信号控制。ADC配置模拟输入在这里插入图片描述

按键控制LED&光敏传感器控制蜂鸣器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值