恭喜大家完成了C语言的学习,现在咱们来到咱们的硬件MCU阶段,咱们这里的工程用的是keil,环境搭建不再赘述,希望大家在这一阶段仍然学的愉快
1.资料部分
用的最多的就是STM32f103的手册,搭配STM32F103ZET6的开发板
2.概念部分
嵌入式系统:
嵌入式系统是以应用为中心,以现代计算机技术为基础,能够根据用户需求(功能、可靠性、成本、体积、功耗、环境等)灵活裁剪软硬件模块的专用计算机系统。
专用计算机:
专用计算机,专为解决某一特定问题而设计制造的电子计算机。一般拥有固定的存储程序。如控制轧钢过程的轧钢控制计算机,计算导弹弹道的专用计算机等,解决特定问题的速度快、可靠性高,且结构简单、价格便宜。
单片机:
单片机MCU(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。

CPU:
中央处理器(Central Processing Unit,简称CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。CPU自产生以来,在逻辑结构、运行效率以及功能外延上取得了巨大发展。
ARM:
arm公司:
ARM处理器是英国Acorn有限公司设计的低功耗成本的第一款RISC微处理器。全称为Advanced RISC Machine。ARM处理器本身是32位设计,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。
arm架构:
ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)处理器架构。还有基于ARM设计的派生产品,重要产品包括Marvell的XScale架构和德州仪器的OMAP系列。
我们现在使用的单片机都是基于ARM架构(精简指令集使用的是汇编)下的产物,有了架构之后,根据不同的架构设计不同的芯片
咱们现在使用的芯片就是ST公司设计的。
意法半导体(ST)集团于1987年6月成立,是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成。1998年5月,SGS-THOMSON Microelectronics将公司名称改为意法半导体有限公司。意法半导体是世界最大的半导体公司之一,2006年全年收入98.5亿美元,2007年前半年公司收入46.9亿美元
ARM公司和ST公司的关系:
ARM公司主要是设计芯片处理器(图纸)不去生产芯片,ST公司得到授权之后,可以在ARM公司的处理器基础上,去扩展芯片功能,比如添加ADC 串口 定时器.......,ST公司对芯片设计完善之后,交由专门的芯片制造公司进行生产。
寄存器:(按位存储)
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。
触发器:
双稳态触发器是一种具有记忆功能的
逻辑单元电路。它能储存一位二进制码。它有两个稳定的工作状态,在外加信号触发下电路可从一种稳定的工作状态转换到另一种稳定的工作状态。
逻辑单元:
逻辑单元(LU)是进入IBM系统网络体系结构(SNA)的
网络端口,通过它用户可以访问网络资源,或一个程序员与另一个程序员通信。
3.初识单片机
1.单片机的资源

2.驱动LED灯(经典案例--入门)
1.LED灯在哪一个IO口上连接
什么是IO口:单片机中的输入输出管脚
单片机中的IO口的表示方式:
PG2--(p--port G--端口序号 2--特定端口下的引脚顺序--序列号)
G端口中的第二个管脚
PA0--端口A中的第0个管脚
每一个端口中最多有几个引脚???16个
PA16---不存在的
我们的单片机总共由144个管脚,但是可以供我们使用的管脚是112个,7个端口(A B C D E F G)
3.查看原理图:


低电平:0V--1.5V 数字量:0
由原理图可得到,LED灯(D0)连接的是单片机中的PB5管脚:
D0--亮--PB5输出一个低电平
D0--灭--PB5输出一个高电平
单片机开发中,前期最重要的就是如何判断一个IO口的输入输出功能
输出--驱动外部电路,根据IO口的电平状态,执行相关的功能 led
输入--MCU用于检测外部电路的电平状态的改变,KEY
4.根据手册编写代码
内存的区分:
GPIO功能描述
IO口输入输出方式8种:

输出:
通用开漏输出:通用的开漏输出,只能输出低电平,无法输出高电平,只能处于高阻态(断路)
通用推挽输出:既可以输出高电平,也可以输出低电平。
复用开漏输出:具有通用开漏的特性,但是他的应用场合都是在单片机中除了IO口输出单一的开关量之外的,其他外设功能设置,比如IIC。
复用推挽输出:具有通用推挽的特性,但是他的应用场合都是在单片机中除了IO口输出单一的开关量之外的,其他外设功能设置,比如SPI 串口 定时器.......。
输入:
浮空输入:既不连接高电平也不连接低的电平(初始状态),当前管脚的状态完全由外部设备决定,这一种输入方式在51单片机是很危险的。但是在STM32中可以接受的,内部会去处理这个引脚的电平状态,一般都会外加上拉或者下拉电阻。
上拉输入:在IO口作为输入状态的时候,连接上拉电阻,起始状态---高电平
下拉输入:在IO口作为输入状态的时候,连接下拉电阻,起始状态---低电平
模拟输入:主要是用于AD转换
复用功能参考列表:

在以上手册的第31页:

时钟
在我们的单片机中时钟的大小,主要是决定了单片机处理器处理数据的快慢。
内核:
时钟大小:72MHZ
内存大小:
256 to 512 Kbytes of Flash memory---相当于硬盘 up to 64 Kbytes of SRAM--相当于运行内存
单片机中的io口中,每一个端口都有一个独立的时钟,那么也就是说,你在使用某一个IO口的时候,必须要先操作时钟(打开)
5.操作PB5步骤:
1.打开时钟
由上图可得,B端口时钟连接在APB2总线上的
时钟的配置在我们的中文参考手册的第六章节

RCC_APB2ENR |=0X01
2.配置PB5工作模式--通用推挽输出
复位值:寄存器的初始数值
20--23--0010
当寄存器的初始值不为零,或者当前不知道寄存器的初始值是多少,建议先清零需要操作的位,然后再次执行相关操作。

3.输出高电平或者低电平
PB5拉高---GPIOB |=(0X01PB5拉低---GPIOB &=~(0X01
6.写代码驱动LED灯
编写代码的步骤:
1.打开B端口的时钟
2.配置PB5管脚
3.设置PB5的输出状态(高电平或者低电平)
添加文件:
保存文件到以下路径中:(api是我们自己新建的文件夹)
.h文件的保存方式和路径与.c文件是一样的;
添加文件到工程:
添加.h文件到工程:
寄存器的编写方式:
cpp
led.c
#include "led.h" void Led_Config(void)
{ // 1.打开B端口的时钟 RCC->APB2ENR |=(0X01<<3);
//2.配置PB5管脚 GPIOB->CRL &=~(0x0f<<20); GPIOB->CRL |=(0x02<<20);
//3.设置PB5的输出状态(高电平或者低电平) GPIOB->ODR |=(0X01<<5);
}
cpp
led.h
#ifndef _LED_H_
#define _LED_H_
#include "stm32f10x.h"//stm32中的相关宏定义类型等存在的位置
void Led_Config(void); #endif
cpp
main.c
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h> #include "led.h"
void delay(u32 tim)
int main(void) {
// 来到这里的时候,系统的时钟已经被配置成72M。
Led_Config();
while(1)
{ GPIOB->ODR |=(0X01<<5); delay(2000000);
GPIOB->ODR &=~(0X01<<5); delay(2000000); }
}
void delay(u32 tim)
{ while(tim--); }
库函数的编写方式:



cpp
//库函数的编写方式
void led_Init(void)
{
GPIO_InitTypeDef gpio_initsources;
//打开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
gpio_initsources.GPIO_Pin=GPIO_Pin_5;
gpio_initsources.GPIO_Mode=GPIO_Mode_Out_PP;
gpio_initsources.GPIO_Speed=GPIO_Speed_2MHz;
//配置PB5
//void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
GPIO_Init(GPIOB,&gpio_initsources);
}
main.c
cpp
main.c
int main(void)
{
// 来到这里的时候,系统的时钟已经被配置成72M。
//Led_Config();//寄存器
led_Init();
while(1)
{
// GPIOB->ODR |=(0X01<<5);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
delay(2000000);
// GPIOB->ODR &=~(0X01<<5);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
delay(2000000);
}
}
安装一个STLINK的驱动:
网上找一个直接按照提示安装即可
下载完成之后,直接运行。