问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F103入门指南:从零开始学习嵌入式开发

创作时间:
作者:
@小白创作中心

STM32F103入门指南:从零开始学习嵌入式开发

引用
CSDN
1.
https://blog.csdn.net/qq_61550717/article/details/143837894

STM32F103是STMicroelectronics公司推出的一款基于ARM Cortex-M3内核的32位微控制器。本文将带你了解STM32F103的基本概念、开发工具以及如何开始你的第一个STM32F103项目。

一、引言

STM32F103是STMicroelectronics公司推出的一款基于ARM Cortex-M3内核的32位微控制器。由于其高性能、低功耗、丰富的外设接口和易于开发等特点,在嵌入式系统领域得到了广泛的应用。本文将带你了解STM32F103的基本概念、开发工具以及如何开始你的第一个STM32F103项目。

二、软件安装准备

  1. 安装Keil5 MDK
    具体参考其他博主
    Keil5安装教程_keli5-CSDN博客
  2. 安装器件支持包
    选择F1系列进行安装
  3. 软件注册
    参考1
  4. 安装USB串口驱动

三、新建工程

这里有一个标准库模版需要自取
链接: https://pan.baidu.com/s/14JpoCxUwRlvBr-JRMkKtSg?pwd=5210 提取码: 5210
打开keli软件打开USER下的工程文件(如图)

四、开始实验

GPIO — 最基本,使用频率最高的外设
通用输入输出引脚

1.1 实验一:通过PA0点亮灯泡

RCC:
APB2外设时钟使能寄存器 RCC_APB2ENR
地址: 0x40021000 + 0x18
操作:【2】= 1:打开GPIOA的时钟(开电)
GPIO:
端口配置低寄存器 GPIOx_CRL
地址:0x40010800 + 0x00
操作:【0~3】= 0011 — 通用推挽输出,最大输出速度50Mhz
输出数据寄存器GPIOx_ODR
地址:0x40010800 + 0x0c
操作:【0】:0-灯亮,1-灯灭


#define RCC_APB2ENR  *(int*)(0x40021000+0x18)
#define GPIOA_CRL    *(int*)(0x40010800+0x00)
#define GPIOA_ODR    *(int*)(0x40010800+0x0c)
    
//寄存器:只操作自己需要的bit位
/*
int main()
{
    //int *p=(int *)(0x40021000+0x18);*p;
    //1.打开GPIOA的时钟
    RCC_APB2ENR=RCC_APB2ENR| (0x1<<2);//置一
    //2.设置模式
    GPIOA_CRL&=~(0xf<<0);
    GPIOA_CRL |=(0x3<<0);
    //3.输出高低电频
    GPIOA_ODR &=~(0x1<< 0);
    while(1);//防止跑飞
}  

这段代码的主要功能是:
使能GPIOA的时钟。
配置GPIOA的引脚0为推挽输出模式。
将GPIOA的引脚0设置为低电平。
通过无限循环防止程序跑飞。
效果如图:
(1)

(2)

1.1.1 使用库函数实现点灯


#include "stm32f10x.h"   // Device header
//顶层头文件
void delay(int n)
{
    int i;
    while(n--)
        for(i=0;i<8050;i++);
}
int main()
{
    //1.打开GPIOA的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    //2.设置PAO为通用推挽输出
    GPIO_InitTypeDef gpio_struct;
    gpio_struct.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出
    gpio_struct.GPIO_Pin = GPIO_Pin_0;
    gpio_struct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&gpio_struct);
    //3.输出高低电平
    GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//通过参数来决定输出高低电平
    while(1)
    {
        GPIO_ResetBits(GPIOA,GPIO_Pin_0);//开灯
        delay(100);
        GPIO_SetBits(GPIOA,GPIO_Pin_0);//关灯
        delay(100);	
    }
}  

效果如图:

1.2 GPIO输入输出

通用输入输出

1.2.1 GPIO八种模式

输入:
模拟输入:上下拉电阻断开,肖特基触发器断开,只能走模拟输入(ADC-采集电压大小)
浮空输入:上下拉电阻断开,肖特基触发器导通(整形电路,将外界输入的电压严格的变换为高低电平的数字信号),数字信号修改输入数据寄存器(IDR),反推通过读取IDR的值,判断外界输入的信号是1还是0
浮空的缺点:引脚悬空时,引脚电平受外界环境影响导致具体电平不确定
上拉输入:上拉电阻闭合,肖特基触发器闭合,引脚悬空时,读IDR为1,可以被外界低电平拉低
下拉输入:下拉电阻闭合,肖特基触发器闭合,引脚悬空时,读IDR为0,可以被外界高电平拉高
输出 — 高低电平(不同的电压)
通用/复用
通用:只是GPIO来控制输出
复用:其他外设(TIM,USART)来控制输出
开漏/推挽
推挽可以输出高低电平
开漏不能输出高电平
通用开漏
通用推挽
复用开漏
复用推挽

1.2.2 GPIO结构

1.2.3 GPIO位结构

1.2.4 浮空/上拉/下拉输入

1.2.5 模拟输入

1.2.6 开漏和推挽输出

1.2.7 复用开漏/推挽输出

2.1 外部设备和电路

2.1.1 LED和蜂鸣器

2.1.2 硬件电路

2.1.3 面包板

3.1 实验二—点亮三色灯

1、复制标准库模版(新建工程那提供过)重命名为RGB
2、新建文件夹APP
打开APP新建文件夹LED

添加.c和.h文件
3、打开keli5app添加文件
点击APP把创建好的.ch和.h文件添加进来
找到APP文件夹里面LED的.c和.h文件
4、添加头文件路径
找到APP文件夹里面头文件位置LED选择添加
5、编写代码
led.h


#ifndef __LED_H
#define __LED_H
#define RGB_R 1
#define RGB_G 2
#define RGB_B 4
//想给别人用的就放头文件
void RGB_Init(void);
void RGB_ON(int x);
void RGB_OFF(int x);
#endif
  

led.c


#include "led.h"
#include "stm32f10x.h"
//PB12 - R
//PB13 - G
//PB14 - B
//初始化 -- 最先执行,只需要做一次
void RGB_Init(void)
{
    //1.打开GPIOA的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    //2.设置PA0为通用推挽输出
    GPIO_InitTypeDef gpio_struct;
    gpio_struct.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出
    gpio_struct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
    gpio_struct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &gpio_struct);
}
void RGB_ON(int x)
{
    //if的条件是判断对应bit位是否为1
    if(x & RGB_R)
        GPIO_SetBits(GPIOB, GPIO_Pin_12);
    if(x & RGB_G)
        GPIO_SetBits(GPIOB, GPIO_Pin_13);
    if(x & RGB_B)
        GPIO_SetBits(GPIOB, GPIO_Pin_14);
}
void RGB_OFF(int x);  

main.c


#include "stm32f10x.h"
#include "led.h"
static  void delay(int n)
{
    int i;
    while(n--)
        for(i=0;i<8050;i++);
    
}
int main(void)
{	
    RGB_Init();
    RGB_ON(RGB_B);//蓝色灯亮
}
  

6、打开烧录软件进行烧录
找到工程文件:RGB->OBJ->Template.hex
效果

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号