嵌入式系统实验报告

更新时间:2024-05-07 04:39:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

嵌入式系统实验报告

学 号:

姓 名:

班 级:13电子信息工程 指导老师:

苏州大学 电子信息学院

2016年12月

1

实验一:一个灯的闪烁

1、实验要求

实现PF6-10端口所连接的任意一个LED灯点亮

2、电路原理图

图1 LED灯硬件连接图

3、软件分析

RCC_Configuration(); /* 配置系统时钟 */ GPIO_Configuration(); /* 配置GPIO IO口初始化 */ for(;;) { GPIOF->ODR = 0xfcff; /* PF8=0 --> 点亮D3 */ Delay(1000000); GPIOF->ODR = 0xffff; /* PF8=1 --> 熄灭D3 */ Delay(1000000);

4、实验现象

通过对GPIOF8的操作,可以使LED3闪烁

5、实验总结

这是第一次使用STM32开发板,主要内容是对IO端口进行配置,点亮与IO端口相连接的LED灯,闪烁周期为2S。通过本实验对STM32开发板的硬件原理有了初步了解。

2

实验二:流水灯

1、实验要求

实现PF6-10端口所连接的5个LED灯顺次亮灭

2、电路原理图

图1 流水灯硬件连接图

3、软件分析

int main(void) {

RCC_Configuration();/* 配置系统时钟 */

GPIO_Configuration();/* 配置GPIO IO口初始化 */

for(;;) {

GPIOF->ODR = 0xffbf;

/* PF6=0 --> 点亮LED1 */ Delay(5000000);

GPIOF->ODR = 0xff7f;

}

/* PF7=0 --> 点亮LED2 */ Delay(5000000);

GPIOF->ODR = 0xfeff; /* PF8=0 --> 点亮LED3 */ Delay(5000000);

GPIOF->ODR = 0xfdff; /* PF9=0 --> 点亮LED4 */ Delay(5000000);

GPIOF->ODR = 0xfbff;

/* PF10=0 --> 点亮LED5 */ }

4、实验现象

LED1~LED5依次点亮,亮灭的时间间隔都为1S。

5、实验总结

本次实验对STM32开发板的GPIO端口进行进一步学习,通过程序可以实现流水灯的闪烁。

3

实验三:单级外部中断

1、实验要求

按下某个按键,触发中断,中断服务程序改变LED灯状态

2、电路原理图

图3 SW1硬件原理图

3、软件分析

int main() {

RCC_Configuration(); GPIO_Configuration(); GPIO_Write(GPIOF,0xffff); Delay(5000); while(1) { }

/* 配置系统时钟 */ /* IO口初始化 */ /* 全灭 */

if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==0) /* 如果SW1 PA8=0 */ { GPIO_SetBits(GPIOF, GPIO_Pin_6); /* LED1点亮 */ Delay(0x1FFFFF); GPIO_ResetBits(GPIOF, GPIO_Pin_6); /* LED1 熄灭 */ Delay(0x1FFFFF); } }

4、实验现象

原来5个LED灯都处于熄灭状态,按下SW1,触发中断程序,LED1点亮。

5、实验总结

通过本次实验,可以对某一状态通过外部中断,改变其当前状态。

4

实验四:多中断嵌套

1、实验要求

按下某个按键,触发中断,中断服务程序改变LED灯状态

2、电路原理图

图4 SW1,SW2,SW3硬件原理图

3、软件分析

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; //设定中断源为PA0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //中断占优先级为0 NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel; //设定中断源为PD3 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //中断占优先级为1 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //设定中断源为PA8 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //中断占优先级为2 void EXTI0_IRQHandler(void) {

int i=0;

if(EXTI_GetITStatus(EXTI_Line0) != RESET) {

for(i=0;i<10;i++) {

GPIO_Write(GPIOF,0xffff);

GPIO_SetBits(GPIOF, GPIO_Pin_6); /* LED1 点亮 */ Delay(0x5fFFFF);

GPIO_ResetBits(GPIOF, GPIO_Pin_6);/* LED1 熄灭 */ Delay(0x5fFFFF);

EXTI_ClearITPendingBit(EXTI_Line0); } } }

void EXTI3_IRQHandler(void) if(EXTI_GetITStatus(EXTI_Line3) != RESET) { { int i=0; for(i=0;i<10;i++)

5

{

GPIO_Write(GPIOF,0xffff);

GPIO_SetBits(GPIOF, GPIO_Pin_7); /* LED2 点亮 */

Delay(0x5fFFFF);

GPIO_ResetBits(GPIOF, GPIO_Pin_7);/* LED2 熄灭 */

Delay(0x5fFFFF);

EXTI_ClearITPendingBit(EXTI_Line3); } } }

void EXTI9_5_IRQHandler(void) {

int i=0;

if(EXTI_GetITStatus(EXTI_Line8) != RESET) {

for(i=0;i<10;i++) {

GPIO_Write(GPIOF,0xffff);

GPIO_SetBits(GPIOF, GPIO_Pin_8); /* LED3 点亮 */

Delay(0x5fFFFF);

GPIO_ResetBits(GPIOF, GPIO_Pin_8);/* LED3 熄灭 */ Delay(0x5fFFFF);

EXTI_ClearITPendingBit(EXTI_Line8); } } }

4、实验现象

中断优先级从高到低依次为:SW3,SW2,SW1

原来5个LED灯都处于熄灭状态,按下SW1,LED3应该闪烁10次,当其闪烁5次后按下SW2,LED2也应该闪烁10次,当其闪烁4次后按下SW3,LED1也应该闪烁10次,则当LED1闪烁完10次后,LED2继续闪烁6次,之后LED1继续闪烁5次。

5、实验总结

通过本次实验,可以对LED状态实行中断嵌套,由以上实验现象,得出以下结论:高中断优先级可以打断低优先级,中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,反之,低中断优先级不可以打断高优先级。

实验五:TIM2的基本应用

1、实验要求

TIM2定时器将LED灯定时点亮和熄灭一定的时间

2、电路原理图

6

3、软件分析

TIM_Cmd(TIM2, ENABLE); /* TIM2 enable counter */ TIM_TimeBaseStructure.TIM_Period = 1999;

TIM_TimeBaseStructure.TIM_Prescaler = 35999; //定时时间为1s void TIM2_IRQHandler(void) {

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

GPIO_WriteBit(GPIOF, GPIO_Pin_6,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6))); }

4、实验现象

LED1灯按照1S的定时时间不断闪烁

5、实验总结

通过本次实验,可以实现对LED灯进行定时控制其闪烁,而不需要延时函数控制了,定时时间较为精准。

7

实验六:TIM2,TIM3,TIM4多定时器的应用

1、实验要求

利用TIM2,TIM3,TIM4定时器使LED灯以不同的频率闪烁

2、电路原理图

3、软件分析

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 此处比上一个实验增加了2个定时器,同时又增加了一个优先级

4、实验现象

中断优先级从高到低依次为:TIM2,TIM3,TIM4

首先LED1以1S的定时时间闪烁5次,之后LED2以2S的定时时间闪烁5次, 最后LED3以3S的定时时间闪烁5次

5、实验总结

利用定时器可以同时使LED灯按照不同的频率闪烁,但是为了现象明显,可以加一个优

8

先级,分别观察现象。

实验七:串口USART1读取CPU的ID号

1、实验要求

通过USART1读取 CPU 的 96 bit ID

2、电路原理图

图 开发板USART原理图

3、软件分析

void Get_ChipID(void) /* 获取芯片ID */ {

ChipUniqueID[0] = *( u32 *)(0X1FFFF7F0); /* 高字节 */ ChipUniqueID[1] = *( u32 *)(0X1FFFF7EC);

ChipUniqueID[2] = *( u32 *)(0X1FFFF7E8); /* 低字节 */ }

void USART_Configuration(void) {

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure);

USART_ITConfig(USART1, USART_IT_TXE, ENABLE); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_ClearFlag(USART1, USART_FLAG_TC); USART_Cmd(USART1, ENABLE); /* Enable USART1 */ }

4、实验现象

PA9连接的是USART1 Tx,PA10连接的是USART1 Rx,再通过串口调试助手就可

9

以在电脑上面显示出CPU的ID以及flash容量大小。

5、实验总结

本次实验实现了串口和PC机的传输,可以通过USART1将CPU的ID在电脑上显示出来。

实验八:异步通信USART2的重映射

1、实验要求

实现异步通信USART2的重映射,将数据传送到PC机上

2、电路原理图

图 开发板USART原理图

3、软件分析

void GPIO_Configuration()

10

/* IO口初始化 */

{

GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /* USART2 Tx --> PD05 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* PD05 --> JP7 WR */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /* USART2 Rx --> PD06 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); }

该程序将USART2重映射到PD05,PD06引脚

4、实验现象

PD05连接的是USART2 Tx,PD06连接的是USART2 Rx,通过串口调试助手就可以在电脑上面显示Program Running!

5、实验总结

通过本次实验,可以实现对异步通信USART2的重映射,再通过串口调试助手在电脑上显示出来。

11

{

GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /* USART2 Tx --> PD05 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* PD05 --> JP7 WR */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /* USART2 Rx --> PD06 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); }

该程序将USART2重映射到PD05,PD06引脚

4、实验现象

PD05连接的是USART2 Tx,PD06连接的是USART2 Rx,通过串口调试助手就可以在电脑上面显示Program Running!

5、实验总结

通过本次实验,可以实现对异步通信USART2的重映射,再通过串口调试助手在电脑上显示出来。

11

本文来源:https://www.bwwdw.com/article/2v5g.html

Top