目录
C语言语法
C语言枚举定义
//里面的变量值会自动加一,且注意每个变量后是逗号,最后一个变量后没有逗号
//GPIO_Speed_10MHz相当于一个常量可以直接赋值给int,char或者自定义类型的变量
如:int a=GPIO_Speed_10MHz;
//但是如果定义了一个枚举变量
如:GPIOSpeed_TypeDef a;
此时的a就于int定义的变量一样里面是一个不确定的值,但是给其赋值只能赋枚举里的常量值
typedef enum
{
GPIO_Speed_10MHz = 1, // 10MHZ (01)b
GPIO_Speed_2MHz, // 2MHZ (10)b
GPIO_Speed_50MHz // 50MHZ (11)b
}GPIOSpeed_TypeDef;
STM32寄存器地址的理解
在计算机中,一个地址,代表一个字节(1Byte)。
比如:地址0x0000 0000就占一个字节,
地址0x0000 0001也占一个字节,
地址0x0000 0002也占一个字节,
…
地址0x0000 000F也占一个字节,
也就是说:
0x0000 0000 - 0x0000 000F总共有16个地址,占16个字节。
STM32是32位的也就是每个完整的寄存器对应着4Byte的地址,即像GPIO的IDR和ODR两个相邻的寄存器的地址间隔是0x04。
含参数的宏定义
#define LED_B(a) if(a) \\ (\)连接符号后面不能带任何东西
GPIO_SetBits(LED_G_GPIO_PORT,LED_B_GPIO_PIN); \
else GPIO_ResetBits(LED_G_GPIO_PORT,LED_B_GPIO_PIN);
寄存器与外设的理解
ARM将32位4G内存地址中的一部分起别名方便操作,这些命名的部分就是寄存器(所以寄存器实际上就对应一段内存地址),如GPIO的寄存器(包含了GOIO的时钟,赋值,输入输出配置等寄存器),然后通指定的寄存器对GPIO外设进行操作。
#include"stm32f10x.h"
#include"stm32f10x.h"里面包含了"stm32f10x_conf.h",这样每次main函数只用引用"stm32f10x.h"就可以把各种外设的头文件也引入
GPIO输出
推挽输出
1、可以输出高低电平,用于连接数字器件,高电平由VDD决定,低电平由
VSS决定。
2、推挽结构指两个三极管受两路互补的信号控制,总是在一个导通的时候
另外一个截止,优点开关效率效率高,电流大,驱动能力强。
3、输出高电平时,电流输出到负载,叫灌电流,可以理解成推,输出低电
平时,负载电流流向芯片,叫拉电流,即挽。
开漏输出
1、只能输出低电平,不能输出高电平。
2、如果要输出高电平,则需要外接上拉。
3、开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和
SMBUS总线
位带操作
//GPIOB_ODR_Addr寄存器地址,n要操作的是寄存器的第几位
#define GPIOB_ODR_Addr (GPIOB_BASE+0X0C)
#define PBout(n) *(unsigned int *)((GPIOB_ODR_Addr & 0xf0000000)+0x02000000+ ((GPIOB_ODR_Addr & 0x00ffffff)<<5)+(n<<2))
系统时钟配置
红色为默认的时钟配置路线:通过高速外部时钟时钟(8M)经过PLL9倍频后(72M),选择输出的PLLCLK时钟(72M)为系统时钟对后续的外设等时钟进行配置。(最多可以通过自定义超频到128M)
APB1为低速总线时钟为二分频36M
AP2为高速总线时钟为一分频72M
EXTI中断/事件
NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。
EXTI外部中断/事件控制器,上面主要包括GPIOA-G的中断
产生中断目的是把输入信号输入到 NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。
中断属于复用功能,实际上EXTI的配置是在AFIO上
配置按键的输入中断:
EXTI0-15对应的就是GPIOA-G的0-15号引脚
NVIC里要设定中断优先级并且使能总中断
初始化中断端