STM32笔记(1)

STM32学习

本人也是跟着江科大的视频学习的

工具

  1. 面包板、杜邦线(公对公、母对母...)、STM32最小系统版、STLink V2、OLED显示屏、keil5 MDK(软件)、发光二极管、9g舵机、TB6612舵机驱动器、万用表、示波器、镊子,按键、LED
  2. 学习资料参照江科协的stm32教学
  3. STM32F10xxx参考手册(中文)

[1-1] 课程简介_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1th411z7sn?p=1&vd_source=056851316dfd6bb903466f4e076f4b7e

使用及问题

硬件单元(元器件)

  1. 将STM32最小系统版插在面包板上(要使劲点,把是所有引脚插进去,不然接触不良),下面插入0.9寸OLED屏幕(主要是调试和显示),STLink(插在电脑上用于程序下载和供电),LED,按键
  2. 带插针的模块可以用杜邦线链接在面包板上,或者跨接在面包板中间,再进行连线。
  3. 面包板能进行任意电路的连接,方便连线和修改,有利于结合不同的模块进行开发和学习,也可以避免开发板的一些问题(引脚冲突、引脚无法跟改等),
  4. keil5 MDK 的安装可以和keil C51安装在一个文件夹路径里(就是方便),

常见问题

  1. 面包板——程序现象出不来可能是接线问题

如图所示:

  1. ST-Link——接线要严格按照图片接,如果接错了的话,当连上电源无法烧录程序(当你摸ST-Link非常非常非常非常烫且不能正常使用,恭喜你,烧了

  1. 写程序时尽量每个独立字符之间空格

  • 在中断编程里不要写耗时长的代码,中断函数要简短快速,是处理突发事件的
  • 不用再中断函数和主函数调用相同的函数或者操作同一个硬件,

STM32

STM32 简介

  1. STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器
  2. STM32常应用在嵌入式领域:如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等
  3. STM32功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器

ARM

  1. ARM既指ARM公司,也指ARM处理器内核
  2. ARM公司是全球领先的半导体知识产权(IP)提供商,全世界超过95%的智能手机和平板电脑都采用ARM架构
  3. ARM公司设计ARM内核,半导体厂商完善内核周边电路并生产芯片

  1. R系列的应用场景比较小,内核型号不多,我用的是STM32F103c8t6的型号(F1系列)

  1. RAM是运行内存,实际的存储介质是SRAM
  2. ROM是程序存储器,实际的存储介质是Flash闪存(如今的单片机和电子设备基本上都是Flash
  3. 供电不能用5V,要用5V就需要稳压芯片降压到3.3V

外设(peripheral)

  1. 通过程序配置外设实现功能
  2. 深绿色的是位于Cortex-M3内核里面的外设
NVIC
  • 内核用于管理中断的设备,比如配置中断优先级等等
SysTick
  • 内核里面的定时器,主要是给操作系统提供定时服务的,STM32可以加入操作系统(如:FreeRTOS、UCOS),需要ST提供定时进行任务切换功能,可以代替Delay函数的功能
RCC
  1. 复位和时钟控制,可以对系统时钟进行配置,使能各个模块的时钟
  2. STM32 其他外设上电默认没有时钟,所以~不给时钟的情况下,操作外设是无效的(为了降低功耗),
  3. 所以操作外设必须先使能时钟!!!!!所以操作外设必须先使能时钟!!!!!所以操作外设必须先使能时钟!!!!!(用RCC完成时钟使能)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

GPIO
  1. 通用IO口,可以点灯,读取按键等
TIM
  1. 高级定时器、通用定时器、基本定时器
  2. 可以定时中断,还可以完成测频率、生成PWM波形(电机驱动、舵机驱动)、配置成专用的编码器接口......

命名规则

系统结构

  1. AHB(先进高性能总线,连接高级或基本外设)系统总线用于挂载主要的外设(如:复位和时钟控制)
  2. 桥接(因为AHB和APB总线协议、速度、传输格式不同,需要桥接完成数据的转换和缓存)两个APB1(先进外设总线,连接一般外设)和APB2
  3. 性能:AHB(72MHZ)>APB2(72MHZ)>APB1(36MHZ)

引脚定义

红色

蓝色

绿色

FT

No FT

电源相关的引脚

最小系统相关的引脚

IO口、功能口引脚

容忍5V电压

3.3V电压

启动配置

  1. x为接任意,0表示接地,1表示接+3.3V电源

软件安装

  1. 安装Keil5 MDK
  2. 安装器件支持包
  3. 软件注册
  4. 安装STLINK(安装过Keil c51,在ARM里面就有了
  5. 安装USB转串口驱动(同上)

新建工程

STM32的开发方式

  1. 基于寄存器的方式(同51一样的,用程序直接配置寄存器,底层、高效),但是STM32结构复杂,寄存器太多了
  2. 基于标准库的方式(库函数)——ST官方封装好的函数进行调用
  3. 基于HAL库的方式 —— 图形化界面快速配置STM32

标准库压缩包:

通用的新建工程步骤

[3-2] LED闪烁&LED流水灯&蜂鸣器_哔哩哔哩_bilibili

  1. 桌面新建文件夹(stm32project)
  2. 打开Keil5
  3. 依次点击打开project,New uVision project,选择stm32projec,在stm32projec内新建文件夹stm32工程模板(文件名:project),点击确定
  4. 芯片型号选择STM32F103C8,点击OK
  5. 在stm32工程模板文件夹内新建文件夹:library(存放库函数)、user(存放主函数)、start
  6. 打开固件库,地址如E:\stm32学习资料\STM32\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm,全选文件复制粘贴到start里面;把STM32F10x下的stm32f10x.h(用来描述STM32有哪些寄存器和对应地址的)、system_stm32f10x.c、system_stm32f10x.h(配置时钟的)复制粘贴到start;将E:\stm32学习资料\STM32\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport里面的文件复制粘贴到start里面;
  7. 在keil5里面新建start添加工程的文件(启动文件只添加md.s后缀的文件,然后把所以.c和.h文件添加进来)
  8. 添加头文件路径:点击魔术棒按钮,在C/C++里面的include paths把start的路径添加进来
  9. 配置调试器:打开魔术棒按钮,Debug-ST-Link Debugger-settings-Flash DownLoad-Reset and Run勾上
  10. 把E:\stm32学习资料\STM32\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver里面的ins和src所有的文件复制粘贴到library里面;把E:\stm32学习资料\STM32\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template里面的三个STM32F10x文件复制粘贴到user里面

就是下面这三个文件

用来配置库函数头文件的包含关系;用来参数检查的库函数定义

存放中断函数的

  1. 打开跳转到头文件stm32f10x.h里面的296行,复制USE_STDPERIPH_DRIVER,打开魔术棒C/C++,在Define里面粘贴,像上面一样添加头文件路径paths

你也可以直接复制工程模板

以上的就是基本的建工程步骤了,以后可以套用模版,接下来的是在user中配置main函数

利用库函数点亮PC13口

  1. 无论是哪个项目工程,上电之后都要先进行时钟的使能(APB2外设时钟控制)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //时钟使能

  1. 配置端口模式(根据结构体参数配置GPIO)
  2. 选择需要哪一个GPIO,定义GPIO_InitTypeDef结构体
  3. 要先定义一个结构体GPIO_InitTypeDef GPIO_InitStructure;并且把结构体的每一个参数填上
  4. 在GPIO_Init()函数里面填上对应的东西

GPIO_InitTypeDef GPIO_InitStructure;    //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //通用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;    //引脚定义
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //速度
GPIO_Init(GPIOC,&GPIO_InitStructure); //第一个是选择GPIOx,第二个是一个指向结构体的指针
  1. 设置端口的高低电平点灯(高灭低亮)

GPIO_SetBits(GPIOC,GPIO_Pin_13);    //端口设置高电平
GPIO_ResetBits(GPIOC,GPIO_Pin_13);    //端口设置低电平
补充
  • 新建工程的启动文件选择(型号分类及缩写)
  • LD小容量产品Low Density
  • MD....
  • HD....
  • XL加大容量产品 Extra Large
  • ......

工程架构

  • 首先进入start文件,进入中断服务函数,其中复位中断是整个程序的入口,当STM32上电复位后,程序进入复位中断,调用SystemInit和main函数

GPIO输出

GPIO简介

  1. GPIO(General Purpose Input Output)通用输入输出口  IO口
  2. 可以配置为八种输入输出模式
  3. 0~3.3V,部分引脚5V(可以在这个端口输入5v电压,具体参考引脚定义图),对输出来说,最大输出3.3v
  4. 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序(SPI,I2C)
  5. 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
  • 通常情况下,只需要用高低电平控制的地方,都可以用GPIO来控制完成;如果控制的设备功率较大,只需要加入驱动电路即可

GPIO基本结构

  1. 所有的GPIO都挂载在APB2上
  2. GPIOX的外设引脚表示为PX0~15
  3. 寄存器是一段特殊的储存器,内核可以通过APB2总线对寄存器进行读写,可以完成输出电平和读取电平的功能,只负责存储数据
  4. 驱动器只负责增大驱动能力

GPIO位结构

  • 两个保护二极管对输入电压限伏,VDD——3.3V,VSS——0V;当输入电压>3.3V,上方二极管导通,输入电压流进VDD,避免流入内部对内部电路产生伤害如果输入电压<0,下方二极管导通,电流从VSS流出,不会吸取内部电路电流;当0<输入电压<3.3,流进电路中
  1. 在输入驱动器中,连接了一个上拉电阻(置VDD)下拉电阻(置VSS),开关可以通过程序配置;如果上通下断,为上拉输入模式(默认为高电平输入)如果上断下通,为下拉输入模式(默认为低电平输入)都断开为 浮空输入模式
  2. 上拉电阻和下拉电阻是为了给输入提供一个默认的输入电平(避免了引脚悬空导致的输入数据不确定),因为对于一个数字端口,输入引脚必须有明确的电平(高电平、低电平),悬空时引脚电平容易被外界干扰而改变
  3. 上(下)拉电阻组织较大,是弱上(下)拉,目的是不影响正常输入操作
  4. 施密特触发器对输入电压进行整形,避免了信号波动带来的输出抖动现象;只有在高于阈值才高电平,低于阈值才低电平,在阈值上下限中间的信号波动就被整形了

  • 经过施密特触发器整形过的波形可以直接写入输入数据寄存器
  • 在输出驱动器中,选择通过输出数据寄存器控制,就是普通的IO口输出;而且位设置/清除寄存器(可以对某一位进行跟改)可以单独操作输出数据寄存器的某一位,不影响其他位;
  • P/N-MOS管(电子开关),在推挽输出模式下都有效;当数据寄存器为1时,上通下断,输出接VDD(也就是输出高电平);当数据寄存器为0时,下通上断,输出接VSS(也就是输出低电平);因为在这种模式下,高低电平驱动力强,也把推挽输出叫强推输出模式
  • 在推挽输出下,STM32对IO口是绝对控制,控制高低电平
  • 在开漏输出下,P-MOS无效,只有N-MOS工作;当数据寄存器为1时,下断,输出断开(也就是高阻模式);当数据寄存器为0时,下通,输出接VSS(也就是输出低电平);因为在这种模式下,只有低电平有驱动能力,高电平没有
  • 开漏输出(可以作为通信协议的驱动方式,在多机通信时可以避免设备相互干扰,也可以输出5V的电平信号)
  • 引脚配置输入模式时为关闭,两个MOS管都无效(输出关闭了),端口电平由外部信号控制

GPIO模式

  • 通过配置GPIO的端口来配置寄存器,可配置成以下8种模式

  • 使用浮空输入,端口要接上一个连续的驱动源,不能出现悬空的状态
  • 在输入模式下,输出驱动器断开,端口只能输入不能输出

  • 模拟输入:GPIO无效,引脚直接接到片上外设(ADC)

  • 开漏/推挽输出(一个端口一个输出,多个输入

  • 复用开漏/推挽输出

GPIO输入

外部硬件设备

按键介绍
  • 常见的输入设备,按下导通,松开断开
  • 按键抖动:由于按键内部使用的机械弹簧片进行通断,所以在按下和松手的瞬间会伴随一连串的抖动

传感器模块介绍
  • 传感器模块:传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化通过与定值电阻分压即可得到模拟电压输出再通过电压比较器进行二值化即可得到数字电压输出
  • 光敏电阻传感器——电阻值与光线强弱呈反比
  • 热敏电阻传感器——电阻值与温度强弱呈反比
  • 对射式红外传感器——电阻值与红外线强弱呈反比
  • 反射式红外传感器——电阻值与红外线强弱呈反比

硬件电路
按键

传感器模块

C语言(STM32用的一部分)

C语言数据类型

  • 在51中 int 16位,在32中 int 32位
C语言宏定义
  1. 关键词:#define
  2. 用途:用一个字符串代替一个数字,方便记忆理解,防止出错;提取程序中经常出现的参数,方便以后修改,可以直接在宏定义里面修改
  3. 定义宏定义:#define ABC 123456
  4. 引用宏定义:int a = ABC;//等效于int a = 132456;
C语言typedef
  1. 关键词:typedef(只能专门给变量类型换名字)
  2. 用途:将一个比较长的变量类型名称换个名字,方便使用和理解
  3. 定义typedef:typedef unsigned char uint8_t;
  4. 引用typedef:uint8_t a;//等效于unsigned char a;
C语言结构体
  1. 关键词:struct(结构体也是一种数据类型)
  2. 用途:数据打包,不同类型变量的集合
  3. 定义结构体变量:struct{char x;int y;float c;} StructName;因为结构体变量类型较长,通常用typedef更改变量类型名称
  4. 引用结构体成员:StructName.x = 'A';StructName.y = 33;StructName.z=1.23;或者pStructName->x = 'A';pStructName->y = 33;pStructName->z = 1.23;pStructName为结构体的地址(用‘.'引出结构体成员的数据)
C语言枚举
  1. 关键词:enum
  2. 用途:定义一个取值受限制的整形变量,用于限制变量取值范围;宏定义的集合
  3. 定义枚举变量:enum{FALSE = 0,TRUE = 1}EnumName;因为枚举变量类型较长,所以通用typedef更改变量类型名
  4. 引用枚举成员:EnumName = FALSE;EnumName = TRUE;

相关推荐

  1. <span style='color:red;'>STM</span><span style='color:red;'>32</span> <span style='color:red;'>1</span>-5

    STM32 1-5

    2024-06-09 14:34:01      34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 14:34:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 14:34:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 14:34:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 14:34:01       20 阅读

热门阅读

  1. spring boot集成pg

    2024-06-09 14:34:01       10 阅读
  2. !力扣70. 爬楼梯

    2024-06-09 14:34:01       10 阅读
  3. 微信小程序:实现音乐播放器的功能

    2024-06-09 14:34:01       6 阅读
  4. oracle10g的dataguard测试

    2024-06-09 14:34:01       12 阅读
  5. 电商系统中热库和冷库的使用与数据转换

    2024-06-09 14:34:01       8 阅读
  6. Python R用法:深度探索与实用技巧

    2024-06-09 14:34:01       9 阅读
  7. K-means聚类模型

    2024-06-09 14:34:01       10 阅读
  8. RAGFlow 学习笔记

    2024-06-09 14:34:01       10 阅读
  9. tcpdump 抓包

    2024-06-09 14:34:01       9 阅读
  10. TypeScript看这篇就够了

    2024-06-09 14:34:01       12 阅读
  11. 【分享】使用 Reducer 和 Context 拓展你的应用

    2024-06-09 14:34:01       13 阅读