文档库 最新最全的文档下载
当前位置:文档库 › 嵌入式课程设计报告stm32

嵌入式课程设计报告stm32

嵌入式课程设计报告stm32
嵌入式课程设计报告stm32

嵌入式技术与应用

课程设计报告

题目STM32I2C固件库分析与应用学院

专业班级

姓名学号

指导教师

年月日

教师评语:

总分:教师签名:

目录

1 I2C接口

1.1介绍

1.2主要特点

1.3概述

1.4功能描述

1.4.1I2C从模式

1.4.2I2C主模式

1.4.3错误条件

1.4.4SDA/SCL线控制

1.4.5SMBus

1.4.6DMA请求

1.4.7包错误校验(PEC)

1.5 中断请求

1.6 内部集成电路(I2C)

1.6.1 I2C寄存器结构

1.6.2 I2C库函数

1.6.

2.1 函数I2C_DeInit .

1.6.

2.2 函数I2C_ Init

1.6.

2.3 函数I2C_ StructInit

1.6.

2.4 函数I2C_ Cmd

1.6.

2.5 函数I2C_ DMACmd

1.6.

2.6 函数I2C_ DMALastTransferCmd

1.6.

2.7 函数I2C_ GenerateSTART

1.6.

2.8 函数I2C_ GenerateSTOP

1.6.

2.9 函数I2C_ AcknowledgeConfig

1.6.

2.10 函数I2C_ OwnAddress2Config

1.6.

2.11 函数I2C_ DualAddressCmd

1.6.

2.12 函数I2C_ GeneralCallCmd

1.6.

2.13 函数I2C_ ITConfig

1.6.

2.14 函数I2C_ SendData

1.6.

2.15 函数I2C_ ReceiveData

1.6.

2.16 函数I2C_ Send7bitAddress

1.6.

2.17 函数I2C_ ReadRegister

1.6.

2.18 函数I2C_ SoftwareResetCmd

1.6.

2.19 函数I2C_ SMBusAlertConfig

1.6.

2.20 函数I2C_ TransmitPEC

1.6.

2.21 函数I2C_ PECPositionConfig

1.6.

2.22 函数I2C_ CalculatePEC

1.6.

2.23 函数I2C_ GetPEC

1.6.

2.24 函数I2C_ ARPCmd

1.6.

2.25 函数I2C_ StretchClockCmd

1.6.

2.26 函数I2C_ FastModeDutyCycleConfig

1.6.

2.27 函数I2C_ GetLastEvent

1.6.

2.29 函数I2C_ GetFlagStatus

1.6.

2.30 函数I2C_ ClearFlag

1.6.

2.31 函数I2C_ GetITStatus

1.6.

2.32 函数I2C_ ClearITPendingBi

1 2C接口

1.1 介绍

I2C 总线接口连接微控制器和串行I2C 总线。它提供多主机功能,控制所有I2C 总线特定的时序、协议、仲裁和定时。支持标准和快速两种模式,同时与SMBus2.0 兼容。I2C 总线有多种用途,包括CRC 码的生成和校验、SMBus(系统管理总线SystemManagement Bus)、PMBus(电源管理总线Power Management Bus)。根据特定设备的需要,可以使用DMA 以减轻CPU 的负担。

1.2 主要特点

● 并行总线/I2C 总线协议转换器

● 多主机功能:同一接口既可做主设备也可做从设备

● I2C 主设备功能

?产生时钟

?产生起始和停止信号

● I2C 从设备功能

?可编程的I2C 地址检测

?可响应2 个从地址的双地址能力

?停止位检测

● 产生和检测7 位/10 位地址和广播呼叫

● 支持不同的通讯速度

?标准速度(高至100 kHz)

?快速(高至400 kHz)

● 状态标志:

?发送器/接收器模式标志

?字节发送结束标志

? I2C 总线忙标志

● 错误标志

?主模式时的仲裁丢失

?地址/数据传输后的应答(ACK)错误

?检测到起始和停止错位

?禁止拉长时钟功能后的上溢或下溢

● 2 个中断向量

? 1 个中断用于地址/数据通讯成功

? 1 个中断用于出错

● 可选的拉长时钟功能

● 具单字节缓冲器的DMA

● 可配置的PEC(信息包错误检测)的产生或校验:

?发送模式中PEC 值可以作为最后一个字节传输

?用于最后一个接收字节的PEC 错误校验

● 兼容SMBus 2.0

? 25 ms 时钟低超时延时

? 10 ms 主设备累积时钟低扩展时间

? 25 ms 从设备累积时钟低扩展时间

?带ACK 控制的硬件PEC 产生/校验

?支持地址分辨协议(ARP)

● 兼容SMBus

注意不是所有产品中都包含上述所有特性。请参考相关的数据手册,确认该产品支持的I2C 功能。

1.3 概述

I2C 接口接收和发送数据,并将数据从串行转换成并行,或并行转换成串行。可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引脚(SCL)连接到I2C 总线。允许连接到标准(高至100 kHz)或快速(高至400 kHz)I2C 总线。

模式选择

接口可以下述4 种模式中的一种运行:

● 从发送器模式

● 从接收器模式

● 主发送器模式

● 主接收器模式

默认模式为从模式。接口在生成起始条件后自动从从模式切换到主模式;当仲裁丢失或产生停止信号,则从主模式切换到从模式。允许多主机功能。

通信流

主模式时,I2C 接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始和停止条件结束。主模式时,由软件控制产生起始条件和停止条件。

从模式时,I2C 接口能识别它自己的地址(7 位或10 位)和广播呼叫地址。软件控制开启或禁止广播呼叫地址的识别。数据和地址按8 位/字节进行传输,高位在前。跟在起始条件后的第一、二个字节是地址(7 位模式为 1 个字节,10 位模式为 2 个字节)。地址只在主模式发送。在一个字节传输的8 个时钟后的第9 个时钟期间,接收器必须回送一个应答位(ACK)给发送器。参考下图。

图134 I2C 总线协议

软件可以开启或禁止应答(ACK),I2C 接口的地址(7 位、10 位地址或广播呼叫地

址)可通过软件设置。

I2C接口的功能框图示于图135。

图135 I2C的功能框图

注:在SMBus模式下,SMBALERT是可选信号。如果SMBus被禁止,则该信号不可使用。

1.4 功能描述

默认情况下,I2C 接口总是工作在从模式。从默认的从模式切换到主模式,需要产生一个起始条件。

1.4.1 I2C从模式

为了产生正确的时序,必须在I2C_CR2 寄存器中设定外设输入时钟。外设输入时钟的频率必须至少是:

● 标准模式下为:2MHz

● 快速模式下为:4MHz

一旦检测到起始条件,在SDA 线上接收到的地址被送到移位寄存器。然后与芯片自己的地址OAR1 和OAR2(当ENDUAL=1)或者广播呼叫地址(如果ENGC=1)相比较。

注:在10-bit 地址模式时,比较包括头段序列(11110xx0),其中的xx 是地址的两个最高有效位。

头段或地址不匹配:接口将其忽视并等待另一个起始条件。

头段匹配(仅10 位模式):如果ACK 位被置1,接口产生一个应答脉冲并等待8位从地址。

地址匹配:接口产生以下时序:

● 如果ACK 被置1,则产生一个应答脉冲

● 硬件设置ADDR 位,如果设置了ITEVFEN 位,则产生一个中断

● 如果ENDUAL=1,软件必须读DUALF 位,以确认响应了哪个从地址。

在10 位模式,接收到地址序列后,从设备总是处于接收器模式。在收到与地址匹配的头序列并且最低位为1(即11110xx1)后,当接收到重复的起始条件时,将进入发送器模式。

TAR 位在从模式下指示当前是处于接收器模式还是发送器模式。

从发送器

在接收到地址和清除ADDR 位后,从发送器将字节从DR 寄存器经由内部移位寄存器发送到SDA 线上。

从设备保持SCL为低电平,直到ADDR位被清除并且待发送数据已写入DR寄存器。(见图136 中发送序列EV1 EV3)。

当收到应答脉冲时:

● TxE 位被硬件置位,如果设置了ITEVFEN 和ITBUFEN 位,则产生一个中

断。

如果TxE 位被置位,但在上一次数据发送结束之前没有数据写入到DR 寄存器,

则BTF 位被置位,接口将保持SCL 为低电平,以等待写入DR 寄存器。

图136从发送器的传送序列图

说明:S=Start(起始条件),S r=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,EVx=事件(ITEVFEN=1时产生中断)

EV1:ADDR=1,读SR1然后读SR2将清除该事件

EV3-1:TxE=1,移位寄存器空

EV3:TxE=1,读DR将清除该事件;移位寄存器非空

EV3-2:AF=1,在SR1寄存器的AF位写0可以清除AF位

从接收器

在接收到地址和清除ADDR 后,从接收器将通过内部移位寄存器从SDA 线接收

到的字节存进DR 寄存器。接口在接收到每个字节后都生成以下时序:

● 如果设置了ACK 位,则产生一个应答脉冲

● 硬件置位RxNE。如果设置了ITEVFEN 和ITBUFEN 位,则产生一个中

断。

如果RxNE被置位,并且在接收新的数据结束之前DR寄存器未被读出,BTF位被

置位,接口保持SCL为低电平,等待读DR寄存器(见图137 传送序列)。

图137从接收器的传送序列图

说明:S=Start(起始条件),S r=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,EVx=事件(ITEVFEN=1时产生中断)

EV1:ADDR=1,读SR1然后读SR2将清除该事件

EV2:RxNE=1,读DR将清除该事件

EV4:STOPF=1,读SR1然后写CR1寄存器将清除该事件

关闭从通信

在最后一个数据字节被发送后,主设备产生一个停止条件。接口检测到这一条件

时:

● STOPF 位被置位,如果设置了ITEVFEN 位,则产生一个中断,然后接口等待读SR1 寄存器,然后写CR1 寄存器。(见图137 传送时序EV4)。

1.4.2 I2C主模式

在主模式时,I2C 接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始和以停止条件结束。当用START 位在总线上产生了起始条件,设备就进入了主模式。

以下是主模式所要求的时序:

● 在I2C_CR2 寄存器中设定外设时钟以产生正确的时序

● 配置时钟控制寄存器

● 配置上升时间寄存器

● 编程I2C_CR2 寄存器启动外设

● 置I2C_CR2 寄存器中的START 位为1,用于产生起始条件

外设输入时钟频率必须至少是:

● 标准模式下为:2MHz

● 快速模式下为:4MHz

起始条件

当BUSY 位处于清除状态时对START 位置位,使接口产生一个开始条件并切换到主模式(M/SL 位置位)。

注:在主模式下,设置START 位将在当前字节传输完后由硬件产生一个重开始条件。

一旦开始条件发出:

● SB 位被硬件置位,如果设置了ITEVFEN 位,则会产生一个中断。然后主设备等待读SR1 寄存器,紧跟着将从地址写入DR寄存器(见图138 和图139 传送时序EV5)。

从地址的发送

从地址通过内部移位寄存器被送到SDA 线上。

● 在10 位地址模式时,发送一个头段序列产生以下事件:

? ADD10 位被硬件置位,如果设置了ITEVFEN 位,则产生一个中断。

?然后主设备等待一次读SR1 寄存器,跟着将第二个地址字节写入DR寄存器(见图138 和图139 传送时序)。

? ADDR 位被硬件置位,如果设置了ITEVFEN 位,则产生一个中断。

?随后主设备等待一次读SR1 寄存器,跟着读SR2 寄存器(见图138 和图139 传送时序)。

● 在7 位地址模式时,将送出一个地址字节。

一旦该地址字节被送出,

? ADDR 位被硬件置位,如果设置了ITEVFEN 位,则产生一个中断。

随后主设备等待一次读SR1 寄存器,跟着读SR2 寄存器(见图138 和图139 传送时序)。

根据送出从地址的LSB 位,主设备决定进入是发送器模式还是接收器模式。

● 在7 位地址模式时,

?要进入发送器模式,主设备发送从地址时让LSB 等于0。

?要进入接收器模式,主设备发送从地址时让LSB 等于1。

● 在10 位地址模式时

?要进入发送器模式,主设备先送头字节(11110xx0),然后送LSB 位等于0的从地址。(头段字节中的xx 是10 位地址中的最高 2 位。)

?要进入接收器模式,主设备先送头字节(11110xx0),然后送LSB 位等于0的从地址。然后再重新发送一个开始条件,后面跟着头字节(11110xx1)。(头字节中的xx 是10 位地址中的最高2 位)。TRA 位指示主设备是在接收器模式还是发送器模式。

主发送器

在发送了地址和清除了ADDR 位后, 主设备通过内部移位寄存器将字节从DR 寄存器发送到SDA 线上。主设备等到TxE被清除,(见图138 传送时序EV8)。

当收到应答脉冲时:

● TxE 位被硬件置位,如果设置了INEVFEN 和ITBUFEN 位,则产生一个中断。

如果TxE 被置位并且在上一次数据发送结束之前没有写数据字节到DR,则BTF被置位,接口等待BTF 被清除。

关闭通信

在DR寄存器中写入最后一个字节之后,通过将STOP位置位产生一个停止条件(见图138 传送时序EV8_2)。然后接口自动回到从模式(M/S位清除)。

注:当TxE 或BTF 位置位时,停止条件应安排在出现EV8_2 事件时。

图138主发送器传送序列图

说明:S=Start(起始条件),S r=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,EVx=事

件(ITEVFEN=1时产生中断)

EV5:SB=1,读SR1然后将地址写入DR寄存器将清除该事件

EV6:ADDR=1,读SR1然后读SR2将清除该事件

EV8_1:TxE=1,移位寄存器空

EV8:TxE=1,写入DR寄存器将清除该事件

EV8_2:TxE=1,BTF=1,产生停止条件时由硬件清除

EV9:ADDR10=1,读SR1然后写入DR寄存器将清除该事件

主接收器

在发送地址和清除ADDR 之后,I2C 接口进入主接收器模式。在此模式时,接口从SDA 线接收数据字节,并通过内部移位寄存器将其送进DR 寄存器。在每个字节后,接口依次生成以下事件:

● 如果ACK 位被置位,发出一个应答脉冲。

● RxNE位被硬件置位,如果INEVFEN和ITBUFEN位被置起位,则会产生一个中断(见图139 传输时序EV7)。

如果RxNE位被置位,并且在上一次数据接收之后DR寄存器中的数据没有被读走,硬件将置起BTF位,接口等待读DR寄存器。

关闭通信

主设备在从从设备接收到的最后一个字节后发送一个NACK。从设备接收到NACK后,释放对SCL和SDA线的控制。主设备就可以发送一个停止/重起始(Stop/Re-Start)条件。

●为了在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)必须清除ACK位。

●为了产生一个停止/重起始条件,软件必须在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)设置STOP/START位。

在产生了停止条件后,接口自动回到从模式(M/SL位被清除)。

图139主接收器传送序列图

说明:S=Start(起始条件),S r=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,EVx=事件(ITEVFEN=1时产生中断)

EV5:SB=1,读SR1然后将地址写入DR寄存器将清除该事件

EV6:ADDR=1,读SR1然后读SR2将清除该事件。在10位主接受模式下,该事件后应设置CR2的START=1。

EV7:RxNE=1,读DR寄存器清除该事件

EV7_1:RxNE=1,读DR寄存器清除该事件。设置ACK=0和STOP请求

EV9:ADDR10=1,读SR1然后写入DR寄存器将清除该事件

1.4.3 错误条件

以下条件可能造成通讯失败。

总线错误(BERR)

在一个字节传输期间,当I2C 接口检测到一个停止或起始条件则产生此错误。此时:

● BERR 位被置位,如果设置了ITERREN 位,则产生一个中断;

● 在从模式情况下,数据被丢弃,硬件释放总线:

?在错误的开始条件情况下,从设备认为是一个重启动,并等待地址和停止条件。

?在错误的停止条件情况下,从设备与正常停止表现得一样,同时硬件释放总线。

应答错误(AF)

当接口检测到一个无应答位时,产生此错误。此时:

● AF 位被置位,如果设置了ITERREN 位,则产生一个中断;

● 当发送器接收到一个NACK 时,必须复位通讯。

?如果是处于从模式,硬件释放总线

?如果是处于主模式,必须用软件生成一个停止条件

仲裁丢失(ARLO)

当I2C 接口检测到一个仲裁丢失时产生此错误,此时:

● ARLO 位被硬件置位,如果设置了ITERREN 位,则产生一个中断

● I2C 接口自动回到从模式(M/SL 位被清除)

● 硬件释放总线

过载/欠载错误(OVR)

在从模式下,时钟延长被禁止同时I2C 接口正在接收数据时,当接口已经接收到一个字节(RxNE=1),但在DR 寄存器中上一个字节的数据还没有被读走,则可能发生过载错。此时:● 上次接收的数据被丢弃

● 在过载错时,软件应清除RxNE 位,发送器应该重新发送上一次发送的字节。

在从模式下,时钟延长被禁止同时I2C 接口正在发送数据时,在下一个字节的时钟到达之前,下一个字节的数据还未写入更新DR(TxE=1),则可能欠载错。此时:

● 在DR 寄存器中的上一个字节将被重发

● 用户应该确定在发生欠载错时,接收端应丢弃重复接收到的数据。发送端应按I2C 总线标准在规定的时间更新DR。

1.4.4 SDA/SCL线控制

● 如果允许时钟延长:

?发送器模式:如果TxE=1 且BTF=1:接口在传输前保持时钟线路为低,以等待软件读取SR1,然后把字节写进数据寄存器(缓冲器和移位寄存器都是空的)。

?接收器模式:如果RxNE=1 且BTF=1:接口在接收到数据字节后保持时钟线为低,以等待软件读SR1,然后读数据寄存器DR(缓冲器和移位寄存器都是满的)。

● 如果在从模式中禁止时钟延长:

?如果RxNE=1,在接收下个字节前DR 还没有被读走,则发生过载错。接收到的最后一个字节丢失。

?如果TxE=1,在下个字节必须发送之前却没有字节写进DR,则发生欠载错。相同的字节将被重发。

?无写冲突管理

1.4.5 SMBus

介绍

系统管理总线(SMBus)是一个两线接口。通过它,各设备之间以及设备与系统的其他部分之间可以互相通信。它基于I2C 操作原理。SMBus 为系统和电源管理相关的任务提供一条控制总线。一个系统利用SMBus 可以和多个设备互传信息,而不需使用独立的控制线路。

系统管理总线(SMBus)标准涉及三类设备。从设备,接收或响应命令的设备。主设备,用来发布命令,产生时钟和终止发送的设备。主机,是一种专用的主设备,它提供与系统CPU 的主接口。主机必须具有主-从机功能,并且必须支持SMBus 通报协议。在一个系统里只允许有一个主机。

SMBus和I2C之间的相似点

● 2 条线的总线协议(1 个时钟,1 个数据) + 可选的SMBus 提醒线

● 主-从通信,主设备提供时钟

● 多主机功能

● SMBus数据格式类似于I2C的7 位地址格式(见图133)

SMBus和I2C之间的不同点

下表为SMBus 和I2C 的不同点。

SMBus 2 I C

最大传输速度100kHz 最大传输速度400kHz

最小传输速度10kHz 无最小传输速度

35ms时钟低超时无时钟超时

固定的逻辑电平逻辑电平由VDD决定

不同的地址类型(保留、动态等) 7位、10位和广播呼叫从地址类型

不同的总线协议(快速命令、处理呼叫等) 无总线协议

SMBus应用用途

利用系统管理总线,设备可提供制造商信息,告诉系统它的型号/部件号,保存暂停事件的状态,报告不同类型的错误,接收控制参数,和返回它的状态。SMBus为系统和电源管理相关的任务提供控制总线。

设备标识

在系统管理总线上,任何一个作为从模式的设备都有一个唯一的地址,叫做从地址。保留的从地址表请参考2.0 版的SMBus规范(https://www.wendangku.net/doc/5611047040.html,/specs/)。

总线协议

SMBus技术规范支持9 个总线协议。有关这些协议的详细资料和SMBus地址类型,请参考2.0 版的SMBus规范(https://www.wendangku.net/doc/5611047040.html,/specs/)。这些协议由用户的软件来执行。

地址解析协议(ARP)

SMBus 从地址冲突可以通过给每个从设备动态分配一个新的唯一地址来解决。ARP 有以下的属性:

● 地址分配利用标准SMBus 物理层仲裁机制

● 当设备维持供电期间,分配的地址仍保持不变,允许设备在断电时保留其地址。

● 在地址分配后,没有额外的SMBus 的打包开销(也就是说访问分配地址的设备与访问固定地址的设备所用时间是一样的)。

● 任何一个SMBus 主设备可以遍历总线。

唯一的设备标识符(UDID)

为了提供一种为进行地址分配目的而区分每个设备的机制,每个设备必须拥有一

个唯一的设备标识符。

关于在ARP上128 位的UDID细节的信息,参考 2.0 版的SMBus规范

(https://www.wendangku.net/doc/5611047040.html,/specs/)。

SMBus提醒模式

SMBus提醒是一个带中断线的可选信号,用于那些希望扩展他们的控制能力而牺牲一个引脚的设备。SMBALERT和SCL和SDA信号一样,是一种线与信号。SMBALERT通常和SMBus广播呼叫地址一起使用。与SMBus有关的消息为2字节。

单一的从设备可以通过SMBALERT发信号给主机表示它希望进行通信,这可通过设置

I2C_CR1寄存器上的ALERT位实现。主机处理该中断并通过提醒响应地址ARA(Alert Response Address,地址值为0001100x)访问所有SMBALERT设备。只有那些将MBALERT拉低的设备能应答ARA。此状态是由I2C_SR1寄存器中的SMBALERT状态标记来标识的。主机执行一个修改过的接收字节操作。由从发送设备提供的7位设备地址被放在字节的7个最高位上,第八个位可以是0或1。

如果多个设备把SMBALERT拉低,最高优先级设备(最小的地址)将在地址传输期间通过标准仲裁赢得通信权。在确认从地址后,此设备不得再拉低它的SMBALERT,如果当信息传输完成后,主机仍看到SMBALERT低,就知道需要再次读ARA。

没有执行SMBALERT信号的主机可以定期访问ARA。有关SMBus提醒模式的更多详细资料,请参考2.0版的SMBus规范(https://www.wendangku.net/doc/5611047040.html,/specs/)。

超时错误

在定时规范上I2C和SMBus之间有很多差别。

SMBus定义一个时钟低超时,35ms的超时。SMBus规定TLOW:SEXT为从设备的累积时钟低扩展时间。SMBus规定TLOW:MEXT为主设备的累积时钟低扩展时间。更多超时细节请参考2.0版的SMBus规范(https://www.wendangku.net/doc/5611047040.html,/specs/)。

I2C_SR1中的状态标志Timeout或Tlow错误表明了这个特征的状态。

如何使用SMBus模式的接口

为了从I2C模式切换到SMBus模式,应该执行下列步骤:

●设置I2C_CR1寄存器中的SMBus位

●按应用要求配置I2C_CR1寄存器中的SMBTYPE和ENARP位。

如果你想把设备配置成主设备,产生起始条件的步骤见15.4.2 I2C主模式。否则,参见1.4.1 I2C从模式。

软件程序必须处理多种SMBus协议。

●如果ENARP=1且SMBTYPE=0,使用SMB设备默认地址。

●如果ENARP=1且SMBTYPE=1,使用SMB主设备头字段。

●如果SMBALERT=1,使用SMB提醒响应地址。

1.4.6 DMA请求

DMA请求(当被使能时)仅用于数据传输。发送时数据寄存器变空或接收时数据寄

存器变满,则产生DMA请求。当为相应DMA通道设置的数据传输量已经完成

时,DMA控制器发送传输结束信号ETO到I2C接口,并且在中断允许时产生一

个传输完成中断:

●主发送器:在EOT中断服务程序中,需禁止DMA请求,然后在等到BTF

事件后设置停止条件。

●主接收器:DMA控制器发送一个硬件信号EOT_1,它对应DMA传输(字节

数-1)。如果在I2C_CR2寄存器中设置了LAST位,硬件在发送完EOT_1

后的下一个字节,将自动发送NACK。在中断允许的情况下,用户可以在

DMA传输完成的中断服务程序中产生一个停止条件。

注:请参考产品手册以确认您所选用型号有DMA控制器。如果DMA不可用,用户

该如前面所描述的方法使用I2C。在I2C ISR中,可以清除TxE/RxNE标记以达到

连续的通信。

利用DMA发送

DMA 模式可以通过设置I2C_CR2 寄存器中的DMAEN 位来激活。在接收到地址

序列后并清除了ADDR 位,才能设置DMAEN 位。只要TxE 位被置位,数据将

由DMA 从预置的存储区装载进I2C_DR 寄存器。为I2C 分配一个DMA 通道,须

执行以下步骤。(x 是通道号)

1.在DMA_CPARx寄存器中设置I2C_DR寄存器地址。数据将在每个TxE事件后从存储器送进这个地址。

2.在DMA_CMARx寄存器中设置存储器地址。数据在每个TxE事件后从这个存储区装载进I2C_DR。

3.在DMA_CNDTRx寄存器中设置所需的传输字节数。在每个TxE事件后,此值将被递减。

4.利用DMA_CCRx寄存器中的PL[0:1]位配置通道优先级。

5.设置DMA_CCRx寄存器中的DIR位,并根据应用要求可以配置在整个传输完成一半或全部完成时发出中断请求。

6.通过设置DMA_CCTx寄存器上的EN位激活通道。

当DMA 控制器中设置的数据传输数目已经完成时,DMA 控制器给I2C 接口发送一个传输结束的EOT/ EOT_1 信号。在中断允许的情况下,将产生一个DMA 中断。

注:如果使用DMA进行发送时,不要设置I2C_CR2寄存器的ITEVTEN位。

利用DMA接收

DMA接收模式可以通过设置I2C_CR2寄存器中的DMAEN位激活。只有在接收到地址序列后并且ADDR为被清除后,才能设置DMAEN位。接收到数据字节时,数据将由DMA从I2C_DR寄存器传送到设置的存储区(参考DMA说明)。设置DMA通道进行

I2C接收,须执行以下步骤。(x是通道号)

1 在DMA_CPARx寄存器中设置I2C_DR寄存器的地址。数据将在每次RxNE事件后从此地址传送到存储区。

2 在DMA_CMARx寄存器中设置存储区地址。数据将在每次RxNE事件后从I2C_DR寄存器传送到此存储区。

3 在DMA_CNDTRx寄存器中设置所需的传输字节数。在每个RxNE事件后,此值将被递减。

4 用DMA_CCRx寄存器中的PL[0:1]配置通道优先级。

5 清除DMA_CCRx 寄存器中的DIR 位,根据应用要求可以设置在数据传 输完成一半或全部完成时发出中断请求。

6 设置DMA_CCRx 寄存器中的EN 位激活该通道。

当 DMA 控制器中设置的数据传输数目已经完成时,DMA 控制器给 I2C 接口发送一个传输结束的 EOT/ EOT_1 信号。在中断允许的情况下,将产生一个 DMA 中断。 注: 如果使用 DMA 进行接收时,不要设置 I2C_CR2 寄存器的 ITEVTEN 位。

1.4.7 包错误校验(PEC)

包错误校验(PEC)计算器是用于提高通信的可靠性,这个计算器使用一个可编程的多项式对每一位串行数据进行计算。

● PEC 计算由 I2C_CR1 寄存器的 ENPEC 位激活。PEC 使用 CRC-8 算法对所有信息字节进行计算,包括地址和读/写位在内。

? 在发送时:在最后一个 TxE 事件时设置 I2C_CR1 寄存器中的 PEC 传输位,PEC 将在当前字节后被发送。

? 在接收时:在最后一个 RxNE 事件时设置 I2C_CR1 寄存器中的 PEC 位,如 果 下 个 接 收 到 的 字 节 不 等 于 内 部 计 算 的 PEC , 接 收 器 发 送 一 个

NACK 。 如 果 是 主 接 收 器 , 不 管 校 对 的 结 果 如 何 , PEC 后 都 将 发 送NACK 。

● 在 I2C_SR1 寄存器中可获得 PECERR 错误标记/中断。 ● 如果 DMA 和 PEC 计算器都被激活:

? 在发送时:当 I2C 接口从 DMA 控制器处接收到 EOT 信号时,它在最后一个字节后自动发送 PEC 。

? 在接收时:当 I2C 接口从 DMA 处接收到一个 EOT_1 信号时,它将自动把下一个字节作为 PEC ,并且将检查它。在接收到 PEC 后产生一个DMA 请求。

● 为了允许中间 PEC 传输,在 I2C_CR2 寄存器中有一个控制位(LAST 位)用于判别是否 真是最后一 个 DMA 传输。如果确 实是最后一 个主接收器的DMA 请求,在接收到最后一个字节后自动发送 NACK 。 ● 仲裁丢失时 PEC 计算失效。

1.5 中断请求

表46 I 2C 中断请求表:

中断事件

事件标志 开启控制位

起始位已发送(主)

SB ITEVFEN 地址已发送(主) 或 地址匹配(从) ADDR 10位头段已发送(主) ADD10 已收到停止(从) STOPF 数据字节传输完成 BTF 接收缓冲区非空 RxNE ITEVFEN 和 ITBUFEN 发送缓冲区空 TxE 总线错误 BERR ITERREN 仲裁丢失(主) ARLO 响应失败 AF 过载/欠载

OVR

PEC错误PECERR

超时/Tlow错误TIMEOUT

SMBus提醒SMBALERT

注:1 SB、ADDR、ADD10、STOPF、BTF、RxNE、TxE通过逻辑或汇到同一个中断通道中。

2 BERR、ARLO、AF、OVR、PECERR、TIMEOUT、SMBALERT通过逻辑或汇到同一个中断通道中。

图140 I2C中断映射图

1.6内部集成电路(I2C)

I2C 总线接口连接微控制器和串行I2C 总线。它提供多主机功能,控制所有I2C 总线特定的时序、协议、

仲裁和定时。支持标准和快速两种模式,同时与SMBus 2.0 兼容。I2C 总线有多种用途,包括CRC 码的

生成和校验、SMBus(系统管理总线System Management Bus) PMBus(电源管理总线Power Management Bus)。

I2C 驱动可以用来通过I2C 界面发送和接收数据,还可以返回传输操作的状态。

Section 11.1 I2C 寄存器结构描述了固件函数库所使用的数据结构,Section 11.2 固件库函数介绍了函数库里的所有函数。

1.6.1 I2C寄存器结构

I2C 寄存器结构,I2C_TypeDeff,在文件“stm32f10x_map.h”中定义如下:

typedef struct

{

vu16 CR1;

u16 RESERVED0;

vu16 CR2;

u16 RESERVED1;

vu16 OAR1;

u16 RESERVED2;

vu16 OAR2;

u16 RESERVED3;

vu16 DR;

u16 RESERVED4;

vu16 SR1;

u16 RESERVED5;

vu16 SR2;

u16 RESERVED6;

vu16 CCR;

u16 RESERVED7;

vu16 TRISE;

u16 RESERVED8;

} I2C_TypeDef;

Table 204.例举了I2C 所有寄存器

Table 204. I2C寄存器

寄存器描述

CR1 I2C 控制寄存器1

CR2 I2C 控制寄存器2

OAR1 I2C 自身地址寄存器1

OAR2 I2C 自身地址寄存器2

DR I2C 数据寄存器

SR1 I2C 状态寄存器1

SR2 I2C 状态寄存器2

CCR I2C 时钟控制寄存器

TRISE I2C 上升时间寄存器

2 个I2C 外设声明于文件“stm32f10x_map.h”:

...

#define PERIPH_BASE ((u32)0x40000000)

#define APB1PERIPH_BASE PERIPH_BASE

#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)

#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)

....

#define I2C1_BASE (APB1PERIPH_BASE + 0x5400)

#define I2C2_BASE (APB1PERIPH_BASE + 0x5800)

....

#ifndef DEBUG

...

#ifdef _I2C1

#define I2C1 ((I2C_TypeDef *) I2C1_BASE)

#endif /*_I2C1 */

#ifdef _I2C2

#define I2C2 ((I2C_TypeDef *) I2C2_BASE)

#endif /*_I2C2 */

...

#else /* DEBUG */

...

#ifdef _I2C1

EXT I2C_TypeDef *I2C1;

#endif /*_I2C1 */

#ifdef _I2C2

EXT I2C_TypeDef *I2C2;

#endif /*_I2C2 */

...

#endif

使用Debug 模式时,初始化指针I2C1, I2C2于文件“stm32f10x_lib.c”:

...

#ifdef _I2C1

I2C1 = (I2C_TypeDef *) I2C1_BASE;

#endif /*_I2C1 */

#ifdef _I2C2

I2C2 = (I2C_TypeDef *) I2C2_BASE;

#endif /*_I2C2 */

...

为了访问I2C 寄存器,_I2C,_I2C1, _I2C2必须在文件“stm32f10x_conf.h”中定义如下:...

#define _I2C

#define _I2C1

#define _I2C2

...

16.2 I2C库函数

Table 205. 例举了I2C 的库函数

Table 205. I2C库函数

函数名描述

I2C_DeInit 将外设I2Cx 寄存器重设为缺省值

I2C_Init 根据I2C_InitStruct 中指定的参数初始化外设I2Cx 寄存器I2C_StructInit 把I2C_InitStruct 中的每一个参数按缺省值填入

I2C_Cmd 使能或者失能I2C 外设

I2C_DMACmd 使能或者失能指定I2C 的DMA 请求

I2C_DMALastTransferCmd 使下一次DMA 传输为最后一次传输

I2C_GenerateSTART 产生I2Cx 传输START 条件

I2C_GenerateSTOP 产生I2Cx 传输STOP 条件

I2C_AcknowledgeConfig 使能或者失能指定I2C 的应答功能

I2C_OwnAddress2Config 设置指定I2C 的自身地址2

I2C_DualAddressCmd 使能或者失能指定I2C 的双地址模式

I2C_GeneralCallCmd 使能或者失能指定I2C 的广播呼叫功能

I2C_ITConfig 使能或者失能指定的I2C 中断

I2C_SendData 通过外设I2Cx 发送一个数据

I2C_ReceiveData 返回通过I2Cx 最近接收的数据

I2C_Send7bitAddress 向指定的从I2C 设备传送地址字

I2C_ReadRegister读取指定的I2C 寄存器并返回其值

I2C_SoftwareResetCmd使能或者失能指定I2C 的软件复位

I2C_SMBusAlertConfig驱动指定I2Cx 的SMBusAlert 管脚电平为高或低

I2C_TransmitPEC使能或者失能指定I2C 的PEC 传输

I2C_PECPositionConfig选择指定I2C 的PEC 位置

I2C_CalculatePEC使能或者失能指定I2C 的传输字PEC 值计算

I2C_GetPEC返回指定I2C 的PEC 值

I2C_ARPCmd使能或者失能指定I2C 的ARP

I2C_StretchClockCmd使能或者失能指定I2C 的时钟延展

I2C_FastModeDutyCycleConfig选择指定I2C 的快速模式占空比

I2C_GetLastEvent返回最近一次I2C 事件

I2C_CheckEvent检查最近一次I2C 事件是否是输入的事件

I2C_GetFlagStatus检查指定的I2C 标志位设置与否

I2C_ClearFlag清除I2Cx 的待处理标志位

I2C_GetITStatus检查指定的I2C 中断发生与否

I2C_ClearITPendingBit清除I2Cx 的中断待处理位

1.6.

2.1函数I2C_DeInit

Table 206. 描述了函数I2C_DeInit

Table 206.函数I2C_DeInit

函数名I2C_DeInit

函数原形void I2C_DeInit(I2C_TypeDef* I2Cx)

功能描述将外设I2Cx 寄存器重设为缺省值

输入参数I2Cx:x 可以是 1 或者2,来选择I2C 外设

输出参数无

返回值无

先决条件无

被调用函数RCC_APB1PeriphClockCmd().

例:

/* Deinitialize I2C2 interface*/

I2C_DeInit(I2C2);

1.6.

2.2函数I2C_ Init

Table 207. 描述了函数I2C_Init

Table 207.函数I2C_Init

函数名I2C_Init

函数原形void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct)

功能描述根据I2C_InitStruct 中指定的参数初始化外设I2Cx 寄存器

输入参数 1 I2Cx:x 可以是 1 或者2,来选择I2C 外设

输入参数 2 I2C_InitStruct:指向结构I2C_InitTypeDef 的指针,包含了外设GPIO 的配置信息参阅Section:I2C_InitTypeDef 查阅更多该参数允许取值范围

输出参数无

返回值无

先决条件无

被调用函数无

I2C_InitTypeDef structure

I2C_InitTypeDef 定义于文件“stm32f10x_i2c.h”:

typedef struct

{

u16 I2C_Mode;

u16 I2C_DutyCycle;

u16 I2C_OwnAddress1;

u16 I2C_Ack;

u16 I2C_AcknowledgedAddress;

u32 I2C_ClockSpeed;

} I2C_InitTypeDef;

I2C_Mode

I2C_Mode 用以设置I2C 的模式。Table 208. 给出了该参数可取的值

Table 208. I2C_Mode值

I2C_Mode 描述

I2C_Mode_I2C 设置I2C 为I2C 模式

I2C_Mode_SMBusDevice 设置I2C 为SMBus 设备模式

I2C_Mode_SMBusHost 设置I2C 为SMBus 主控模式

I2C_DutyCycle

I2C_DutyCycle 用以设置I2C 的占空比。Table 209. 给出了该参数可取的值

Table 209. I2C_DutyCycle 值

I2C_DutyCycle 描述

I2C_DutyCycle_16_9 I2C 快速模式Tlow / Thigh = 16/9

I2C_DutyCycle_2 I2C 快速模式Tlow / Thigh = 2

注意:该参数只有在I2C 工作在快速模式(时钟工作频率高于100KHz)下才有意义。

I2C_OwnAddress1

该参数用来设置第一个设备自身地址,它可以是一个7 位地址或者一个10 位地址。

I2C_Ack

I2C_Ack 使能或者失能应答(ACK),Table 210. 给出了该参数可取的值

Table 210. I2C_Ack值

I2C_Ack 描述

I2C_Ack_Enable 使能应答(ACK)

I2C_Ack_Disable 失能应答(ACK)

I2C_AcknowledgedAddress

I2C_AcknowledgedAddres 定义了应答7 位地址还是10 位地址。Table 211. 给出了该参数可取的值

Table 211. I2C_AcknowledgedAddres值

I2C_AcknowledgedAddres 描述

I2C_AcknowledgeAddress_7bit 应答7 位地址

I2C_AcknowledgeAddress_10bit 应答10 位地址

I2C_ClockSpeed

该参数用来设置时钟频率,这个值不能高于400KHz。

例:

/* Initialize the I2C1 according to the I2C_InitStructure members */ I2C_InitTypeDef I2C_InitStructure;

I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost;

I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

I2C_InitStructure.I2C_OwnAddress1 = 0x03A2;

I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;

I2C_InitStructure.I2C_AcknowledgedAddress =

I2C_AcknowledgedAddress_7bit;

北京科技大学 嵌入式课程设计报告

《嵌入式控制系统》课程设计报告 学院 专业班级 姓名 学号 指导教师 _

目录 摘要 (4)

Abstract (4) 引言 (5) 带中断LED数码管驱动程序设计 (6) 1.设计内容 (6) 1.1 基本功能 (6) 1.2 扩展功能 (6) 1.3创新功能 (6) 2.实验设备 (6) 3.设计功能块说明 (6) 4.设计原理 (7) 4.1 LED发光原理 (7) 4.2 八位LED显示器 (8) 5. 实验步骤 (8) 5.1 驱动程序加载 (8) 5.2 添加控件 (8) 5.3基本功能的实现 (9) 5.4 使用指南 (10) 6. 实验结果 (10) 6.1 基本功能实现结果 (10) 6.2 LED数码管清零功能实现结果 (11) 6.3 中断计数功能实现结果 (12) 6.4 频率设置功能实现结果 (13) 7. 心得体会 (14) 附录 (16)

摘要 通过嵌入式控制系统课程的学习并结合本次课程设计,了解嵌入式系统的开发方法和流程,熟悉Intel XScale硬件平台及其应用处理机的使用方法,熟悉Windows CE嵌入式系统的基本原理、概念。能针对Intel XScale硬件平台、应用需求自行定制、优化WinCE操作系统,并独立编写可在Intel XScale嵌入式设备上运行的应用程序。 本课程设计主要实现了LED数码管的驱动程序,中断计数功能、LED显示清零功能、LED 数字显示频率设置的功能。 关键字:WINCE 中断数码管驱动 Abstract Learning Embedded Control Systems and combining the curriculum design can help us understand the Embedded Control Sy stems’ development methods and processes, and be familiar with Intel XScale Hardware platform and its usage. Know well the basic principles and concepts about WINCE. Design and optimize Windows Embedded Compact and compose Application software program that can operate on the Intel XScale Hardware platform. The main achievement of the curriculum design are drivers for LED, Interrupt Count, clean the results of the LED and set up the display frequency of the LED. Key words: WINCE Interrupt Digital Driving

STM32嵌入式系统实验报告模板

实验一使用固件函数库创建库函数模板 一、实验目的 1. 熟悉STM32的开发环境MDK Keil和仿真软件Proteus 2. 熟悉STM32的固件库函数文件夹 3. 掌握STM32固件库的使用方法 二、实验内容 1.开发自己的固件库函数模板 三、预备知识 掌握基于STM32固件库进行编程的方法。 四、实验设备 1. 硬件环境配置 计算机:Intel(R) Pentium(R) 及以上; 内存:1GB及以上; 实验设备:嵌入式开发平台,USB转串口数据线; 2. 软件环境配置 操作系统:Microsoft Windows XP Professional Service Pack 2; 集成开发环境:Keil μVision5 IDE; 五、实验过程 1.创建本地文件夹和软件中的文件夹 2. 对软件中的文件夹进行配置

3.软件设计及代码(写一个简单的main函数)

六、遇到的问题及解决方法

实验二使用STM32固件库点亮LED灯 一、实验目的 1. 掌握STM32固件库的使用方法 2. 掌握基于库函数模板的开发方法 3. 掌握基于固件库进行GPIO端口编程的方法 二、实验内容 1. 使用Proteus软件设计点亮LED灯电路 2. 基于固件库进行编程 3. 基于固件库编程控制GPIO端口的输出,进而控制LED灯的显示状态 三、预备知识 掌握基于STM32固件库进行编程的方法;掌握Proteus软件的使用方法;掌握GPIO端口的组成、工作方式、编程方法。 四、实验设备 1. 硬件环境配置 计算机:Intel(R) Pentium(R) 及以上; 内存:1GB及以上; 实验设备:嵌入式开发平台,USB转串口数据线; 2. 软件环境配置 操作系统:Microsoft Windows XP Professional Service Pack 2; 集成开发环境:Keil μVision5 IDE; 五、实验过程 1.LED灯电路设计 2. GPIO初始化过程

ARM课程设计报告

摘要 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D 转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。 定时器是对外设时钟(PCLK)进行计数,根据4个匹配寄存器的设定,可以设置为匹配时产生中断或执行其他动作。它还包括4个捕获输入,用于在输入信号发生跳变时捕获定时器的当前值,并可选择产生中断。 关键字:单片机 LPC2106 GPIO 定时器timer 实时时钟外部中断Int 目录 第一章原理与总体方案 (4) 1.1单片机简介 (4) 1.2 LPC2106简介 (5) 1.3单片机的选择 (7) 1.4 LPC2106芯片的选择及设计原理 (8) 第二章硬件设计 (9) 2.1 LED显示电路 (9) 2.2电路图整体设计 (9) 第三章调试 (12) 3.1调试及处理 (12) 第四章测试与分析 (14)

4.1Proteus软件介绍 (14) 4.2仿真结果 (15) 第五章结束语 (16) 5.1结束语 (16) 第1章原理与总体方案 本章阐述了本课题研究的背景,表述了单片机的发展、功能以及LPC2114的简单介绍。阐述了单片机的选择原理以及LPC2106的设计原理。 1.1数字单片机简介 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D 转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。 近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。其中系统的抗干扰性能是系统可靠性的重要指标。 单片机的另外一个名称就是嵌入式微控制器,原因在于它可以嵌入到任何微型或小型仪器或设备中。目前,把单片机嵌入式系统和Internet连接已是一种趋势。但是,Internet一向是一种采用肥服务器,瘦用户机的技术。这种技术在互联上存储及访问大量数据是合适的,但对于控制嵌入式器件就成了"杀鸡用牛刀"了。要实现嵌入式设备和Int ernet连接,就需要把传统的Internet理论和嵌入式设备的实践都颠倒过来。为了使复杂的或简单的嵌入式设备,例如单片机控制的机床、单片机控制的门锁,能切实可行地和Internet连接,就要求专门为嵌入式微控制器设备设计网络服务器,使嵌入式设备可以和Internet相连,并通过标准网络浏览器进行过程控制。

嵌入式课程设计

嵌入式课程设计 学院:计算机与通信工程学院专业:物联网工程班级:物联1501 姓名:王强学号:41501602 实验日期:2017年12月25日 实验名称: 嵌入式课程设计 实验目的: 以STC89开发板为硬件平台,开发温度采集、动态数码管显示、按键响应、与PC串口通讯的综合程序,实现以下功能: 1)PC上的串口调试助手通过串口给STC89开发板发送“GetTemp”命令。 2)STC89开发板从串口接收到“GetTemp”命令后启动温度传感器DS18B20的测温程序获取当前温度,测试完成时将所测得温度数据显示在动态数码管上。(动态数码管在温度获取之前应该显示“FFFFFFFF”,只有在获取温度后才显示温度值) 3)动态数码管显示出温度数据后,请通过按键触发STC89开发板通过串口回送步骤2所测的温度数据给PC上串口调试助手,同时恢复动态数码管显示为“FFFFFFFF”。为保证每个同学的实验都独立完成,要求回送的数据包含自己的学号,即如果你的学号是20150809,当前温度值是19.6摄氏度,那么在PC上的串口调试助手应该显示:20150809 : 19.6°C。硬件电路说明: 1)STC89处理器管脚和晶振电路

2)独立按键 独立按键一共5个,分别连接在单片机的P3.0到P3.4口。去抖动的方式,我们采用软件延时的方法。过程如下: 先设置IO口为高电平(一般上电默认就为高),读取IO口电平确认是否有按键按下,如有IO电平为低电平后,延时几个ms,再读取该IO电平,如果任然为低电平,说明对应按键按下,执行相应按键的程序。 3)DS18B20温度传感器部分 DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。 高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。 初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。 初始时,计数器1预置的是与-55℃相对应的一个预置值。以后计数器1每一个循环的预置数都由斜率累加器提供。为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。 DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25℃进行比较,若低于0.25℃,温度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃时,温度寄存器的最低位就进位然后置0。这样,经过比较后所得的温度寄存器的值就是最终读

嵌入式课程设计报告

嵌入式课程设计报告设计题目:电子密码锁

、 摘要 随着科技和人们的生活水平的提高,实现防盗的问题也变得尤为突出,传统机械锁构造简单,电子锁的保密性高,使用灵活性好。根据需要设计运用W90P170开发板,制作一款电子密码锁,密码锁通过键盘输入密码,通过在LCD的文字和图片显示当前密码锁的状态。实现设置密码,密码验证,错误密码自锁、图片显示的功能。 目录

一、选题意义及系统功能 (3) 二、硬件设计及描述 (4) 三、软件设计及描述 (5) 四、程序代码 (6) 五、课程设计体会 (11) 六、运行结果 (12) 七、心得体会 (12) 八、参考文献 (13) 九、附录 (13) 一、选题意义及功能描述 1、选题意义 电子密码锁是通过密码输入来控制电路或是芯片工作,从而控制机械的开关闭合、开锁的电子产品。随着科技提高和人们生活水平的提高,对电子密码锁的需求增加。电子密码做较传统的机械锁安全性能更高。 特点如下: (1)保密性好,编程量大,随机开锁的成功率几乎为零。

(2)密码可变,用户可以随时改变密码,防止密码被盗,同时也可以避免人员的更替而使锁的密级下降。 (3)误码输入保护,输入密码多次错误是,系统进行自锁。 (4)无活动零件,不会磨损,寿命长。 (5)使用灵活性好,无需佩戴钥匙,操作简单。 2、功能描述 基本功能: (1)从键盘输入任意6位数字作为密码,将这六位数字经过USI总线存储到Flash芯片中,设置密码完成。 (2)从键盘输入密码,比较键盘输入的密码与Flash中存储的密码是否相同。 (3)如果密码正确,则LED灯点亮;如果密码不正确,则LED灯闪烁,而且如果连续三次输入密码错误则系统锁定,不允许再次输入密码。 扩展功能: (1)首先显示“请输入密码:”,显示密码锁背景图片1。 (2)如果密码正确则显示“密码正确”,显示成功进入系统的背景图片2。 (3)如果密码不正确则显示“密码不正确,请重新输入:” (4)如果连续三次输入密码错误则显示“对不起,您已经连续三次输入密码错误,系统锁定”,显示图片1。

STM32 实验2报告

实验2 MINI STM32按键控制LED灯实验 一、实验目的 1、掌握嵌入式程序设计流程。 2、熟悉STM32固件库的基本使用。 二、实验内容 1、编程使用I/O口作为输入,控制板载的两个LED 灯。 2、使用固件库编程。 三、实验设备 硬件:PC机一台 MINI STM32开发板一套 软件:RVMDK V3.8 一套 Windows XP 一套 四、实验步骤 1、设计工程,使用固件库来编程设置。 1.1、在这里我们建立一个文件夹为: STM32-Projects. 点击Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹STM32-Projecst 之下,在这个目录下面建立子文件夹shiyan1, 然后定位到shiyan1目录下面,我们的工程文件就都保存到shiyan1 文件夹下面。工程命名为shiyan1, 点击保存. 1.2、这里我们定位到STMicroelectronics 下面的STM32F103RB( 针对我们的mini 板子是这个型号。

1.3、弹出对话框“Copy STM32 Startup Code to project ….”,询问是否添加启动代码到我们的工程中,这里我们选择“否”,因为我们使用的ST固件库文件已经包含了启动文件。 1.4、接下来,我们在Template 工程目录下面,新建3 个文件夹CORE, USER, STM32F10x_FWLib 。USER 用来放我们主函数文件main.c, 以及其他包括 system_stm32f10x.c 等等,CORE 用来存放启动文件等,STM32F10x_FWLib 文件夹顾名思义用来存放ST官方提供的库函数源码文件. 1.5、.打开官方固件库包,定位到我们之前准备好的固件库包的目录。 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 下面,将目录下面的src,inc 文件夹copy 到我们刚才建立的STM32F10x_FWLib 文件夹下面。 1.6、我们将文件加入我们的工程中去。右键点击Target1,选择Manage Components

ARM课程设计报告GPIO—流水灯

目录 一、设计目的 (3) 二、设计原理 1、GPIO—流水灯 (3) 2、SPI (7) 3、定时器 (10) 4、实时时钟 (12) 三、所用仪器 (18) 四、EasyARM2131开发套件功能介绍 (18) 五、设计内容:万年历-定时器-流水灯-SPI 1、功能描述 (21) 2、流程图 (22) 3、程序设计 (22) 六、心得体会 (28) 七、参考文献 (29)

一、设计目的 1、根据要求,复习巩固ARM的基础知识。 2、掌握ARM系统的设计方法,特别是熟悉模块化的设计思想。 3、熟练掌握ARM软件和2131开发板的使用。 4、提高综合运用所学的理论知识独立分析和解决问题的能力; 二、设计原理 1、GPIO—流水灯 (1)LPC2131具有多达47个通用I/O 口(GPIO,General Purpose I/O ports),分别为P0[31:0]、 P1[31:16],其中,P0.24未用,P0.31仅为输出口。由于口线与其它功能复用,因而需要进行相关的管脚连接模块(PINSEL0、PINSEL1、PINSEL2)选择连接GPIO,然后通过IODIR进行输入/输出属性设置后才能操作。 当管脚选择GPIO 功能时,有IOSET、IOCLR和IOPIN 3 个寄存器用于控制GPIO 的使用。IOSET 用于口线置位,而IOCLR 则用于口线清零,IOPIN 则反映当前IO口的状态,读回IOSET 则反映当前IO口设定状态。 (2)GPIO的特性和应用 特性: 单个位的方向控制; 单独控制输出的置位和清零; 所有I/O口在复位后默认为输入。 应用: 通用I/O口 驱动LED或其它指示器 控制片外器件 检测数字输入 (3)GPIO引脚描述 GPIO管脚描述见表4.1。 表4.1 GPIO 管脚描述

嵌入式程序设计课程设计

课程设计 课程名嵌入式软件开发技术 题目基于嵌入式Linux的温度监测系统的 设计与实现 专业计算机科学与技术(嵌入式系统方向)班级 13计算机嵌入式系统班 学号 学生姓名 2016年6月

摘要 温度是个很普遍而又非常重要的参数,在日常生活、工农业生产以及科研领域都有着广泛的应用。因此,研制能够准确地测量和记录这个参数值的系统具有十分重要的意义。 基于ARM的嵌入式温度监测系统是采用嵌入式Linux作为操作系统,针对以S5PV210为处理器的开发板设计的一个嵌入式温度监测系统。论文在分析了Linux设备驱动程序的基本工作原理基础上,讨论了开发中经常会碰到的中断处理、拥塞处理、I/O端口,并在此基础上实现了基于S5PV210嵌入式处理器的开、读、写、关外部RAM的字符设备驱动和网络驱动。结合高精度温度传感器DS18B20,实现温度的正确采集,并通过以太网络将数据上传给上位机客户端。 论文首先介绍了通信网络中各种设备特性、总线结构及传输技术,然后根据单片机与PC机之间的串行通信原理,用ubantu完成温度监测系统的软件设计与实现,为用户提供一个友好的人机界面,对监测系统进行控制并显示采集后的数据。本系统还通过多线程实现了多个客户端与服务器的通信。 关键词:S5PV210;嵌入式Linux操作系统;DS18B20;网络编程

Abstract Temperature is a very common and very important parameter, in daily life, industrial and agricultural production and scientific research fields have a wide range of applications. Therefore, it is very important to develop a system that can accurately measure and record the value of this parameter. The temperature monitoring system of base on the ARM is use of embedded Linux as the operating system for the processor to S5PV210 development board designed for an embedded temperature monitoring system. Based on the analysis of the basic working principle based on the Linux device drivers discussed development often encounter interrupt handling, congestion handling, I / O ports, and on this basis to achieve the embedded processor based on open S5PV210 reading, writing, characters off the external RAM device driver and network drives. Combined with precision temperature sensor DS18B20, to achieve the correct temperature acquisition, and upload the data via Ethernet to a PC client. At first,the paper introduces the characteristics of various devices in a communication network, the bus structure and transmission technology, and according to the principle of serial communication between SCM and PC, with ubantu complete temperature monitoring system software design and implementation, to provide users with a friendly man-machine interface, the monitoring system to control and display the data after collection. The system also enables communication via a plurality of multi-threaded client and the server. Key words:S5PV210; embedded Linux operating system; DS18B20; Network programming

基于STM32和uC_OS-II的多任务设计-嵌入式系统课程设计报告

基于STM32和uC_OS-II的多任务设计-嵌入式系统课程设 计报告 NORTH CHINA UNIVERSITY OF SCIENCE AND TECHNOLOGY 嵌入式系统课程设计报告 学生姓名: 学号: 学院: 专业班级: 指导教师: 同组成员: 2016年 12 月 26 日 嵌入式系统课程设计报告 一、课程设计目的 本课程设计是在《嵌入式系统原理与应用》课程的基础上,通过软件编程及仿真调试的实践,进一步掌握嵌入式系统的原理和应用方法,是毕业设计前的一 次重要实践,为今后从事嵌入式系统相关工作岗位打下良好的基础。 二、设计题目及要求 2.1 设计题目: 基于STM32和uC/OS-II的多任务设计 2.2 功能实现:

使用uC/OS-II的任务管理函数和STM32库函数控制相应的寄存器,完成一个多任务设计。整个设计共有4个任务,驱动一个LED指示灯闪烁、由3个LED指示灯组成的流水灯、驱动蜂鸣器和利用swd方式进行printf输出。 2.3 设计要求: 理解和熟练使用KEIL软件、STM32寄存器、STM32库函数和uC/OS-II任务管理函数,用KEIL软件完成编程和调试,下载到开发板中实现4个设定的任务,并完成课程设计报告。 四个任务分别为: (1)驱动1个LED指示灯闪烁、 (2)由3个LED指示灯组成流水灯 (3)驱动蜂鸣器发出响声。 (4)利用swd方式进行printf输出。 三、设计原理说明 3.1 硬件说明 本次课程设计主要使用的是STM32 神舟 IV 号开发板为基础进行课程设计的,本节将详细介绍神舟IV号开发板的各部分硬件原理与实现。 (1)开发板资源图 - 1 - 嵌入式系统课程设计报告

嵌入式系统原理及应用课程设计

. 嵌入式系统原理及应用课程设计报告 题目:电子时钟的设计与实现 班级:文专电0931 姓名:杨阳 学号:200990607145 试验台号:10 指导老师:邱秀芹 程序成绩: 报告成绩: 总成绩:优良中及格不及格 2012年2月25日

一.课程设计目的 通过该课程设计将嵌入式系统原理及应用课程中所学的处理器和接口等技术应用于实际设计中。通过中断、PWM定时器、串口、SIO、GPIO等技术在实验平台上进行综合设计,在理论和实验的基础上进一步提高综合设计能力。 二. 课程设计内容及功能要求 1. 通过一个PWM定时计数器,采用定时中断的功能,设计能够在LED上进行时分秒显示的时钟; 2. 通过键盘实现对钟的功能; 3. 实现闹钟的功能,闹钟的时间由键盘输入进行设定; 4. 将时钟在超级终端上显示;时间的设定可以通过超级终端实现; 三.功能实现 1.总体功能框图

2.详细设计:(将所设计的各部分的功能程序框图及相关程序代码进行详细的描述) ①. #include"uhal.h" #include"myuart.h" #include"KeyBoard.h" #include"Timer.h" #include"Isr.h" #include"44b.h" #include "Zlg7289.h" #include "def.h" #include "lcd320.h" int Timer3INTCount=0; int hour = 0 ; int minute = 0 ; #pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting int main(void) { int clock_h = 23 ; int clock_m = 59 ; int clock_s = 0 ; int key ; int val=0; ARMTargetInit(); //开发版初始化 Zlg7289_Reset(); Init_Timer3(100,16,40000,20000); INTS_OFF();//Disable interrupt in PSR SetISR_Interrupt(INT_TIMER3_OFFSET, Timer3_ISR,0); Open_INT_GLOBAL(); Open_INT(BIT_TIMER3); INTS_ON();//Enable interrupt in PSR Start_Timer3();

嵌入式系统课程设计报告

湖北民族学院 信息工程学院 课程设计报告书 题目 :基于A RM的数字式万年历 课程:嵌入式系统课程设计 专业:电子信息科学与技术 班级: 03114411 学号: 031441119 学生姓名:田紫龙 指导教师:易金桥 2017年6 月20 日

信息工程学院课程设计任务书 学号031441119学生姓名田紫龙专业(班级)0314411 设计题目基于 ARM 的数字式万年历 1.能测量温度并且实时显示; 2.具有时间显示功能,能够显示年月日,时分秒,并且可以手动调节时间。 设 3. 具有 12 小时制和 24 小时制切换功能。 计 技 术 参 数 对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。温度采集 选用 DS18B20芯片,万年历采用直观的数字显示,数据显示采用1602 液晶显 示模块,可以在LCD1602 上同时显示年、月、日、周日、时、分、秒,还具有 设 时间校准整点灯光提醒等功能。制作仿真和实物。 计 要 求 [1]苏平 . 单片机的原理与接口技术 [M]. 北京 : 电子工业出版社, 2006,1-113. [2]王忠民 . 微型计算机原理 [M]. 西安 : 西安科技大学出版社, 2003,15-55. [3]左金生 . 电子与模拟电子技术 [M]. 北京 : 电子工业出版社, 2004,105-131. [4]新编单片机原理与应用(第二版). 西安电子科技大学出版社, 2007.2 [5]张萌 . 单片机应用系统开发综合实例 [M]. 北京:清华大学出版社, 2007.7 [6] 朱思荣. 51 单片机实现公历与农历、星期的转换[Z].当当电子网 [7]李广弟 . 单片机原理及应用 [M] 北京航空航天大学出版社 ,2004 年 参[8] 王越明 . 电子万年历的设计 [J]. 黑龙江科技信息, 2004 年 考 资 料 2017年 6 月 20 日

stm32课程设计报告

利用TIM定时器的中断和定时功能实现跑马灯 一、原理及目的 1、学习stm32库开发 2、理解和熟悉I/O的使用; 3、进一步掌握定时器、中断处理程序的编程方法 4、利用库函数开发实现跑马灯 二、电路原理图 三、流程图 四、软件算法(代码) 1、Main.c #include "stm32f10x.h" #include "bsp_led.h" #include "bsp_TiMbase.h" volatile u32 time = 0; int i=0;

int main(void) { LED_GPIO_Config(); TIM2_Configuration(); TIM2_NVIC_Configuration(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); while(1) { if ( time == 1000 ) { time = 0; i++; if(i>=3) i=0; switch(i) { case 0: LED1(OFF);LED2(OFF);LED3(ON);break; case 1: LED1(ON);LED2(OFF);LED3(OFF);break; case 2: LED1(OFF);LED2(ON);LED3(OFF);break; } } }} 2、led.c #include "bsp_led.h" void LED_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GP IO_Pin = GPIO_Pin_4|GPIO_Pin_3; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_0); GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3); } 3、led.h #ifndef __LED_H #define __LED_H #include "stm32f10x.h" #define ON 0

arm课程设计报告

课程设计报告 (嵌入式接口技术) 学院:电气工程与自动化学院 题目:基于ARM的多路数据采集系统设计 专业班级:自动化113班 学号:35号 学生姓名:翁志荣 指导老师:温如春 2013 年12月19日

摘要 数据采集系统用于将模拟信号转换为计算机可以识别的数字信号.该系统目的是便于对某些物理量进行监视.数据采集系统的好坏取决于他的精度和速度.设计时,应在保证精度的情况下尽可能的提高速度以满足实时采样、实时处理、实时控制的要求.在科学研究中应用该系统可以获得大量动态;是研究瞬间物理过程的重要手段;亦是获取科学奥秘的重要手段之一. 本次设计是基于ARM的多路数据采集系统,主控器能够对模拟信号产生的各路数据,通过数据采集系统进行采集并在主控器的程控下显示。 关键字:数据采集;模数转换;ARM;实时采样。 Abstract Data acquisition system for digital signal to analog signal conversion can be identified by computer. The system is aimed at facilitating monitoring of some physical quantity. Data acquisition system is good or bad depends on the precision and speed. When the design, should be in the case of ensuring accuracy as much as possible to meet the high speed real-time sampling, real-time processing, the requirement of real time control. The application of this system in scientific research can obtain a large number of dynamic; is an important means to study the instantaneous physical process; and it is also one of the important means of access to the mysteries of Science. Keyword s: data acquisition; ARM; real-time sampling analog-to-digital conversion.

嵌入式课程设计

嵌入式课程设计报告 学院信息电子技术 专业电子信息工程 班级13级 学籍号 姓名 指导教师 2016年0月00日

基于ARM9的无线智能家居控制系统 1.引言 当网络席卷整个社会,带来经济飞速发展的同时,也给人们的生活带来无限的惊奇。不断更新的生活方式,使得越来越多的人追求对生活的舒适度和享受度。智能家居作为新生力量呼之欲出,自然地走进了我们的生活,随之,引领新一代的数字家庭生活。 所谓“智能家居”(Smart Home),又称智能住宅。它利用先进的计算机嵌入式系统、通信技术、现代传感技术和网络技术,将家庭中的各种设备(如照明系统、安防系统、信息家电)通过家庭内部无线网络连接到一起。一方面,智能家居将使得使用它的用户能够更加方便、快捷和轻松的管理自己的家电设备,例如,用户可以通过平板电脑、智能手机和其他控制终端设备对家用设备进行远程操控和状态的实时监控,进行室内场景配置以及形成多个家电设备的联动功能等等;另一方面,智能家居内的各种设备不需要通过用户的操控就可以实现相互间的通讯,从而根据相关家电设备的不同的状态互动运行,为用户提供高效、便利、舒适与安全的智能家居生活。 2.系统设计 (1)硬件电路设计 文中提出的基于ARM9的无线智能家居控制系统主要包括ARM9核心控制模块,无线通信模块、LCD触摸屏模块和家居电器,另外还有传感检测,语音报警和电源等模块。系统总体结构模型图如图1所示。 图1系统总体结构模型图 其中ARM是整个系统的控制核心,通过GPRS和ZigBee无线通信网络收

发控制指令实现对家居电器进行综合监控,同时提供防火墙的功能,阻止外界对家庭内部设备的非法访问和攻击。 无线通信模块分为本地和远程两部分,本地通信主要通过新型的ZigBee无线通信技术实现系统与家居电器的通信,达到对其控制;远程通信是利用手机通过GPRS通信网络或利用计算机通过互联网实现人与控制系统的通信,进而达到对家居电器的远程监控。采用无线通信技术省去了布线使家居布局更加灵活,远程控制使家居电器工作更加贴近人们的工作和生活要求。 智能家居控制系统的具体功能包括:家居电器的综合监控、室内环境信息采集、自动报警、本地控制、远程控制、安全防盗等。 基本电路组成 1)主控芯片S3C2440A 本系统采用的是Samsung公司推出的16/32位RISC微处理器S3C2440A,它具有0.13μm的CMOS标准宏单元和存储器单元,它的杰出的之处是其处理器核心,该核心是由Advanced RISC Machines有限公司设计的ARM920T内核,ARM920T内核实现了MMU,AMBA BUS和Harvard高速缓冲体系结构,这一体系结构具有独立的16KB指令Cache和16KB数据Cache。 2)电源电路 电源是整个智能家居控制系统的能量之源,电源的稳定供电为系统得以安全、正确的运行提供了保障,本系统共需要两种电压5V和3.3V。为了提高终端设备内部的安全性并进一步减低系统的设计成本,本系统选用的市面上的12V、2A的开关稳压电源作为系统的基本供电输入,首先经过LM2576转换成5V,并经过滤波和稳压电路输出稳定的5V电压,为系统上需要5V电源的电路供电。其次,5V输出再经过LM1117D转换成3.3V,经过一定的滤波处理后为系统需要3.3V供电的电路供电,如图2所示。 图2 3.3V电压转换输出电路 3)复位电路的设计

广东海洋大学嵌入式系统课程设计

《嵌入式系统》设计报告学生姓名 Adao (学号) 所在学院数学与计算机学院 所在班级计科1141 指导教师 成绩

目录 1.课程设计目的 (2) 2.系统分析与设计 (2) 3.系统结构图 (2) 4.实现过程 (3) 5.实验效果 (5) 6.代码分析 (6) 7.系统测试出现的问题和解决的方案 (7) 8.系统优缺点 (7) 9.心得体会 (8) 参考文献 (8)

双按键控制流水灯系统开发 1.课程设计目的: 本次课程设计目的主要是对之前所学习的STM32的某个实验进行更深入的学习与了解,弄懂引脚,端口等相关的配置,对实验原理和具体实现有一定的理解,能做到自己通过原理图和使用库函数等把功能实现出来。我选择的是EXTI-外部中断实验并加以整合,具有一定实用功能的系统,可以对外提供服务。 2.系统分析与设计: 本课程设计所定义的系统主要功能为,通过两个按键KEY1(PA0)、KEY2(PC13)可以实现对流水灯进行同步控制,即一个开关控制产生的灯的状态可以被另一个开关去改变,按键控制需要对两个按键的端口,引脚等进行相关配置,并在两个引脚的中断服务程序中完成对流水灯状态同步控制的操作。本还想通过使用SysTick(系统滴答定时器)功能对流水灯进行精确定时,但由于时间比较匆促,最终没有实现。 3.系统结构图: 图3-1

4.实现过程: 1、GPIO的输入模式有上拉输入模式、下拉输入模式、浮空输入模式和模拟输入模式。GPIO 中的每个引脚可以通过配置端口配置寄存器来配置它的模式。每个引脚的模式由寄存器的4个位控制。 上拉/下拉输入模式:1000 浮空输入模式:0100 模拟输入模式:0000 2、STM32的所有GPIO都可以用作外部中断源的输入端。STM32的中断由中断控制器NVIC 处理。STM32的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表面它的优先级别越高。抢占属性会出现嵌套中断。 3、编写NVIC_Configuration()函数配置NVIC控制器的函数。 static void NVIC_Configuration(uint8_t IRQ) { NVIC_InitTypeDef NVIC_InitStructure; //将NVIC中断优先级分组设置为第1组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 配置中断源 */ NVIC_InitStructure.NVIC_IRQChannel = IRQ;//设置中断线 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//设置响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //对NVIC中断控制器进行初始化 } 4、调用GPIO_EXTILineConfig()函数把GPIOA、Pin0和GDIOC、PIN13设置为EXTI输入线。 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); 5、填写EXTI的初始化结构体,然后调用EXTI_Init()把EXTI初始化结构体的参数写入寄存器。编写EXTI_PA0_Config()函数完成各种需要的初始化。 void EXTI_Pxy_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* config the extiline clock and AFIO clock */

基于STM32的嵌入式系统应用设计》课程实验报告

《基于STM32的嵌入式系统应用设计》课程实验报告 班级:电信工程15-01班 学号:5415230301 姓名: 指导老师: 成绩

实验一流水灯和按键实验 一、目的与任务 目的:掌握STM32开发环境,掌握从无到有的构建工程,学会GPIO基本操作。 任务:编写代码下载到目标板,观察效果。如未达到理想效果,检查和修改代码,再次编译下载直到成功。记录实验过程,完成实验报告。 二、内容、要求与安排方式 1、实验内容与要求: 1)熟悉MDK KEIL开发环境,构建基于HAL库的工程。 2)编写代码实现流水灯工程,按键后能改变流水灯速度。 3)通过ISP下载代码到实验板,查看运行结果。 4)使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。 2、实验安排方式:采用1人1组,上机编程在STM32实验板上实验。 三、实验设备 1、所用设备:PC计算机(宿主机)、STM32实验板、JLINK。 2.消耗性器材:无。 四、实验过程 五、程序清单 #include "system.h" #include "SysTick.h" #include "led.h" #include "key.h" int main()

{ u8 key; SysTick_Init(72); LED_Init(); KEY_Init(); while(1) { static u8 j=1000; key=KEY_Scan(0); //é¨?è°′?ü switch(key) { case KEY_UP: j=j-100;break; //°′??K_UP°′?ü μ?ááD2??ê?μ? case KEY_DOWN: j=j+100;break; //°′??K_DOWN°′?ü?¨?eD2??ê?μ? } switch(j) { case(0):j=2000;break; case(2000):j=100;break; } led1=0; led2=1;led3=1; led4=1; led5=1; led6=1;led7=1;led8=1; //1áá delay_ms(j); led1=1; led2=0;led3=1; led4=1; led5=1; led6=1;led7=1;led8=1; //2áá delay_ms(j); led1=1; led2=1;led3=0; led4=1; led5=1; led6=1;led7=1;led8=1; //3áá delay_ms(j);

相关文档
相关文档 最新文档