一、STM32数据类型
typedef signed long s32;
typedef signed short s16;
typedef signed char s8;
typedef signed long const sc32; /\* Read Only \*/
typedef signed short const sc16; /\* Read Only \*/
typedef signed char const sc8; /\* Read Only \*/
typedef volatile signed long vs32;
typedef volatile signed short vs16;
typedef volatile signed char vs8;
typedef volatile signed long const vsc32; /\* Read Only \*/
typedef volatile signed short const vsc16; /\* Read Only \*/
typedef volatile signed char const vsc8; /\* Read Only \*/
typedef unsigned long u32;
typedef unsigned short u16;
typedef unsigned char u8;
typedef unsigned long const uc32; /\* Read Only \*/
typedef unsigned short const uc16; /\* Read Only \*/
typedef unsigned char const uc8; /\* Read Only \*/
typedef volatile unsigned long vu32;
typedef volatile unsigned short vu16;
typedef volatile unsigned char vu8;
typedef volatile unsigned long const vuc32; /\* Read Only \*/
typedef volatile unsigned short const vuc16; /\* Read Only \*/
typedef volatile unsigned char const vuc8; /\* Read Only \*/
二、 GPIO配置
(一) GPIO配置模式
1. 输入浮空
2. 输入上拉
3. 输入下拉
4. 模拟输入
5. 开漏输出
6. 推挽输出
7. 推挽式复用功能
8. 开漏式复用功能
(二)GPIO配置表
(三)STM32输出模式表
(四)GPIO配置方式
- GPIO模式
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_Out_PP 通用推挽输出
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出
2.GPIO速度
GPIO_Speed_ 10MHZ
GPIO_Speed_20MHZ
GPIO_Speed_50MHZ
3.初始化GPIO步骤
1. 初始化端口时钟
2. 端口配置
3. 模式配置
4. 速度配置
5. 初始化
例程:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //LED0-->PC.13端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化
GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC.13 输出高
三、中断配置
(一)中断分类
\qquad STM32中断类型分为:内核异常中断、外部中断。部分中断向量表如下:
\qquad -3到6标黑区域为内核异常,内核异常不能够被打断,不能被设置优先级(也就是说优先级是凌驾于外部中断之上的)。常见的内核异常有以下几种:复位(reset),不可屏蔽中断(NMI),硬错误(Hardfault)……
\qquad 自第7开始及以后为外部中断。外部中断包括:线中断,定时器中断,IIC,SPI等所有外设中断,可配置优先级:抢占式优先级、响应式优先级。
\qquad 抢占式优先级:抢占优先级比较霸道,一言不和就插队。抢占优先级高的,能够打断优先级低的任务,等优先级较高的任务执行完毕后,再回来继续执行之前的任务。所以当存在多个抢占优先级不同的任务时,很有可能会产生任务的嵌套。
\qquad 响应式优先级:响应优先级则稍微谦逊些,比较有礼貌。响应优先级又被称为次优先级,若两个任务的抢占式优先级一样,那么响应优先级较高的任务则先执行,且在执行的同时不能被下一个响应优先级更高的任务打断,所以我说它比较有有礼貌。
(二) 中断控制器(NVIC)
\qquad NVIC负责出SYSTICK之外的中断,标准库提供一套通过NVIC来控制中断的API,NVIC_Init()函数定义并且填充的NVIC_InitTypedef结构体如下:
NVIC_IRQChannel 需要配置的中断向量
NVIC_IRQChannelCmd 使能或者关闭相应中断向量的中断响应
NVIC_IRQChannelPreemptionPriority 配置相应中断向量的抢占优先级
NVIC_IRQChannelSubPriority 配置相应中断的响应优先级
\qquad NVIC只可以配置16种中断向量的优先级,其抢占优先级和响应优先级都用一个4位的数字来决定。在库函数中,将其分为了5种不同的分配方式:
\qquad 第0组:所有的4位都有来表示响应优先级,能够配置16种不同的响应优先级。中断优先级则都相同。(24=16)PreemptionPriority(0),SubPriority(0-15)
\qquad 第1组:最高一位用来配置抢占优先级,剩余三位用来表示响应优先级。那么就有两种不同的抢占优先级(0和1)和8种不同的响应优先级(0~7)。(21=2,23=8)PreemptionPriority(0-1),SubPriority(0-7)
\qquad 第2组:高两位用来配置抢占优先级,低位用来配置响应优先级。那么两种优先级就各有4种。(22=4,22=4)PreemptionPriority(0-3),SubPriority(0-3)
\qquad 第3组:高三位用来配置抢占优先级,低位用来配置响应优先级。有8种抢占优先级和2种相应优先级。(23=8,21=2)PreemptionPriority(0-7),SubPriority(0-1)
\qquad 第4组:所有位都用来配置抢占优先级,即有16种抢占优先级,没有响应属性。(24=16)PreemptionPriority(0-15),SubPriority(0)
\qquad 数值越小,优先级越高。
\qquad 配置API如下:
NVIC_PriorityGroupConfig();
\qquad 输入以下一个参数,代表不同的分配方式:
NVIC_PriorityGroup_0 第0组
NVIC_PriorityGroup_1 第1组
NVIC_PriorityGroup_2 第2组
NVIC_PriorityGroup_3 第3组
NVIC_PriorityGroup_4 第4组
(三) NVIC配置步骤
- 使能某个外设中断,由外设相关中断使能位来控制
- 设置中断优先级分组,初始化NVIC_InitTypeDef结构体,设置抢占式优先级和响应式优先级。
\qquad a) NVIC_IRQChannel:中断源设置,不同外设中断,中断源不一样,中断源名字不同,由 \qquad \qquad STM32库函数提供,中断源名字见stm32f1xx.h文件。
\qquad b) NVIC_IRQChannelPreemptionPriority:抢占式优先级。
\qquad c) NVIC_IRQChannelSubPriority:响应式优先级。
\qquad d) NVIC_IRQChannelCmd:中断使能/失能。ENABLE/DISABLE。 - 初始化NVIC寄存器:NVIC_Init();
- 编写中断服务函数。(中断服务函数名固定,函数名见stm32f1xx_it.c文件)
例程:
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); //使能指定TIM1中断,允许更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //响应优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIMx
四、外部(EXTI)中断
(一)中断控制器(EXTI)
1. EXTI介绍
\qquad STM32F103每个I/O口都可以作为外部中断的中断输入口,中断控制器支持19个外部中断/事件请求。STM32F4外部中断控制器包含23个产生事件/中断请求的边沿检测器,每根输入线都可以进行单独设置,用来选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或者边沿触发)。每个中断设置有状态位,每个中断/事件可独立触发或者屏蔽设置,STM32的19(23)个外部中断为:
EXTI线 0-15 | 对应外部IO口的输入中断 |
---|---|
EXTI线16 | 连接到PVD输出 |
EXTI线17 | 连接到RTC闹钟事件 |
EXTI线18 | 连接到USB、OTG、FS唤醒事件 |
EXTI线19 | 连接到以太网唤醒事件 |
EXTI线20 | 连接到USB OTG HS(FS中配置)唤醒事件 |
EXTI线21 | 连接到RTC入侵和时间戳事件 |
EXTI线22 | 连接到RTC唤醒事件 |
\qquad 注:线18 STM32F1不具有OUG、FS唤醒事件。
\qquad 线19、20、21、22 STM32F4包含,STM32F1不包含。
2. GPIO与EXTI连接方式
\qquad STM32的所有GPIO口引入到EXTI外部中断线上,经过配置所有的IO口均能够触发中断。GPIO与EXTI连接方式如下:
\qquad 由图可知每条中断线对应从PAx – PGx(PIx)共7/9个GPIO,也就是说,同一时刻每一个中断线智能响应一个GPIO端口中断,不能够同时响应所有端口中断,但是可以分时复用。
(二)GPIO与EXTI配置
- STM32的GPIO与EXTI映射关系函数为:
void GPIO_EXTILineConfig(uint_8 GPIO_PorstSource,uint_8 GPIO_PinSource)
- 中断线上中断初始化函数为:
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
- EXTI_InitTypeDef成员变量:
uint32_t EXTI_Line 中断线标号
EXTIMode_TypeDef EXTI_Mode 中断模式
EXTITrigger_TypeDef EXTI_Trigger 触发方式
FunctionlState EXTI_LineCmd 使能中断线
\qquad a) 中断线标号参数:
EXTI_Line0 – EXTI_Line15
\qquad b) 中断模式参数:
EXTI_Mode_Interrupt 中断
EXTI_Mode_Event 事件
\qquad c)外部中断触发方式参数
EXTI_Trigger_Rising 上升沿触发
EXTI_Trigger_Falling 下降沿触发
EXTI_Trigger_Rising_Falling 上升沿或者下降沿触发
- EXTI中断服务函数说明:
中断服务函数存放于启动文件中外部中断函数名如下
EXTIO_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
\qquad 0-4中断线为独立函数,中断线5-9共用函数EXTI9_5_IRQHandler,中断线10-15共用函数 EXTI15_10_IRQHandler。
(三) 外部中断(EXTI)配置步骤
- 初始化IO口作为输入。
- 开启AFIO时钟。
- 设置IO口与中断线的映射关系。
- 初始化线上中断,设置触发条件等。
- 配置中断分组(NVIC),并使能中断。
- 编写中断服务函数。
五、定时器配置
(一)定时器分类
1、 基本定时器--------TIM6、TIM7.
2、 通用定时器--------TIM2—TIM5、TIM9—TIM14.
3、 高级定时器--------TIM1、TIM8.
\qquad 注:TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、TIM12、TIM13、TIM14挂载总线为APB1。
\qquad TIM1、TIM8、TIM9、TIM10、TIM11、TIM15、TIM16、TIM17挂载总线为APB2。
(二)通用定时器TIMx功能介绍
- 16位/32位(TIM2 & TIM5)向上、向下、向上/向下自动装载计数器(TIMx_CNT),TIM9 – TIM14 仅仅支持向上计数。
- 16位预分频器(TIMX_PSC),计数器、时钟频率分频系数:1~65535.
- 4个独立通道(TIMx_CH1-4,TIM9-TIM14最多2个通道)。通道功能:
\qquad a) 输入捕获
\qquad b) 输出比较
\qquad