5、STM32开发基础知识

1、c语言基础。
①运算符。
基本算数运算符:+、-、*、/、%:加、减、乘、除、取余。
关系运算符:<、>、==、!=、>=、<=:小于、大于、等于、不等于、大于等于、小于等于。
逻辑运算符:&&、||,!:逻辑与、逻辑或、逻辑非。
按位运算符:&、|、^、~、<<、>>:位与、位或、位异或、位非、左移、右移。
A…不改变其他位的值的情况,对某几位进行设置。
设置的位先&0,再|需要设置的值。
GPIOA->&=0XFFFFFF0F; //第4到7位清零
GPIOA->|=0X00000040; //第4到7位设置对应的值。
B…提高代码可读性。
GPIOx->BSRR=(((uint32_t)0x01)<<pinpos); //BSRR寄存器的第pinpos位设置为1
GPIOx->BSRR |= 0X0030; //可读性不好
GPIOA->ODR |= 1<<5; //PA.5输出高,其他位不变
C…取反操作使用技巧。
SR寄存器每一位代表一个状态,设置某一位为0其他位为1。
TIMx->SR = 0XFFF7; //第3位设置为0,可读性差
库函数是如下操作的:
#define TIM_FLAG_Update ((uint16_t)0X0001) //宏定义
TIMx_SR = (uint16_t)~TIM_FLAG_Update; //设置宏定义的一位为0,其他为1
②宏定义。
#define 标识符 字符串 //宏定义
标识符是定义的宏名,代替后面的字符串
#define SYSCLK_FREQ_72MHz 72000000 //用SYSCLK_FREQ_72MHz代替72000000,提高可读性
③条件编译。

#ifdef 标识符
程序段1
#else
程序段2
#endif

如果标识符已经定义过,对程序段1进行编译,否则对程序段2进行编译,也可以没有#else

#ifndef __SYS_H
#define __SYS_H	
#include "stm32f10x.h"
..............................................
..............................................
#endif

④extern外部变量。
extern可以放在变量或者函数前,表示该变量或者函数在别的文件夹中有定义。
变量:A.c文件中要使用B.c文件中的变量(int a),方法一:在A.c文件中extern int a;,方法二:定义B.h,B.h中声明变量extern int a;,A.c文件中引用头文件#include"B.h"。
函数:A.c文件中要使用B.c文件中的函数int fun(void) {return 0;},方法一:A.c文件中声明int fun(void);或者extern int fun(void);方法二:定义B.h,B.h中声明extern int fun(void);或者int fun(void);。
⑤typedef 类型别名。
一般结构是:typedef 原类型名 新类型名;
例如:typedef unsigned int uint;
struct GPIO{…}; //struct GPIO定义结构体变量
typedef struct{…}GPIO_InitDef; //GPIO_InitDef可以用来定义结构体变量。比上面的简洁。
⑥结构体。
struct 结构体名{成员变量};
声明和定义分开进行。
struct student{char name; int age;}; struct student student1,student2;
声明和定义在一起。
struct student{char name; int age}student1,student2; //其他地方还能通过struct student定义结构体变量
声明和定义在一起,且其他地方不能定义结构体变量。
struct{char name; int age}student1,student2;
结构体成员变量的引用方法:
结构体变量名.成员名
例如:student1.age;
struct *student3; //定义一个结构体指针
(*student3).name = A; //结构体指针指向结构体成员
student3->age = 10; //结构体指针指向结构体成员
(p).成员名 == p->成员名 //由于结构体成员运算符优先级高于指针运算符,所以圆括号不能省略
"."结构体成员运算符
"
"指针运算符
"()"圆括号,优先级最高
"->"指向结构体成员运算符

2、STM32系统架构。
这里写图片描述
STM32主系统主要由四个驱动单元和四个被动单元构成。
驱动单元:内核DCode总线、系统总线、DMA1、DMA2。
被动单元:AHB到APB的桥,连接所有的APB设备、FLASH、SRAM、FSMC。
几个总线知识:
①ICode总线:该总线将M3内核指令总线和闪存指令接口相连。
②DCode总线:该总线将M3内核数据总线和闪存数据接口相连。
③系统总线:该总线将M3内核系统总线和总线矩阵相连,总线矩阵协调内核和DMA的访问。
④DMA总线:该总线将DMA和总线矩阵相连,总线矩阵协调内核的DCode和DMA到SRAM、闪存和外设的访问。
⑤总线矩阵:内核系统总线和DMA主控总线的仲裁,连接在总线上的主单元:DCode总线、系统总线、DMA1总线、DMA2总线,连接在总线上的从单元:Flash、SRAM、FSMC、AHB2APB桥。
⑥AHB2APB桥:AHB(高级高性能总线advanced high-performance bus)和APB(高级外设总线advanced peripheral bus)通过AHB2APB桥相连,APB1操作速度限于36MHz,APB2操作速度全速(up to 72MHz depending on the device)。

3、STM32时钟系统。
时钟系统是CPU的脉搏,就像人的心跳一样。
51单片机一个系统时钟就可以解决一切,STM32为什么要有多个时钟源?
原因1:STM32本身复杂,外设多,不是所有的外设都需要系统时钟这么高的频率,如看门狗。
原因2:同一个电

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值