《嵌入式系统开发》全套教学课件_第1页
《嵌入式系统开发》全套教学课件_第2页
《嵌入式系统开发》全套教学课件_第3页
《嵌入式系统开发》全套教学课件_第4页
《嵌入式系统开发》全套教学课件_第5页
已阅读5页,还剩420页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STM32F4初探

第1讲STM32初探第2讲STM32芯片解读第4讲GPIO工作原理-跑马灯实验第5讲按键输入实验-GPIO做输入第6讲串口通信第7讲外部中断实验第8讲看门狗实验-IWDG第9讲通用定时器基本原理及定时器中断第10讲定时器PWM输出-TIMER第11讲输入捕捉实验-TIMER第12讲RTC实时时钟+备份区域BKP原理讲解第13讲ADC实验第14讲DMA第16讲DHT11温湿度传感器实验第17讲总结全套可编辑PPT课件目录

2

M4特点:内核,低功耗,外设1STM32芯片家族2

总结3163新的基于ARM内核的32位MCU系列内核为ARM公司为要求高性能、低成本、低功耗的嵌入式应用专门设计的Cortex-M内核标准的ARM架构超前的体系结构高性能低电压低功耗创新的内核以及外设简单易用/自由/低风险1.1什么是STM32

Cortex-M4采用ARMv7-ME架构

ARMv7架构定义了三大分工明确的系列:

“A”系列:面向尖端的基于虚拟内存的操作系统和用户应用

“R”系列:针对实时系统;

“M”系列:对微控制器。Cortex-M3采用ARMv7-M架构,Cortex-M0采用ARMv6-M架构,Cortex-A5/A8采用ARMv7-A架构,

传统的ARM7系列采用的是ARMv4T架构。1.2Cortex内核

1.2Cortex内核

有人问:STM32和ARM有什么区别?1.2Cortex-M4内核

1.2Cortex-M4内核

先进的内核1.3Cortex-M内核对比

1.3M3VSM4

1.3M3VSM4

1.3M3VSM4

1.3M3VSM4

1.4Cortex-M4内核

更低的功耗1.4Cortex-M4低功耗设计

1.4Cortex-M4低功耗设计

1.4Cortex-M4低功耗设计

1.5Cortex-M4内核

更高级的外设1.5Cortex-M4更高级的外设

1.5Cortex-M4更高级的外设

1.5Cortex-M4更高级的外设

1.5Cortex-M4更高级的外设

1.5Cortex-M4更高级的外设

1.5Cortex-M4更高级的外设

1.5Cortex-M4内核

STM32家族1.3Cortex-M家族

1.3Cortex-M家族

2.3STM32F4各芯片关联STM32概念标准的ARMTMCortex-M4内核高性能外设提供两个完整的产品系列开发工具以及软件支持-强大的固件库支持各系列产品全面兼容FamilyToolsPeriphsCore优点可升级的体系结构适用你所有的应用给用户相同的“外观和感受”

统一的软件和开发投入2.4STM32命名规则

3.总结

3.总结总结

STM32最具竞争力的优势:1)极高的性能:主流的Cortex内核。2)丰富合理的外设,合理的功耗,合理的价格。3)强大的软件支持:丰富的软件包。4)全面丰富的技术文档。5)芯片型号种类多,覆盖面广。6)强大的用户基础:最先成功试水CM4芯片的公司,积累

了大批的用户群体,为其领先做铺垫。STM32芯片解读

参考资料:

STM32F4数据手册:STM32F407ZGT6.pdf

STM32F4中文手册:STM32F4xx中文参考手册.pdf

开发板原理图:ExplorerSTM32F4_Vxx_SCH.pdf目录芯片有哪些资源?1芯片内部结构怎样?2芯片引脚和功能怎么对应?3

STM32F4最小系统设计4目录

33

1.芯片有哪些资源?1.1芯片内部资源

STM32F407ZGT6STM32F407ZGT6资源描述参考资料

《STM32选型手册》对应芯片的数据手册-只有英文的

内核:-32位高性能ARMCortex-M4处理器-时钟:高达168M,实际还可以超屏一点点-支持FPU(浮点运算)和DSP指令STM32F407ZGT6资源描述STM32F407ZGT6资源描述

IO口:STM32F407ZGT6:144引脚114个IO-大部分IO口都耐5V(模拟通道除外)-支持调试:SWD和JTAG,SWD只要2根数据线存储器容量:1024KFLASH,192KSRAM

1.1芯片内部资源

时钟,复位和电源管理:

1.8~3.6V电源和IO电压

上电复位,掉电复位和可编程的电压监控

强大的时钟系统-4~26M的外部高速晶振-内部16MHz的高速RC振荡器-内部32KHz低速RC振荡器,看门狗时钟-内部锁相环(PLL,倍频),一般系统时钟都是外部

或者内部高速时钟经过PLL倍频后得到-外部低速32.768K的晶振,主要做RTC时钟源STM32F407ZGT6资源描述

低功耗:-睡眠,停止和待机三种低功耗模式-可用电池为RTC和备份寄存器供电AD:-3个12位AD【多达24个外部测量通道】-内部通道可以用于内部温度测量-内置参考电压

STM32F407ZGT6资源描述

DA:2个12位DADMA:16个DMA通道

,带FIFO和突发支持

支持外设:定时器,ADC,DAC,SDIO,I2S,SPI,I2C,和USART

STM32F407ZGT6资源描述

定时器:多达17个定时器-10个通用定时器(TIM2和TIM5是32位)-2个基本定时器-2个高级定时器-1个系统定时器-2个看门狗定时器STM32F407ZGT6资源描述

通信接口:多达17个通信接口-3个I2C接口-6个串口-3个SPI接口-2个CAN2.0-2个USBOTG-1个SDIO目录

43

2.芯片内部结构怎样?2.1芯片内部结构图

数据手册:P172.1芯片内部结构图

2.1芯片内部结构图

3.芯片引脚和功能怎么对应?3.1芯片内部结构图

3.1芯片内部结构图

怎么查看数据手册引脚功能表3.1芯片内部结构图

STM32最小系统-看原理图

供电

复位

时钟:外部晶振(2个)Boot启动模式选择下载电路(串口/JTAG/SWD)后备电池3.1芯片内部结构图

直接对照原理图讲解最小系统图GPIO基本原理与寄存器配置

目录GPIO基本结构和工作方式1GPIO寄存器说明2STM32F40xGPIO引脚说明3

跑马灯实验4GPIO基本结构

参考资料:探索者STM32F4开发板:

《STM32F4开发指南-寄存器版本》-第六章跑马灯实验6.1小节STM32F4xx官方资料:《STM32F4xx中文参考手册》-第7章通用IO

芯片数据手册1.3STM32引脚说明

STM32F407ZGT6-一共有7组IO口,外加2个PH0和PH1-一共16X7+2=114个IOGPIOA0~A15GPIOB0~B15GPIOC0~C15GPIOD0~D15GPIOE0~E15GPIOF0~F15GPIOG0~G15GPIOH0~H1GPIO基本结构

STM32的大部分引脚除了当GPIO使用外,还可以复用为外设功能引脚(比如串口),这部分知识我们会在后面讲解。本讲主要讲解引脚做IO使用方面的知识。

1.1GPIO基本结构

(FT)

1.1GPIO工作方式

4种输入模式:输入浮空输入上拉输入下拉模拟输入4种输出模式:开漏输出开漏复用功能推挽式输出推挽式复用功能

8种工作模式的区别:STM32八种IO口模式区别.pdf(1)GPIO_Mode_AIN模拟输入(2)GPIO_Mode_IN_FLOATING浮空输入(3)GPIO_Mode_IPD下拉输入(4)GPIO_Mode_IPU上拉输入(5)GPIO_Mode_Out_OD开漏输出(6)GPIO_Mode_Out_PP推挽输出(7)GPIO_Mode_AF_OD复用开漏输出(8)GPIO_Mode_AF_PP复用推挽输出

1.1GPIO工作方式

4种最大翻转速度:

-2MHZ-10MHz-50MHz-100MHzGPIO的输入工作模式1—输入浮空模式1.1GPIO工作方式

GPIO的输入工作模式2—输入上拉模式1.1GPIO工作方式

GPIO的输入工作模式3—输入下拉模式1.1GPIO工作方式

GPIO的输入工作模式4—模拟模式1.1GPIO工作方式

GPIO的输出工作模式1—开漏输出模式1.1GPIO工作方式

GPIO的输出工作模式2—开漏复用输出模式1.1GPIO工作方式

GPIO的输出工作模式3—推挽输出模式1.1GPIO工作方式

GPIO的输出工作模式4—推挽复用输出模式1.1GPIO工作方式

上电复位后,GPIO默认为浮空状态,部分特殊功能引脚为特定状态。1.1GPIO工作方式

1.1GPIO工作方式

推挽输出:可以输出强高低电平,连接数字器件

开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极.要得到高电平状态需要上拉电阻才行.适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)参考帖子:/posts/list/21980.htm1.2GPIO相关配置寄存器

每组GPIO端口的寄存器包括:两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR),一个32位锁定寄存器(GPIOx_LCKR)。每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)。1.2GPIO相关配置寄存器

每组GPIO端口的寄存器包括:一个端口模式寄存器(GPIOx_MODER)一个端口输出类型寄存器(GPIOx_OTYPER)一个端口输出速度寄存器(GPIOx_OSPEEDR)一个端口上拉下拉寄存器(GPIOx_PUPDR)一个端口输入数据寄存器(GPIOx_IDR)一个端口输出数据寄存器(GPIOx_ODR)一个端口置位/复位寄存器(GPIOx_BSRR)一个端口配置锁存寄存器(GPIOx_LCKR)两个复位功能寄存器(低位GPIOx_AFRL&GPIOx_AFRH)4个32位配置寄存器2个32位数据寄存器如果配置一个IO口需要2个位,那么刚好32位寄存器配置一组IO口16个IO口如果配置一个IO口只需要1个位,一般高16位保留BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,BSRRL配置一组IO口的16个IO口的置位状态(1),BSRRH配置复位状态(0)。1.2GPIO相关配置寄存器

一个端口模式寄存器(GPIOx_MODER)一个端口输出类型寄存器(GPIOx_OTYPER)一个端口输出速度寄存器(GPIOx_OSPEEDR)一个端口上拉下拉寄存器(GPIOx_PUPDR)一个端口输入数据寄存器(GPIOx_IDR)一个端口输出数据寄存器(GPIOx_ODR)一个端口置位/复位寄存器(GPIOx_BSRR)一个端口配置锁存寄存器(GPIOx_LCKR)两个复位功能寄存器(低位GPIOx_AFRL&GPIOx_AFRH)是每组IO口含下面10个寄存器。也就是10个寄存器,一共可以控制一组GPIO的16个IO口。1.2GPIO相关配置寄存器

1.2.1端口模式寄存器(GPIOx_MODER)

GPIOportmoderegister1.2GPIO相关配置寄存器

1.2.2端口输出类型寄存器(GPIOx_OTYPER)

GPIOportoutputtyperegister1.2GPIO相关配置寄存器

1.2.3端口输出速度寄存器(GPIOx_OSPEEDR)

GPIOportoutputspeedregister1.2GPIO相关配置寄存器

1.2.4端口上拉/下拉寄存器(GPIOx_PUPDR)

GPIOportpull-up/pull-downregiste1.2GPIO相关配置寄存器

1.2.5端口输入数据寄存器(GPIOx_IDR)

GPIOportinputdataregister1.2GPIO相关配置寄存器

1.2.6端口输出数据寄存器(GPIOx_ODR)

GPIOportOutputdataregister1.2GPIO相关配置寄存器

1.2.7端口置位/复位寄存器(GPIOx_BSRR)

GPIOportbitset/resetregister1.3STM32引脚说明

端口复用功能STM32的大部分端口都具有复用功能。

所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一

些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。

作用:最大限度的利用端口资源1.3STM32引脚说明

端口重映射功能

就是可以把某些功能引脚映射到其他引脚。

比如串口1默认引脚是PA9,PA10可以通过配置重映射映

射到PB6,PB7

作用:方便布线1.3STM32引脚说明

所有IO口都可以作为中断输入

这在我们外部中断实验我们会详细讲解。

硬件连接

跑马灯硬件连接:

GPIO输出方式:

推挽输出(上拉)3.手把手写跑马灯

手把手写跑马灯实验-寄存器。

使能IO口时钟。配置相关寄存器寄存器RCC->AHB1ENR

初始化IO口模式。配置四个配置寄存器

GPIOx_MODER/GPIOx_OTYPER/GPIOx_OSPEEDR/GPIOx_PUPDR

操作IO口,输出高低电平。配置寄存器GPIOX_ODR或者BSRRL/BSRRH。intmain(void){ Stm32_Clock_Init(336,8,2,7); //时钟初始化 delay_init(168); //延时初始化 LED_Init(); //端口初始化

while(1) { LED0=0; LED1=1; delay_ms(300); LED0=1; LED1=0; delay_ms(300); } }1.4跑马灯实验主函数#include"sys.h"#include"delay.h" #include"led.h"#include"sys.h"#include"led.h“voidLED_Init(void){ RCC->AHB1ENR|=1<<5;//使能PORTF时钟

GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//PF9,PF10设置

LED0=1;//LED0关闭LED1=1;//LED1关闭}GPIO_Set函数参见《STM32F4开发指南(寄存器版)》85页Led.cAHB1ENR是AHB1总线上的外设时钟使能寄存器(RCC_APB1ENR)#ifndef__LED_H#define__LED_H #include"sys.h"#defineLED0PFout(9)//DS0#defineLED1PFout(10)//DS1 voidLED_Init(void); //初始化

#endifLed.h按键实验

按键实验硬件连接1GPIO输入操作说明2按键实验准备知识3

按键实验4位带操作51.按键实验硬件连接

STM32F4开发板上载有的4个按钮(WK_UP、KEY0、KEY1和KEY2),来控制板上的2个LED(DS0和DS1)KEY0->PE4上拉输入KEY1->PE3上拉输入KEY2->PE2上拉输入WK_UP->PA0下拉输入2.GPIO输入操作说明

读取IO口输入电平操作寄存器为:GPIOx_IDR:端口输入寄存器使用位带操作读取IO口输入电平:

PEin(4)-读取GPIOE.4口电平PEin(n)-读取GPIOE.n口电平

3.按键输入实验准备知识

按键输入编写思路

使能按键对应IO口时钟。

RCC->AHB1ENR;

初始化IO模式:上拉/下拉输入。

扫描IO口电平。KEY2控制DS0,按一次亮,再按一次灭;KEY1控制DS1,效果同KEY2;WK_UP则同时控制DS0和DS1,按一次,他们的状态就翻转一次。实现的功能3.按键输入实验准备知识

按键扫描思路3.按键输入实验准备知识

C语言关键字:staticStatic申明的局部变量,存储在静态存储区。它在函数调用结束之后,不会被释放。它的值会一直保留下来。所以可以说static申明的局部变量,具有记忆功能。3.按键输入实验准备知识

每次调用getValue函数之后,返回值是多少?int

getValue(void){

static

intflag=0;flag++;returnflag;}intgetValue(void){intflag=0;flag++;returnflag;}3.按键输入实验准备知识

按键扫描(支持连续按)的一般思路u8KEY_Scan(void){if(KEY按下){delay_ms(10);//延时10-20ms,防抖。if(KEY确实按下){returnKEY_Value;}return无效值;}}如果我要实现:按键按下,没有松开,只能算按下一次,这个函数无法实现。3.按键输入实验准备知识

按键扫描(不支持连续按)的一般思路u8KEY_Scan(void){staticu8key_up=1;if(key_up&&

KEY按下){

delay_ms(10);//延时,防抖

key_up=0;//标记这次key已经按下if(KEY确实按下){returnKEY_VALUE;}}elseif(KEY没有按下)key_up=1;

return没有按下}不支持连续按:就是说,按键按下了,没有松开,只能算一次。3.按键输入实验准备知识

按键扫描(两种模式合二为一)的一般思路u8KEY_Scan(u8mode){staticu8key_up=1;

if(mode==1)key_up=1;//支持连续按if(key_up&&

KEY按下){

delay_ms(10);//延时,防抖

key_up=0;//标记这次key已经按下if(KEY确实按下){returnKEY_VALUE;}}elseif(KEY没有按下)key_up=1;

return没有按下}3.按键输入实验准备知识

voidKEY_Init(void){RCC->AHB1ENR|=1<<0;//使能PORTA时钟RCC->AHB1ENR|=1<<4;//使能PORTE时钟GPIO_Set(GPIOE,PIN2|PIN3|PIN4,GPIO_MODE_IN,0,0,GPIO_PUPD_PU);//PE2~4设置上拉输入GPIO_Set(GPIOA,PIN0,GPIO_MODE_IN,0,0,GPIO_PUPD_PD);//PA0设置为下拉输入}4.按键输入实验按键初始化u8KEY_Scan(u8mode){staticu8key_up=1;//按键按松开标志if(mode)key_up=1;//支持连按if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)){delay_ms(10);//去抖动key_up=0;if(KEY0==0)return1;elseif(KEY1==0)return2;elseif(KEY2==0)return3;elseif(WK_UP==1)return4;}elseif(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;return0;//无按键按下}4.按键输入实验按键扫描#ifndef__KEY_H#define__KEY_H#include"sys.h"#defineKEY0PEin(4)//PE4#defineKEY1PEin(3)//PE3#defineKEY2PEin(2)//P32#defineWK_UPPAin(0)//PA0#defineKEY0_PRES1//KEY0按下#defineKEY1_PRES2//KEY1按下#defineKEY2_PRES3//KEY2按下#defineWKUP_PRES4//KEY_UP按下(即WK_UP)voidKEY_Init(void);//IO初始化u8KEY_Scan(u8);//按键扫描函数#endif4.按键输入实验Key.hwhile(1){key=KEY_Scan(0);//得到键值if(key){switch(key){caseWKUP_PRES://控制蜂鸣器LED0=!LED0;LED1=!LED1;break;caseKEY2_PRES://控制LED0翻转LED0=!LED0;break;caseKEY1_PRES://控制LED1翻转LED1=!LED1;break;}}elsedelay_ms(10);}4.按键输入实验主函数5.位带操作位操作原理:

把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问

比特的目的,比如说BSRR寄存器有32个位,那么可以映射到32个地址

上,我们去访问(读-改-写)这32个地址就达到访问32个比特的目的。5.位带操作哪些区域支持位操作:其中一个是SRAM区的最低1MB范围,0x20000000‐0x200FFFFF(SRAM区中的最低1MB)第二个则是片内外设区的最低1MB范围,

0x40000000‐0x400FFFFF(片上外设区中最低1MB)5.位带操作5.位带操作5.位带操作位带操作优越性位带操作详见:Cortex-M3权威指南(中文).pdf目录

串行通信接口背景知识1STM32F1串口框图讲解2STM32串口常用寄存器3

串口配置方法4

串口通信实验讲解51.通信接口背景知识

处理器与外部设备通信的两种方式:并行通信-传输原理:数据各个位同时传输。-优点:速度快-缺点:占用引脚资源多串行通信-传输原理:数据按位顺序传输。-优点:占用引脚资源少-缺点:速度相对较慢1.通信接口背景知识

串行通信:按照数据传送方向,分为:单工:

数据传输只支持数据在一个方向上传输半双工:

允许数据在两个方向上传输,但是,在某一时刻,只允许数

据在一个方向上传输,它实际上是一种切换方向的单工通信;全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个

单工通信方式的结合,它要求发送设备和接收设备都有独立

的接收和发送能力。1.通信接口背景知识

串行通信三种传送方式:1.通信接口背景知识

串行通信的通信方式同步通信:带时钟同步信号传输。-SPI,IIC通信接口异步通信:不带时钟同步信号。-UART(通用异步收发器),单总线1.通信接口背景知识

常见的串行通信接口:通信标准引脚说明通信方式通信方向UART(通用异步收发器)TXD:发送端RXD:接受端GND:公共地异步通信全双工单总线(1-wire)DQ:发送/接受端异步通信半双工SPISCK:同步时钟MISO:主机输入,从机输出MOSI:主机输出,从机输入同步通信全双工I2CSCL:同步时钟SDA:数据输入/输出端同步通信半双工2.STM32串口通信基础

STM32的串口通信接口UART:通用异步收发器USART:通用同步异步收发器STM32F4XX目前最多支持8个UARTSTM32F407一般是6个。USART1和USART6使用PCLK2计时。其它USART使用PCLK1计时。具体可以对照选型手册和数据手册来看。2.STM32串口通信基础

UART异步通信方式引脚连接方法:-RXD:数据输入引脚。数据接受。-TXD:数据发送引脚。数据发送。2.STM32串口通信基础

UART异步通信方式引脚:-RXD:数据输入引脚。数据接受。-TXD:数据发送引脚。数据发送。串口号RXDTXD1PA10(PB7)PA9(PB6)2PA3(PD6)PA2(PD5)3PB11(PC11/PD9)PB10(PC10/PD8)4PC11(PA1)PC10(PA0)5PD2PC126PC7(PG9)PC6(PG14)STM32F4的芯片数据手册中芯片引脚功能中可以查看到。2.STM32串口通信基础

UART异步通信方式特点:全双工异步通信。小数波特率发生器系统,提供精确的波特率。可配置的16倍过采样或8倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能。可编程的数据字长度(8位或者9位);可配置的停止位(支持1或者2位停止位);可配置的使用DMA多缓冲器通信。单独的发送器和接收器使能位。检测标志:①

接受缓冲器②发送缓冲器空③传输结束标志多个带标志的中断源。触发中断。其他:校验控制,四个错误检测标志。2.STM32串口通信基础

串口通信过程数据接收过程:MCU内核输入数据缓冲器串行输入移位寄存器MCU内核输出数据缓冲器串行输出移位寄存器数据发送过程:RXDTXD串行数据输入串行数据输出外部设备外部设备……

STM32串口异步通信需要定义的参数:

起始位数据位(8位或者9位)

奇偶校验位(第9位)

停止位(1-2位)

波特率设置范例:2.STM32串口通信基础

2.STM32串口通信基础

3.STM32串口常用寄存器常用的串口相关寄存器USART_DR状态寄存器USART_SR数据寄存器USART_BRR波特率寄存器USART_CR1波特率寄存器

3.STM32串口常用寄存器

3.STM32串口常用寄存器RXNE(读数据寄存器非空),当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取USART_DR,通过读USART_DR可以将该位清零,也可以向该位写0,直接清除。TC(发送完成),当该位被置位的时候,表示USART_DR内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读USART_SR,写USART_DR。2)直接向该位写0。

3.STM32串口常用寄存器USARTDIV是一个存放在USART_BRR寄存器中的无符号定点数。●当OVER8=0时,小数部分编码为4位并通过USART_BRR寄存器中的DIV_fraction[3:0]位编程。●当OVER8=1时,小数部分编码为3位并通过USART_BRR寄存器中的DIV_fraction[2:0]位编程,此时DIV_fraction[3]位必须保持清零状态。

3.STM32串口常用寄存器波特率计算方法

3.STM32串口常用寄存器OVER8为过采样模式设置位,我们一般设置位0,即16倍过采样已获得更好的容错性;UE为串口使能位,通过该位置1,以使能串口;M为字长选择位,当该位为0的时候设置串口为8个字长外加n个停止位,停止位的个数(n)是根据USART_CR2的[13:12]位设置来决定的,默认为0;PCE为校验使能位,设置为0,则禁止校验,否则使能校验;PS为校验位选择位,设置为0则为偶校验,否则为奇校验;TXIE为发送缓冲区空中断使能位,设置该位为1,当USART_SR中的TXE位为1时,将产生串口中断;TCIE为发送完成中断使能位,设置该位为1,当USART_SR中的TC位为1时,将产生串口中断;RXNEIE为接收缓冲区非空中断使能,设置该位为1,当USART_SR中的ORE或者RXNE位为1时,将产生串口中断;TE为发送使能位,设置为1,将开启串口的发送功能;RE为接收使能位,用法同TE。USART控制寄存器1(USART_CR1)

4.串口配置方法串口配置的一般步骤串口时钟使能,GPIO时钟使能串口复位:这一步不是必须的GPIO端口模式设置:串口参数初始化:开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)⑥使能串口:⑦编写中断处理函数:USARTx_IRQHandler();⑧串口数据收发:⑨串口传输状态获取:

5.串口通信实验讲解串口通信实验题目要求:通过XCOMV2.0将输入尾部具有回车换行的字符串返回显示

5.串口通信实验讲解voiduart_init(u32pclk2,u32bound){floattemp;u16mantissa;u16fraction;temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIVmantissa=temp;//得到整数部分

fraction=(temp-mantissa)*16;//得到小数部分mantissa<<=4;mantissa+=fraction;

……}串口初始化函数

5.串口通信实验讲解RCC->AHB1ENR|=1<<0;//使能PORTA口时钟RCC->APB2ENR|=1<<4;//使能串口1时钟GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出GPIO_AF_Set(GPIOA,9,7);//PA9,AF7GPIO_AF_Set(GPIOA,10,7);//PA10,AF7//波特率设置USART1->BRR=mantissa;//波特率设置USART1->CR1&=~(1<<15);//设置OVER8=0USART1->CR1|=1<<3;//串口发送使能#ifEN_USART1_RX//如果使能了接收//使能接收中断USART1->CR1|=1<<2;//串口接收使能USART1->CR1|=1<<5;//接收缓冲区非空中断使能MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级#endifUSART1->CR1|=1<<13;//串口使能串口初始化函数

5.串口通信实验讲解

5.串口通信实验讲解voidUSART1_IRQHandler(void){u8res;if(USART1->SR&(1<<5))//接收到数据

{res=USART1->DR;if((USART_RX_STA&0x8000)==0)//接收未完成

{if(USART_RX_STA&0x4000)//接收到了0x0d{if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

elseUSART_RX_STA|=0x8000;//接收完成了

}else//还没收到0X0D{if(res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=res;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收

}}}}}串口中断函数//bit15, 接收完成标志//bit14, 接收到0x0d//bit13~0,接收到的有效字节数目u16USART_RX_STA=0;u8USART_RX_BUF[USART_REC_LEN];

5.串口通信实验讲解u8t;u8len;u16times=0;uart_init(84,115200);//串口初始化为115200LED_Init();//初始化与LED连接的硬件接口while(1){if(USART_RX_STA&0x8000){len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度

printf("\r\n您发送的消息为:\r\n");for(t=0;t<len;t++){USART1->DR=USART_RX_BUF[t];while((USART1->SR&0X40)==0);//等待发送结束

}printf("\r\n\r\n");//插入换行

USART_RX_STA=0;}else{times++;if(times%5000==0){printf("\r\nALIENTEKMiniSTM32开发板串口实验\r\n");printf("正点原子@ALIENTEK\r\n\r\n\r\n");}if(times%200==0)printf("请输入数据,以回车键结束\r\n");if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.delay_ms(10);}}主函数目录STM32中断概述1外部中断概述2外部中断一般配置过程3

中断实验4外部中断

参考资料:

《STM32F4开发指南-寄存器版本》-第10章外部中断实验STM32F4xx官方资料:《STM32F4xx中文参考手册》-第10章中断和

事件1、STM32中断概述

CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分。-STM32F40xx/STM32F41xx总共有92个中断。 -STM32F42xx/STM32F43xx则总共有96个中断

STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断和82个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这82个可屏蔽中断。1、STM32中断概述

《STM32F4xx中文参考手册》P234表45和46……STM32F405xx/STM32F407XX向量表10个内核中断82个可屏蔽中断1、STM32中断概述

首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。分组配置是在寄存器SCB->AIRCR中配置:组AIRCR[10:8]IPbit[7:4]分配情况分配结果01110:40位抢占优先级,4位响应优先级11101:31位抢占优先级,3位响应优先级21012:22位抢占优先级,2位响应优先级31003:13位抢占优先级,1位响应优先级40114:04位抢占优先级,0位响应优先级中断管理方法:1、STM32中断概述

高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;抢占优先级&响应优先级区别:1、STM32中断概述

举例:假定设置中断优先级组为2,然后设置

中断3(RTC中断)的抢占优先级为2,响应优先级为1。

中断6(外部中断0)的抢占优先级为3,响应优先级为0。

中断7(外部中断1)的抢占优先级为2,响应优先级为0。那么这3个中断的优先级顺序为:中断7>中断3>中断6。1、STM32中断概述

特别说明:一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。1、STM32中断概述

在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体:typedefstruct{

__IOuint32_tISER[8];//中断使能寄存器组uint32_tRESERVED0[24];

__IOuint32_tICER[8];//中断除能寄存器组uint32_tRSERVED1[24];

__IOuint32_tISPR[8];//中断挂起控制寄存器组uint32_tRESERVED2[24];

__IOuint32_tICPR[8];//中断解挂控制寄存器组 uint32_tRESERVED3[24];

__IOuint32_tIABR[8];//中断激活标志位寄存器组 uint32_tRESERVED4[56];

__IOuint8_tIP[240];//中断优先级控制寄存器组 uint32_tRESERVED5[644];

__Ouint32_tSTIR;//软件触发中断寄存器组}NVIC_Type;1、STM32中断概述

ISER[8]:ISER全称是:InterruptSet-EnableRegisters,这是一个中断使能寄存器组。上面说了CM4内核支持256个中断,这里用8个32位寄存器来控制,每个位控制一个中断。但是STM32的可屏蔽中断最多只有82个,所以对我们来说,有用的就是三个(ISER[0~2]]),总共可以表示96个中断。而STM32只用了其中的前82位。ISER[0]的bit0~31分别对应中断0~31;ISER[1]的bit0~32对应中断32~63;ISER[2]的bit0~17对应中断64~82;这样总共82个中断就分别对应上了。你要使能某个中断,必须设置相应的ISER位为1,使该中断被使能。1、STM32中断概述

IP[240]:全称是:InterruptPriorityRegisters,是一个中断优先级控制的寄存器组。这个寄存器组相当重要!STM32的中断分组与这个寄存器组密切相关。IP寄存器组由240个8bit的寄存器组成,每个可屏蔽中断占用8bit,这样总共可以表示240个可屏蔽中断。而STM32只用到了其中的82个。IP[81]~IP[0]分别对应中断81~0。而每个可屏蔽中断占用的8bit并没有全部使用,而是只用了高4位。这4位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据SCB->AIRCR中的中断分组设置来决定。1、STM32中断概述

//设置NVIC分组//NVIC_Group:NVIC分组0~4总共5组voidMY_NVIC_PriorityGroupConfig(u8NVIC_Group){u32temp,temp1;temp1=(~NVIC_Group)&0x07;//取后三位temp1<<=8;temp=SCB->AIRCR;//读取先前的设置temp&=0X0000F8FF;//清空先前分组temp|=0X05FA0000;//写入钥匙temp|=temp1;SCB->AIRCR=temp;//设置分组}

NVIC的分组函数MY_NVIC_PriorityGroupConfig该函数的参数NVIC_Group为要设置的分组号,可选范围为0~4,总共5组。1、STM32中断概述

/NVIC_PreemptionPriority:抢占优先级//NVIC_SubPriority:响应优先级//NVIC_Channel:中断编号//NVIC_Group:中断分组0~4//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先voidMY_NVIC_Init(u8NVIC_PreemptionPriority,u8NVIC_SubPriority,u8NVIC_Channel,u8NVIC_Group){u32temp;MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组temp=NVIC_PreemptionPriority<<(4-NVIC_Group);temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);temp&=0xf;//取低四位NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK)NVIC->IP[NVIC_Channel]|=temp<<4;//设置响应优先级和抢断优先级}

NVIC设置函数MY_NVIC_Init2、外部中断概述

STM32F4的每个IO都可以作为外部中断输入。STM32F4的中断控制器支持22个外部中断/事件请求:EXTI线0~15:对应外部IO口的输入中断。EXTI线16:连接到PVD输出。EXTI线17:连接到RTC闹钟事件。EXTI线18:连接到USBOTGFS唤醒事件。EXTI线19:连接到以太网唤醒事件。EXTI线20:连接到USBOTGHS(在FS中配置)唤醒事件。EXTI线21:连接到RTC入侵和时间戳事件。EXTI线22:连接到RTC唤醒事件。每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。从上面可以看出,STM32F4供IO使用的中断线只有16个,但是STM32F4xx系列的IO口多达上百个,STM32F407ZGT6(112),

那么中断线怎么跟IO口对应呢?2、

外部中断概述

GPIOx.0映射到EXTI0GPIOx.1映射到EXTI1…GPIOx.15映射到EXTI152、外部中断概述

对于每个中断线,我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。中断寄存器IMR:中断屏蔽寄存器EMR:事件屏蔽寄存器FTSR:下降沿触发选择寄存器RTSR:上升沿触发选择寄存器SWIER:软件中断事件寄存器PR:挂起寄存器2、外部中断概述

中断寄存器2、外部中断概述

IO复用里的外部中断配置寄存器EXTICR。EXTICR在AFIO的结构体中定义,如下:typedefstruct{ __IOuint32_tMEMRMP; __IOuint32_tPMC;

__IOuint32_tEXTICR[4]; uint32_tRESERVED[2]; __IOuint32_tCMPCR;}AFIO_TypeDef;2、外部中断概述

EXTICR寄存器组,总共有4个,因为编译器的寄存器组都是从0开始编号的,所以EXTICR[0]~EXTICR[3],对应《STM32中文参考手册》里面的EXTICR1~EXTICR4。每个EXTICR只用了其低16位。EXTICR[0]的分配如图所示:2、外部中断概述

Ex_NVIC_Config函数voidEx_NVIC_Config(u8GPIOx,u8BITx,u8TRIM){u8EXTADDR;u8EXTOFFSET;EXTADDR=BITx/4;//得到中断寄存器组的编号EXTOFFSET=(BITx%4)*4;

RCC->APB2ENR|=0x01;//使能io复用时钟AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);//清除原来设置!!!AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx//自动设置EXTI->IMR|=1<<BITx;//开启lineBITx上的中断if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//lineBITx上事件下降沿触发if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//lineBITx上事件上升降沿触发}2、

外部中断概述

是不是16个中断线就可以分配16个中断服务函数呢?IO口外部中断在中断向量表中只分配了7个中断向量,也就是

只能使用7个中断服务函数从表中可以看出,外部中断线5~9分配一个中断向量,共用一个服务函数

外部中断线10~15分配一个中断向量,共用一个中断服务函数。2、外部中断概述

EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandler中断服务函数列表:3.外部中断一般配置过程

初始化IO口为输入。②

开启IO口复用时钟。设置IO口与中断线的映射关系。初始化线上中断,设置触发条件等。配置中断分组(NVIC),并使能中断。⑥编写中断服务函数。清除中断标志位

外部中断的一般配置步骤:4、中断实验

硬件连接KEY0->PE4上拉输入KEY1->PE3上拉输入WK_UP->PA0下拉输入4、中断实验

中断初始化voidEXTI_Init(void){KEY_Init();//按键初始化Ex_NVIC_Config(GPIO_A,0,RTIR);//上升沿触发Ex_NVIC_Config(GPIO_E,3,FTIR);//下降沿触发Ex_NVIC_Config(GPIO_E,4,FTIR);//下降沿触发MY_NVIC_Init(2,2,EXTI3_IRQn,2);//抢占2,子优先级2,组2MY_NVIC_Init(1,2,EXTI4_IRQn,2);//抢占1,子优先级2,组2MY_NVIC_Init(0,2,EXTI0_IRQn,2);//抢占0,子优先级2,组2}4、中断实验

中断函数voidEXTI0_IRQHandler(void){delay_ms(10);//消抖if(WK_UP==1)//WK_UP按键{LED0=!LED0;LED1=!LED1;}

EXTI->PR=1<<0;//清除LINE0上的中断标志位}//外部中断3服务程序voidEXTI3_IRQHandler(void){delay_ms(10);/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论