STM32学习笔记(标准库版)

一、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配置方式

  1. 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配置步骤

  1. 使能某个外设中断,由外设相关中断使能位来控制
  2. 设置中断优先级分组,初始化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。
  3. 初始化NVIC寄存器:NVIC_Init();
  4. 编写中断服务函数。(中断服务函数名固定,函数名见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配置

  1. STM32的GPIO与EXTI映射关系函数为:
	void GPIO_EXTILineConfig(uint_8 GPIO_PorstSource,uint_8 GPIO_PinSource)
  1. 中断线上中断初始化函数为:
	void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
  1. 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 上升沿或者下降沿触发
  1. 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)配置步骤

  1. 初始化IO口作为输入。
  2. 开启AFIO时钟。
  3. 设置IO口与中断线的映射关系。
  4. 初始化线上中断,设置触发条件等。
  5. 配置中断分组(NVIC),并使能中断。
  6. 编写中断服务函数。

五、定时器配置

(一)定时器分类

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功能介绍

  1. 16位/32位(TIM2 & TIM5)向上、向下、向上/向下自动装载计数器(TIMx_CNT),TIM9 – TIM14 仅仅支持向上计数。
  2. 16位预分频器(TIMX_PSC),计数器、时钟频率分频系数:1~65535.
  3. 4个独立通道(TIMx_CH1-4,TIM9-TIM14最多2个通道)。通道功能:
    \qquad a) 输入捕获
    \qquad b) 输出比较
    \qquad
  • 1
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值