实验指导书1-5 - 图文(2)

2019-04-15 15:36

《嵌入式系统开发》0806504130 实验指导书

else if(KEY1==0)return KEY1_PRES; else if(WK_UP==1)return WKUP_PRES;

}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; return 0;// 无按键按下 }

Key.h代码如下: #ifndef __KEY_H #define __KEY_H #include \

#define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键0 #define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键1 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键2 #define KEY0_PRES 1 //KEY0 #define KEY1_PRES 2 //KEY1 #define WKUP_PRES 3 //WK_UP void KEY_Init(void);//IO初始化

u8 KEY_Scan(u8 mode); //按键扫描函数 #endif

3.4.3主程序的编写:

#include \#include \#include \#include \

//跑马灯实验 int main(void) {

…… }

四、实验结果与分析

给出程序编译过程中曾经出现的错误,及相应解决方法; 给出实物运行照片。

5

《嵌入式系统开发》0806504130 实验指导书

实验二 STM32串口实验

实验时间:2016-04-05(周二3,4节),实验学时:2,实验地点:C105

一、实验目的与要求:

(1)熟悉MDK的编程环境;

(2)掌握基于固件库MDK5工程模板的方法;

(2)掌握STM32串口的原理,理解其作为软件开发的重要调试手段;

二、实验器材:

计算机,STM32F103RCT6实验平台。

三、实验过程

3.1实验内容:实现利用串口1,每隔0.5s发送

13自动化 学号:123456678 姓名: XXX

到电脑上,同时STM32接收从电脑串口调试软件发过来的数据,把发送过来的数据直接送回给电脑串口调试软件。并闪烁LED0,提示系统正在运行。 3.2实验过程:

1、对于复用功能的IO,我们首先要使能GPIO时钟,然后使能串口时钟; 2、把GPIO模式设置为复用功能对应的模式;

3、串口参数的初始化设置,包括波特率,停止位等等参数; 4、开启串口中断,初始化NVIC设置中断优先级别; 5、使能串口;

6、编写中断服务函数。 3.3本实验用到的硬件资源有: 本实验需要用到的硬件资源有: 1) 指示灯DS0

2) 串口1 图2.1 硬件连接图示意图

本实验用到的串口1与USB串口并没有在PCB上连接在一起,需要通过跳线帽来连接一下。这里我们把P4的RXD和TXD用跳线帽与PA9和PA10连接起来。如图2.1所示。

连接上这里之后,我们在硬件上就设置完成了,可以开始软件设计了。 3.4本实验涉及的库函数:

下面简单介绍这几个与串口基本配置直接相关的几个固件库函数。这些函数和定义主要分布在stm32f10x_usart.h和stm32f10x_usart.c文件中。

1.串口时钟使能。串口是挂载在APB2下面的外设,所以使能函数为: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);

2.串口复位。当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。复位的是在函数USART_DeInit()中完成:

void USART_DeInit(USART_TypeDef* USARTx);//串口复位 比如我们要复位串口1,方法为:

USART_DeInit(USART1); //复位串口1

3.串口参数初始化。串口初始化是通过USART_Init()函数实现的,

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 这个函数的的第一个入口参数是指定初始化的串口标号,这里选择USART1。

第二个入口参数是一个USART_InitTypeDef类型的结构体指针,这个结构体指针的成员变量用来设置串口的一些参数。一般的实现格式为:

USART_InitStructure.USART_BaudRate = bound; //波特率;

6

《嵌入式系统开发》0806504130 实验指导书

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

4.数据发送与接收。STM32的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内。

STM32库函数操作USART_DR寄存器发送数据的函数是:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 通过该函数向串口寄存器USART_DR写入一个数据。

STM32库函数操作USART_DR寄存器读取串口接收到的数据的函数是: uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

5.串口状态。串口的状态可以通过状态寄存器USART_SR读取。

6.串口使能。串口使能是通过函数USART_Cmd()来实现的,这个很容易理解,使用方

法是: USART_Cmd(USART1, ENABLE); //使能串口

7.开启串口响应中断。有些时候当我们还需要开启串口中断,那么我们还需要使能串口中断,使能串口中断的函数是:

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)

这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是:

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断 我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是: USART_ITConfig(USART1,USART_IT_TC,ENABLE);

8.获取相应中断状态。当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是: ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)

比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是:

USART_GetITStatus(USART1, USART_IT_TC) 返回值是SET,说明是串口发送完成中断发生。 9.软件设计(学生完成)

请自行编写软件。void uart_init(u32 bound)函数main函数。 四、实验结果与分析

1.给出程序编译过程中曾经出现的错误,及相应解决方法;

2. 打开XCOM V1.4,设置串口为开发板的USB转串口(CH340虚拟串口),调试结果截图到这里。

7

《嵌入式系统开发》0806504130 实验指导书

实验三 STM32外部中断实验

实验时间:2016-04-19(周二3,4节),实验学时:2,实验地点:C105

一、实验目的与要求:

(1)熟悉MDK的编程环境;

(2)掌握STM32外部中断配置的基本方法; (2)掌握使用IO口作为外部中断的一般步骤;

二、实验器材:

计算机,STM32F103RCT6实验平台。

三、实验过程

1.熟悉led和按键硬件电路; 2.建立工程模版;

3.根据实验内容编写主程序及应用程序 4.下载调试及仿真。 3.1实验内容:

STM32的每个IO都可以作为外部中断的中断输入口。通过MiniSTM32开发板上载有的3个按钮(KEY0/KEY1/WK_UP),来控制板上的2个LED,其中KEY0控制DS0,按一次亮,再按一次,就灭。KEY1控制DS1,效果同KEY0。WK_UP按键则同时控制DS0和DS1,按一次,他们的状态就翻转一次。

3.2本实验用到的硬件资源有: 1) 指示灯DS0、DS1

2) 3个按键:KEY0、KEY1和KEY_UP。 3.3、硬件设计

(1)输出引脚LED(DS0和DS1)。其电路在ALIENTEK MiniSTM32开发板上默认是已经连接好了的。DS0接PA8,DS1接PD2。所以在硬件上不需要动任何东西。其连接原理如图3.1所示。

图3.1 LED与STM32连接原理图

(2)输入引脚,在MiniSTM32开发板上的按键KEY0连接在PC5上、KEY1连接在PA15上、WK_UP连接在PA0上。如图3.2所示:

图3.2 按键与STM32连接原理图

8

《嵌入式系统开发》0806504130 实验指导书

3.4 STM32 外部中断原理 (0)简介

STM32的每个IO都可以作为外部中断的中断输入口,这点也是STM32的强大之处。STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103的19个外部中断为:

线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。

GPIO的管脚GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线15~0。这样每个中断线对应了最多7个IO口,以线0为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到1个IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO上。 (1)配置GPIO与中断线的映射关系

在库函数中,配置GPIO与中断线的映射关系的函数GPIO_EXTILineConfig()来实现的: void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 该函数将GPIO端口与中断线映射起来,使用范例是:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

将中断线2与GPIOE映射起来,那么很显然是GPIOE.2与EXTI2中断线连接了。设置好中断线映射之后,那么到底来自这个IO 口的中断是通过什么方式触发的呢?接下来我们就要设置该中断线上中断的初始化参数了。 (2)中断的初始化

中断线上中断的初始化是通过函数EXTI_Init()实现的。EXTI_Init()函数的定义是: void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); 使用方法如下:

EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line=EXTI_Line4;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

上面的例子第一个参数是中断线的标号,取值范围为EXTI_Line0~EXTI_Line15。第二个参数是中断模式,可选值为中断EXTI_Mode_Interrupt和事件EXTI_Mode_Event。第三个参数是触发方式,可以是下降沿触发EXTI_Trigger_Falling,上升沿触发EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿)触发 EXTI_Trigger_Rising_Falling。 (3)优先级设置

设置好中断线和GPIO映射关系,然后又设置好了中断的触发模式等初始化参数。既然是外部中断,涉及到中断我们当然还要设置NVIC中断优先级。示例:

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键外部中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

9


实验指导书1-5 - 图文(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:高速公路施工保畅专项方案 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: