Day01 基本知识前提
struct node {
int data;
struct node next; //错误,结构大小不确定
struct node *next;
}
环境搭建
typedef 起别名
数组 typedef int arr_t [3];
arr_t b[2]; arr_t 相当于 int [3];
嵌入式以应用为中心
---------------------------------------------------------------------------------------------------------------------------------
Day02
ST ARM STM
三星 ARM 开发板+外设
联想 Intel
BIOS 基本输入输出系统
C语言执行效率高
提问:
- 和CPU连接的各种bus有什么?
三种:数据总线,地址总线,控制总线
区分冯诺依曼体系和哈佛体系:看取数据和取指令是否用的同一根总线
- stm32中有几个总线,分别是谁
AHB,AHB1,AHB2,APB1,APB2
2.要操作GPIO外设,要通过哪个总线操作?
APB2总线打开时钟
一个管脚最多有四个功能
输入:上拉(默认高电平)、下拉(默认低电平)、浮空(默认不确定)
输出:开漏(只能低不能高)、推挽(高低都行)
复用:
模拟:模拟输入(ADC)
编译原理
源程序 --> 预处理文件 --> 汇编文件 --> 目标文件 --> 可执行文件(ELF)
hello.c --> hello.i -----> hello.s --->hello.o ----->a.out
预处理 编译 汇编 连接
预处理:
根据预处理指令,过滤掉程序的注释,把相关的头文件包含进来,预处理指令 是给预处理器下发的执行
gcc -E hello.c -o hello.i
编译:
将预处理后的文件编为汇编文件
gcc -S hello.i -o hello.s
汇编:hello.s 汇编成目标文件
gcc -o hello.s -o hello.o
链接:将目标文件和库文件,运行文件链接生成可执行文件
gcc hello.o
---------------------------------------------------------------------------------------------------------------------------------
Day03
extern 关键字 扩充变量或者函数的作用域
输入相当于检测,输出相当于控制
初始化GPIO
- 选择推挽输出
- 选择C组123
- 输出频率50MHz
按键对应的管脚
KEY0 --> PC9
KEY1 --> PC8
KEY2 --> PA0
KEY0,KEY1默认高,KEY2默认低
轮询、中断、DMA
定时器:
volatile 易变
告诉编译器在取变量值的时候每次都去内存中取,不要到缓存中取
普通定时器和特殊定时器(wdg ,RTC)
看门狗除了定时,还能重启复位
到达定时时间自动重启
RTC:提供计时功能 年 月 日 时 分 秒
决定定时时间(超时)有哪些因素:频率,计数值
系统定时器:
不是ST公司提供的,是ARM提供的
系统定时器(system timer | systick)
从频率和计数值分析时间长短
提问:
- 有几种时钟源
HSI、HSE、LSI、LSE、PLL倍频(乘法器)。
2.系统时钟是由谁提供的
HSE:内部时钟源往往不稳定,所以选择HSE
通过时钟树,分析定时器的时钟频率SYSCLK / 8或SYSCLK
3.查找系统定时器的计数范围:0-2^24-1(16M)
USB hub root hub <-- USB Bus
usb2.0/3.0 connect <-- Usb Device
EHCI/XHCI
End point <-- 发命令 <-- Mass Storage
---------------------------------------------------------------------------------------------------------------------------------
Day04
位带:bitbandf
*((int *) 0x10000000) = 200;
地址:(volatile int *) 0x10000000
访问:*(volatile int *) 0x10000000
位操作:
一般做法:
*(volatile int *) 0x10000000 &= 0xfcffffff;
*(volatile int *) 0x10000000 |= 0x01000000;
标准做法
*(volatile int *) 0x10000000 &= ~(3<<24);
*(volatile int *) 0x10000000 |= ~(1<<24);
结构体、联合、与枚举
struct Student{
unsigned int x:1;//冒号后面的数字,代表成员变量管理的位数
unsigned int y:2;//位域
unsigned int z:3;
};
union Unit{
char c;
struct Student s;
};
union Unit u;
u.c =13;
权威指南p86
内存总容量 4G
片内SRAM 512M
片上外设 512M
#define BITBAND (addr,bitnum)
(addr &0xf0000000) + 0x20000000+
((addr & 0xfffff) << 5 + BITBAND << 2)
#define MEMADDR (addr)
*(violatile int *) (addr)
//将十六进制转化成地址使用
typedef enum{
OUTPUT;
INPUT;
AF;
AIN;
}
位带多用于低端产品
位域多用于高端产品
---------------------------------------------------------------------------------------------------------------------------------
Day05
2.2内存管理
进程:程序运行的实例
每个进程都有自己独立的4G内存空间
参见内存管理图
三 串口
有线通信:
RS232:电气特性
逻辑0:+3V~+15v
逻辑1:-3V~-15v
传输距离 < 10m
RS485:电气特性
工业级串口 工控领域用的多
采用差分信号 传输的时候,用两根线
TTL电平
低电平:< 0.8v
高电平:> 2.4v
以太网 4层
M-BUS 远程抄表系统
PLC 电力线通信
无线通信:
短距离:蓝牙,WiFi,红外,zigbee,Nrf
长距离:移动蜂窝网络,23456G
低功耗局域网:Lora,NB-Iot(窄带物联网)
3.2串行通信
串行接口简称串口
工作模式:单工,半双工,全双工
单工:确定高位先出还是低位先出,空闲时拉高。
0x9b,串口发送,传送时需同
---------------------------------------------------------------------------------------------------------------------------------
DAY06
一 回忆昨天的内容
串行通信
115200
8N1
串行通信与并行通信的区别
USART
同步和异步
时序
usart1_send_byte
while (*buf) {
usart1_send_byte ---》 usart1_send_data
}
usart1_recv_byte
二 中断
目标:把之前检测按键功能由轮询的方式改为中断
2.0 中断控制器
当使用中断时,首先中断控制器
NVIC 可嵌套的向量中断控制器
VIC 向量中断控制器
GIC 通用中断控制器 ----》 高端板子
一般情况下MCU 使用NVIC和VIC
2.1 在STM32F102RBT6中的中断
NVIC和ARM-CORTEX-M3紧密相连
NVIC会处理两个事情
1) NVIC会为每一个连接到NVIC上的中断源分配一个中断号
中断号的顺序一定和中断向量(异常处理函数)保持一致
2) 处理优先级的问题
本身ARM 提供8bit的寄存器来解决256个优先级
但是ST公司只用了4bit 用于处理16个优先级
2.2 通过手册了解EXTI中断
打开《stm32f10x中文参考手册》P91
8.1.2章节中所指示的是中断和异常向量表
编号越小的(中断),优先级越高
表36中所指示的内容是不可以修改的
首先关注EXTI,它表示外部中断,可以配置成19个中断事件源
16个用来处理外部中断,剩余的3个用来处理其他外部中断
GPIO管脚可以触发中断,但是需要借助EXTI,一共有19个
PA0 PB0 PC0 PD0 ...都可以触发EXTI0
...
PA5 PB15 PC15 PD15 ...都可以触发EXTI15
结论:每一个GPIOx 都可以触发EXTIx
注意:
1) NVIC 和EXTI的区别
NVIC 控制器
EXTI 外部中断源
2) 编号的问题
中断有中断号
中断号和异常向量表中的顺序有关
外部中断也有外部中断号
EXTI的中断号和GPIO的管脚相关
3) 外部中断 EXTI0 对应的中断编号 0..
外部中断 EXTI9~5 对应的中断编号是同一个
有些外部中断独占一个中断号
有些外部中断共享一个中断号
也就是说,异常向量表中的第6个函数是处理外部中断0
由于KEY0 对应的PC9 KEY1 对应的是PC8
且EXTI9~5对应的中断处理函数是同一个,
所以要在中断处理函数中进行判断
2.2 了解外部中断配置寄存器
EXTIx[3:0] 配置成不同的值的时候,选择不同的管脚
它属于AFIO_EXTICR1,所以打开时钟的时候,
需要将GPIOA,GPIOC,AFIO的时钟打开
2.3 驱动EXTI(外部中断)
KEY0 PC9 EXTI9
KEY1 PC8 EXTI8
KEY2 PA0 EXTI0
KEY0 和 KEY1 在没有按下的时候,呈现高电平。
KEY2 逻辑和上述相反。
用中断的方式实现USART1接受字符串