一、库函数
1.1 RCC库函数
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
RCC AHB外设时钟控制。
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
RCC APB2外设时钟控制。
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
RCC APB1外设时钟控制。
1.2 GPIO库函数
void GPIO_DeInit(GPIO_TypeDef* GPIOx); 复位GPIO外设
void GPIO_AFIODeInit(void);复位AFIO外设
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
用结构体的参数来初始化GPIO。
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
将结构体变量设置成默认值。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
读取输入数据寄存器某一个端口的输入值。
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
读取整个输入数据寄存器的输入值。
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
读取输出数据寄存器的某一位。
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
读取整个输出数据寄存器的输入值。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
将指定端口设置为高电平。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
将指定端口设置为低电平。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
根据第三个参数(BitVal)设置指定的端口值。
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
对16个端口进行写入操作。
二、STM32介绍
2.1片上资源/外设
深绿色的的内核内的资源,浅绿色的的内核外的资源
NVIC:管理中断的设备
SysTick:内核里的一个定时器,用来给操作系统提供定时服务,比如:FreeRots,Ucos等。
RCC:对系统时钟进行配置,使能各种模块的时钟。
2.2 命名规则
2.3系统构架
Cortex-M3内核有三条总线,分别是ICode(指令总线)、DCode(数据总线)、System(系统总线)。
AHB:先进高性能总线。
APB:先进外设总线,用于连接一般的外设。
AHB和APB2 一般是72MHz, APB1 一般是36MHz,AHB性能 > APB2性能 > APB1性能。
AHB和APB之间的桥接是完成数据的转换和缓存。
DMA:用于数据搬运。
2.4 引脚定义
根据STM32F103C8T6的引脚定义
1号引脚:备用电池供电。
2号引脚:IO或者侵入检测或者RTC,RTC:输出RTC校准时钟、RTC闹钟脉冲或秒脉冲。
3、4号引脚:IO或接32.768KHz的RTC晶振。
5、6号引脚:主晶振,一般8MHz,芯片内部有锁相环电路,可以对这个8MHz的频率进行倍频,最终产生72MHz的频率,作为系统的主时钟。
7号引脚:系统复位引脚,N表示低电平复位。
8、9号引脚:内部模拟部分的电源。
10-19引脚:IO口。
20、44引脚:IO或BOOT引脚,BOOT用来配置启动模式的。
21、22引脚:IO口。
23、24,35、36,47、48引脚:是系统的主电源。
25-33引脚:IO口。
34、27-40:IO或调试端口,默认主功能的调试端口,用来调试、下载程序,STM32支持SWD和JTAG两种调试方式。(STlink是SWD调试)
41-43、45-46引脚:IO口。
2.5 启动配置
一般情况下,程序在主闪存存储器开始执行。
2.6 最小系统电路
三、GPIO
3.1 GPIO基本结构
单片机为32位,所以寄存器也有32位,端口只有16位,所以寄存器只有低16位对应有端口。
驱动器:增加信号的驱动能力。
3.2 GPIO位结构
注:图中的肖特基触发器为错误标注,应为施密特触发器。
可以将图片分成两部分,上面为输入、下面为输出。
保护二极管:对输入电压进行限幅。
如果输入电压比3.3V高,那上方的保护二极管导通,输入电压产生的电流就会直流流入Vdd而不会流入内部电路,避免电压过高对内部电路产生伤害;
如果输入电压比0V低,那下方的保护二极管导通,电流从Vss直接流出,而不会从内部汲取电流,保护内部电路。
上拉电阻和下拉电阻阻值较大,是一种弱上拉和弱下拉,目的是尽量不影响正常的输入操作。
施密特触发器:对输入电压进行整形。如果输入电压大于某一阈值,输出瞬间升为高电平;如果输入电压小于某一阈值,输出瞬间将为低电平。
3.3 GPIO模式
通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式。
浮空输入:IN_FLOATING。
上拉输入:IPP。
下拉输入:IPU。
模拟输入:AIN。
开漏输出:OUT_OD。
推挽输出:OUT_PP。
复用开漏输出:AF_OD。
复用推挽输出:AF_PP。
在输入模式下,输出都是无效的;在输出模式下,输入也是有效的。
一个端口只能有一个输出,但可以有多个输入。
3.3.1 浮空/上拉/下拉输入
3.3.2 模拟输入
使用ADC时,将引脚设置为模拟输入。
3.3.3 开漏/推挽输出
3.3.4 复用开漏/推挽输出
复用的输出引脚电平是由片上外设控制的。
四、硬件电路
上图为低电平驱动,下图为高电平驱动。
R1为限流电阻:防止LED电流过大而烧毁;调整LED亮度。
在推挽输出下,两种都可以用。
在单片机电路中,倾向使用低电平驱动,因为很多单片机或者芯片,都是使用了高电平弱驱动,低电平强驱动的规则,一定程序上避免了高电平打架。
如果高电平驱动能力弱,就不能使用高电平驱动。
右图中:
PNP接上,NPN接下。因为三极管的通断是需要在发射极和基极直接产生一定的开启电压的,如果把负载接发射机,可能会导致三极管不能开启。
三极管导通:箭头后的电压高于箭头指向的电压。