ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STM32学习笔记(一)

2022-01-19 22:34:01  阅读:157  来源: 互联网

标签:学习 定义 引脚 ISP 总线 接口 STM32 单片机 笔记


一、内部核心功能

  1. ARM内核

  2. 存储器

  • Flash:硬盘

  • SRAM:内存

  1. 时钟

实时时钟:RTC

  1. 振荡器HSE/HSI

  • RC振荡器

  • 晶体振荡器

  1. 分频器

  • 实现震荡频率翻倍

  • 用锁相环实现,称PLL

  1. 复位

  2. 电源管理

  • 备用电源输入

  • 端口输入输出

  • 逻辑电源输入

  • 模拟电源输入

二、内部重要功能

  1. 低功耗模式

  • 睡眠模式:

  • 停机模式

关ARM内核
关闭所有内部功能
关闭PLL分频器,HSE振荡器
  • 待机模式

关ARM内核
关闭所有内部功能
关闭PLL分频器,HSE振荡器
SRAM内容消失
  1. ADC:模数转换器

  2. DMA:帮CPU传递数据

  3. I/O:(I/O的集合也就是GPIO)

总共有5组端口,一组有16个I/O口

每个端口有8个工作状态:

  • AIN 模拟输入

  • IN_FLOATING 浮空输入

  • IPD 下拉输入

  • IPU 上拉输入

  • Out_PP 推挽输出

  • AF_PP 复用推挽输出

  • Out_OD 开漏输出

  • AF_OD 复用开漏输出

  1. 调试模式

  • JTAG:仿真调试接口(这是一个协议,可以代指用这个协议的接口)

  • SWD:简化版JTAG

  1. 定时器

  • 定时器:利用系统时钟计数,本质计数器

  • 看门狗定时器:在定时时间让单片机复位,拯救死机的单片机

  • 滴答定时器:用于实时操作系统中任务的切换,可当普通定时器用

三、内部通信功能

  1. I2C总线

  • 板级总线:只能在PCB上近距离通信

  • 分主从设备

  • 低速稳定,简单易学,超100kHz不稳定

  • 常用于EEPROM存储器、温度传感器、RTC时钟、气压传感器

  • F103中有2个I2C控制器

  1. USART串口

  • 全称同步收发器

  • 没有地址概念,没有主从设备

  • 用于Wi-Fi模块、GPS模块、蓝牙模块、单片机与计算机间通信

[工业中应用]  计算机与PLC(工业控制常用的可编程控制器)之间通信用RS232或RS485

  • F103中有3个USART串口

  1. SPI总线

  • 有主从设备之分,单片机为主

  • 板级总线:只能在PCB上近距离通信

  • 高速稳定,没有地址概念

  • 全双工:同时收发

  • 挂接从设备数量有限

  1. CAN总线

  • 每个设备既可为主设备,又可为从设备

  • 远程通信

  • 有标识符

  • F103中有1个CAN接口,但需要外加一片CAN收发器芯片才能用

  1. USB接口

  • 有主从关系

四、硬件电路和ISP下载

内部功能说明引脚数引脚定义
ARM内核用于运算,只有内部总线,没有向外的接口0
存储器用于存储,只有内部总线,没有向外的接口0
时钟向外接一个高速晶振一个低速晶振,每个晶振要2个引脚,共4个4OSC32_IN、OSC32_OUT、OSC_IN、OSC_OUT
复位向外引出1个外部复位引脚1NRST
电源管理要引出1组模拟电源和3组逻辑电源,每组电源有正负极两个引脚,共8个引脚8VDDA、VSSA、VDD_1、VSS_1、VDD_2、VSS_2、VDD_3、VSS_3
低耗能要引出1个外部唤醒接口,还要用到RTC走时以及备用存储器保持数据的 备用电池的正极引脚(负极与逻辑电源负极共用)2WKUP、VBAT
ADC有16个输入通道,需要引出16个引脚16ADC12_IN0~16
DMA用于内部数据传递,没有向外的接口0
GPIO共有5组GPIO接口,每组有16个I/O端口80PA0~15、PB0~15、PC0~15、PD0~15、PE0~15
调试模式JTAG接口需要5个接口5NJTRST、JTDO、JTDI、JTCK、JTMS
定时器共有三个普通定时器和1个高级定时器(共21个接口)21TIM1_CH1~4、TIM_CH1N~3N、TIM1_BKIN、TIM1_ETR、TIM2_CH1~4、TIM3_CH1~4、TIM4_CH1~4
看门狗没有向外的接口0
滴答定时器没有向外的接口0
I2C总线共有2组I2C总线,每组2个接口,共需要6个接口。(SCL是I2C的时钟线;SDA是数据线;SMBA是SMBus总线的报警信号,在I2C通信中不会用到)6I2C1~2_SCL、I2C1~2_SDA、I2C1~2_SMBA
USART串口共有3组全功能串口,每组内需要5个接口(在一般的串口通信中智慧用到TXRX两个接口)15USART1~3_CK、USART1~3_TXUSART1~3_RX、USART1~3_CTS、USART1~3_RTS
SPI总线有2组SPI总线,每组又有数据收、数据发、时钟线、使能线4个接口。8SPI1~2_MOSI、SPI1~2_MISO、SPI1~2_SCK、SPI1~2_NSS
CAN总线有数据发送和数据接收,共两个引脚2CAN_TX、CAN_RX
USB接口USB接口只有2条数据线2USBDP、USBDM
CRC校验没有向外的接口0
芯片ID没有向外的接口0

1.单片机、核心板、开发板

  • STM32单片机:搭载ARM内核,是实现内部功能和程序的部分,通过引脚和核心板连接

  • 核心板(最小系统):是维持单片机正常工作的最基础的电路,通过排针和开发板连接

[常用扩展功能]  串口、LED、按键、蜂鸣器

  • 开发板:是针对单片机项目开发中最常见、最值得学习的内容做了扩展

[面包板]  用于扩展装外设元件以及电路的一块搭载平台

2.ISP程序下载

写入程序的方法:JTAG调试下载&串口ISP下载

  • JTAG调试下载:

    • 通过J-LINK仿真调试器完成

    • 连接JTAG接口与电脑USB接口

    • 可与Keil配合实现在线仿真

  • 串口ISP下载:

    • 通过USART串口功能实现

    • 涉及BOOT0和BOOT1引脚上开关的反复拨动

    • ASP功能:涉及1个MODE按键和1个ASP指示灯

      • 单击:单击MODE可开关开发板电源,指示灯相应点亮熄灭

      • 双击:开启或关闭自动下载功能

      • 长按:切换下载模式,有Flash ISP 和 RAM ISP 两种模式

    • 需要下载ISP软件:比如FlyMcu

    • 串口通信的波特率:115200(bps)

    • 使用的文件后缀是.HEX

3.最小系统电路图分析

基本组成

1个高速晶振、一个低速晶振、1个复位按键、1个备用电池、6个滤波电容,以及ISP下载电路(由S1、S2开关及USB转TTL电平电路组成)

[S1、S2]  就是单片机上的BOOT0和BOOT1两个启动模式接口

启动模式(ISP下载的工作原理):

BOOT1(S2)BOOT0(S1)启动模式说明
X0主闪存存储器Flash ISP单片机再次复位后会运行Flash里面的用户程序
01系统存储器BootloaderBootloader程序是ST公司写入单片机的,用户不能修改的是一段ISP下载辅助程序
11内置SRAM RAM ISP多用于开发过程中的程序调试

[注]  S1断开为0闭合为1,S2断开为1闭合为0

五、开发平台的建立

1.下载Keil5

在Keil官网下载,然后安装好.pack后缀的芯片包

2.建立工程

为了方便以后的每次工程创建操作,我们可以创建一个“工程模板”

关于固体库:

固体库:操作功能配置寄存器的官方函数库

下载固体库:在ST官网,需要找到一个叫STM32F10X_StdPeriph_Lib_V3.5.0 的文件夹,这个就是固体库

工程子文件说明:

文件夹名存放类型说明
CMSIS内核驱动程序用来存放跟内核和单片机系统有关的内容
Lib内部功能函数库用来存放操作功能配置寄存器的各功能的固体库函数
Startup单片机启动程序用来存放单片机启动时进行初步设置的程序
User用户程序用来存放主函数、中断处理函数、报错处理函数等
Basic内部功能驱动程序用来存放用户自己编写的内部功能的驱动程序
Handware外部硬件驱动程序用来存放用户自己编写的硬件电路驱动程序

六、C语言基础知识总结

1. 关于字符:

  • 标识符:不能以数字开头,标识符的第一个字母必须是字母或下划线

  • c语言允许换行编写:换行时刻加入符号 “ \ ” 或者什么都不加,但在 #define 宏定义中的换行必须加 “ \ ”

2. 函数

  • 延时函数

  • 定时器初始化函数

  • 中断处理函数:中断函数里调用的函数不要在被main函数调用,不然会出现数据错乱

  • ADC_READ函数

模板如下:

返回值 函数名(参数){
    函数内部程序语句
}

PS:返回值和参数都是void表示没有返回值或参数

3. 数据

(1)常量

  1. Keil软件不支持二进制数的表达方式,一般以0b或0B开头的表示二进制数

  2. 十六进制(BCD码)是单片机编程中最常用的数值表示方法(A10,B11,C12,D13,E14,F15)

(2)浮点数

  • Keil编译器一般不支持,需要浮点数库文件才能使用

(3)变量

数据类型定义语句简写占用空间数值范围使用频率
32位无符号变量unsigned longu324字节上十亿
16位无符号变量unsigned shortu162字节上万极高
8位无符号变量unsigned charu81字节0~255极高
易变的8位无符号变量volatile unsigned charvu81字节0~255
只读的8位无符号变量unsigned char constuc81字节0~255

要注意数据溢出的问题(即变量用着用着结果赋值的数超过了最初定义的范围)

(4)数组

/**********定义数组的方法************/
u8 b[8];                               //定义8个字节8位数组变量
const u8 t[4]={1,2,3,4};               //定义4个8位固定数据的数组
const u8 y[2][3]={{1,2,3},{4,5,6}};    //定义2行每组3个固定数据的二维数组

注意:数据存入数组是从第0个位置开始存的!!

/***********数组的调用方法***********/
a = t[0];                              //即t的第一个数据
a = y[0][2];                           //即y的第一行第3个数据
a = t[i];                              //这里i是变量,可以在这句上面写关于i的运算式子

(5)枚举

是一种数据类型,指一组有共同特性(特性是自定义的)的数据的集合

作用:限制数据范围

格式:

enum 枚举名{
标识符=整形常数,
标识符=整形常数,
标识符=整形常数
}枚举变量;

如果没给标识符赋值:

它的值就等于上一个标识符的值加1

如果第一个标识符没赋值:

系统默认它的值是0

例子:

enum phonenum_book{
    papa = 13907727651,
    mama = 13825578263,
    me = 17665376286 
}phonenum;

使用:

phonenum = papa; 
//结果:phonenum=13907727651

拓:stm32f10x.gpio.h文件的枚举定义

typedef enum
{
    GPIO_Mode_AIN = 0X0,
    GPIO_Mode_IN_FLOATING = 0X04,
    GPIO_Mode_IPD = 0X28,
    GPIO_Mode_Out_OD = 0X14,
    GPIO_Mode_Out_PP = 0x10,
    GPIO_Mode_AF_OD = 0X1C,
    GPIO_Mode_AF_PP = 0X18
}GPIOMode_TypeDef;

(6)结构体

结构体和枚举的区别:

  • 枚举是同一类型数据的集合

  • 结构体是不同类型数据的集合

格式:

struct 结构体名{
    结构体成员;
    结构体成员;
}结构体变量;

1.普通结构体的定义、写入、调用

/************定义**********/
struct name{
int a;
char b;
float c;
}x;
/************写入**********/
x.a = 1;
x.b = 2;
x.c = 0x30;
/************调用**********/
if(x.a>1){
    z = x.b;
}

2.typedef前缀的结构体定义、写入、调用

/***********定义***********/
typedef struct{
int a;
char b;
float c;
}x;
/***********写入************/
x y;
y.a = 1;
y.b = 2;
y.c = 0x30;
/************调用***********/
if(y.a>1){
    z = y.b;
}

typedef前缀的结构体里定义的x是一种数据类型,y是变量

(7)指针

单片机程序的运行依靠的就是一个叫PC指针的东西

PC指针:

  • 一种特殊的寄存器

  • 用来存放地址

基本操作:

//定义
u8 *a;
//写入
*a = 100;
//移动指针
a = a+6;
//数据调用
b = *a;

4.位操作

单片机运算是以字节为单位的,要进行位操作需要位操作符。

符号说明举例
&按位与a&b
|按位或a|b
^按位异或a^b
~按位取反~a
<<位左移a<<2
>>位右移a>>2

5.指令

一般是用#include指令引用其他文件

格式:

#include "xxxxx.h"

6.宏定义

STM32中常用的宏定义语句有7个

宏定义说明或举例
#define 代替名 原名如#define n 5 指的就是定义n为5,且下面的操作无法修改n的值
#undef 代替名撤销宏定义
#ifdef 代替名使能编译或防止重复定义头文件
#if 表达式使能编译,如果判断
#elif 表达式使能编译,否则如果判断
#else使能编译,否则判断
#endif结束#ifdef或#if

格式:

#ifdef __DELAY_H
#define __DELAY_H
/*程序正文*/
#endif __DELAY_H         //结束宏
/*-------------------------*/
#if 1
    a = 1;
#elif 1
    a = 2;
#else
    a = 3;
#endif                   //结束宏

7. 辅助工具

  • undo(撤销):Ctrl+Z

  • redo(重做):Ctrl+Y (撤回之后发现又没错时使用)

  • Find:Ctrl+F

  • Replace:Ctrl+H

  • 标记功能:第二行菜单栏的红旗状图标(第一个:添加标记,第二个:跳转到上个标记,第三个:跳转到下一个标记,第四个:删除标记)

  • 缩进功能:在红旗图标右边,有向左或向右缩进

  • 注释与解注释功能:在缩进功能右边

标签:学习,定义,引脚,ISP,总线,接口,STM32,单片机,笔记
来源: https://blog.csdn.net/weixin_52324498/article/details/122591255

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有