嵌入式系统实验步骤与总结_第1页
嵌入式系统实验步骤与总结_第2页
嵌入式系统实验步骤与总结_第3页
嵌入式系统实验步骤与总结_第4页
嵌入式系统实验步骤与总结_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式系统实验步骤与总结实验一:嵌入式系统开发环境搭建实验步骤1.硬件准备首先,选择合适的嵌入式开发板,本次实验选用STM32F4Discovery开发板,该开发板基于ARMCortex-M4内核,具有丰富的外设资源,适合进行各种嵌入式实验。准备好开发板后,使用USB线将开发板与计算机连接,确保开发板的电源开关处于关闭状态,避免在连接过程中出现短路等问题。2.软件安装-安装开发工具链:下载并安装ARMGCC工具链,这是用于编译和链接ARM架构代码的关键工具。在安装过程中,按照安装向导的提示完成操作,注意选择合适的安装路径,避免安装在系统盘空间不足的位置。安装完成后,将工具链的路径添加到系统环境变量中,以便在命令行中可以直接调用。-安装集成开发环境(IDE):选择KeilMDK-ARM作为本次实验的IDE。KeilMDK-ARM提供了直观的图形化界面,方便进行代码编辑、编译、调试等操作。下载并运行安装程序,在安装过程中选择合适的组件进行安装,安装完成后需要进行注册激活。3.创建工程打开KeilMDK-ARM,选择“Project”->“NewuVisionProject”,在弹出的对话框中选择保存工程的路径和名称。然后在“Device”选项卡中选择对应的开发板型号,如STM32F407VG,点击“OK”完成工程创建。4.配置工程在工程创建完成后,需要对工程进行配置。选择“OptionsforTarget”,在弹出的对话框中进行如下配置:-Target选项卡:设置晶振频率为8MHz,这与开发板的实际晶振频率一致,确保系统时钟的准确性。-Output选项卡:勾选“CreateHexFile”,以便生成可烧录的HEX文件。-Debug选项卡:选择调试器类型,如ST-LinkDebugger,确保可以通过ST-Link对开发板进行调试。5.编写代码在KeilMDK-ARM的代码编辑器中编写一个简单的LED闪烁程序。代码如下:```cinclude"stm32f4xx.h"voidDelay(__IOuint32_tnCount){for(;nCount!=0;nCount--);}intmain(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;GPIO_Init(GPIOD,&GPIO_InitStructure);while(1){GPIO_SetBits(GPIOD,GPIO_Pin_12);Delay(0x7FFFFF);GPIO_ResetBits(GPIOD,GPIO_Pin_12);Delay(0x7FFFFF);}}```这段代码的功能是初始化GPIOD的第12引脚为输出模式,然后在主循环中不断地将该引脚置高和置低,实现LED的闪烁。6.编译代码点击KeilMDK-ARM中的“Build”按钮,对代码进行编译。如果代码中存在语法错误,编译器会在输出窗口中显示错误信息,需要根据错误信息对代码进行修改,直到编译成功。7.烧录程序将开发板的电源开关打开,使用ST-Link将生成的HEX文件烧录到开发板中。在KeilMDK-ARM中选择“Flash”->“Download”,等待烧录完成。8.观察实验现象烧录完成后,开发板上的LED开始闪烁,说明实验成功。实验总结通过本次实验,成功搭建了嵌入式系统的开发环境,包括硬件的连接和软件的安装配置。在搭建过程中,遇到了一些问题,如工具链路径添加错误导致编译时找不到编译器,通过仔细检查环境变量的设置并重新添加路径解决了该问题。同时,对嵌入式系统的开发流程有了更清晰的认识,从工程创建、代码编写、编译到烧录,每个环节都需要认真对待,任何一个环节出现问题都可能导致实验失败。编写LED闪烁程序的过程中,对GPIO的初始化和操作有了更深入的理解,为后续更复杂的实验打下了基础。实验二:串口通信实验实验步骤1.硬件连接在STM32F4Discovery开发板上,将串口通信所使用的引脚与USB转串口模块进行连接。通常,将开发板的TX(发送)引脚连接到USB转串口模块的RX(接收)引脚,将开发板的RX(接收)引脚连接到USB转串口模块的TX(发送)引脚,同时将两者的GND(地)引脚连接在一起。连接完成后,将USB转串口模块通过USB线连接到计算机。2.软件配置-在KeilMDK-ARM中配置串口:在工程中添加串口相关的头文件和初始化代码。首先,使能串口对应的时钟,然后对串口的波特率、数据位、停止位等参数进行配置。代码如下:```cinclude"stm32f4xx.h"voidUSART1_Init(void){GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_Init(GPIOA,&GPIO_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_Cmd(USART1,ENABLE);NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}```-配置串口调试助手:在计算机上打开串口调试助手,选择与USB转串口模块对应的串口号,设置波特率为115200,数据位为8位,停止位为1位,无校验位,然后点击“打开串口”。3.编写串口通信代码在主函数中编写发送和接收数据的代码。以下是一个简单的示例,在主循环中不断发送“Hello,World!”字符串,并在接收到数据时将其回显:```cintmain(void){USART1_Init();while(1){charstr="Hello,World!\r\n";while(str){while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,str++);}if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET){charch=USART_ReceiveData(USART1);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,ch);}}}```4.编译、烧录和测试按照实验一的方法对代码进行编译和烧录。烧录完成后,在串口调试助手中可以看到不断接收到“Hello,World!”字符串。在串口调试助手中输入一些字符,开发板会将这些字符回显到串口调试助手中。实验总结本次串口通信实验让我对嵌入式系统的串口通信原理和实现方法有了深入的了解。在硬件连接方面,要特别注意引脚的对应关系,一旦连接错误,将无法实现正常的通信。在软件配置上,串口的初始化参数设置非常关键,波特率、数据位、停止位等参数必须与串口调试助手的设置一致,否则会出现数据传输错误。编写串口通信代码时,需要注意发送和接收数据的时机,要等待发送缓冲区为空才能发送数据,等待接收缓冲区有数据才能接收数据。在实验过程中,遇到了数据乱码的问题,经过检查发现是波特率设置不一致导致的,修改波特率后问题得到解决。通过本次实验,掌握了串口通信的基本流程,为后续进行更复杂的数据传输和通信应用奠定了基础。实验三:定时器实验实验步骤1.定时器功能分析在STM32F4系列微控制器中,有多个定时器可供使用,本次实验选择定时器TIM2。定时器可以用于产生定时中断、PWM输出等多种功能,在本实验中,我们将使用定时器产生定时中断,实现LED的定时闪烁。2.定时器初始化在KeilMDK-ARM中编写定时器初始化代码。首先,使能定时器对应的时钟,然后对定时器的预分频器、自动重装载值等参数进行配置。代码如下:```cinclude"stm32f4xx.h"voidTIM2_Init(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_TimeBaseStructure.TIM_Period=999;TIM_TimeBaseStructure.TIM_Prescaler=8399;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM2,ENABLE);}```在上述代码中,预分频器设置为8399,自动重装载值设置为999,根据定时器的时钟频率,可以计算出定时器的溢出时间,从而实现定时功能。3.编写中断服务函数编写定时器的中断服务函数,在中断服务函数中实现LED状态的翻转。代码如下:```cvoidTIM2_IRQHandler(void){if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET){GPIO_ToggleBits(GPIOD,GPIO_Pin_12);TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}}```4.主函数编写在主函数中调用定时器初始化函数和LED初始化函数,然后进入主循环等待中断。代码如下:```cintmain(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;GPIO_Init(GPIOD,&GPIO_InitStructure);TIM2_Init();while(1){//主循环可以处理其他任务}}```5.编译、烧录和观察现象按照前面实验的方法对代码进行编译和烧录。烧录完成后,开发板上的LED会按照定时器设定的时间间隔进行闪烁。实验总结通过本次定时器实验,深入理解了STM32F4微控制器定时器的工作原理和使用方法。在定时器初始化过程中,预分频器和自动重装载值的设置是关键,需要根据实际的定时需求进行合理的计算和配置。编写中断服务函数时,要注意及时清除中断标志位,否则会导致中断一直触发。在实验过程中,遇到了LED闪烁频率不符合预期的问题,经过检查发现是定时器参数计算错误,重新计算并修改参数后,问题得到解决。本次实验让我掌握了定时器在嵌入式系统中的应用,为后续实现更复杂的定时控制和任务调度提供了基础。实验四:外部中断实验实验步骤1.外部中断功能分析外部中断可以使微控制器在检测到外部引脚电平变化时立即响应,执行相应的中断服务函数。在STM32F4开发板上,我们可以利用按键作为外部中断源,当按键按下时触发外部中断。2.硬件连接将开发板上的一个按键引脚连接到微控制器的一个GPIO引脚,同时将该引脚配置为外部中断输入引脚。在STM32F4Discovery开发板上,通常可以选择PC13引脚连接按键。3.外部中断初始化在KeilMDK-ARM中编写外部中断初始化代码。首先,使能GPIO和SYSCFG的时钟,然后对GPIO引脚进行配置,将其设置为输入模式,并使能外部中断线。代码如下:```cinclude"stm32f4xx.h"voidEXTI_Init(void){GPIO_InitTypeDefGPIO_InitStructure;EXTI_InitTypeDefEXTI_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_Init(GPIOC,&GPIO_InitStructure);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource13);EXTI_InitStructure.EXTI_Line=EXTI_Line13;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}```在上述代码中,将外部中断触发方式设置为下降沿触发,即当按键按下时,引脚电平从高电平变为低电平,触发外部中断。4.编写中断服务函数编写外部中断服务函数,在中断服务函数中实现LED状态的翻转。代码如下:```cvoidEXTI15_10_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line13)!=RESET){GPIO_ToggleBits(GPIOD,GPIO_Pin_12);EXTI_ClearITPendingBit(EXTI_Line13);}}```5.主函数编写在主函数中调用外部中断初始化函数和LED初始化函数,然后进入主循环。代码如下:```cintmain(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;GPIO_Init(GPIOD,&GPIO_InitStructure);EXTI_Init();while(1){//主循环可以处理其他任务}}```6.编译、烧录和测试按照前面的方法对代码进行编译和烧录。烧录完成后,按下开发板上的按键,LED的状态会发生翻转。实验总结本次外部中断实验让我对嵌入式系统的外部中断机制有了清晰的认识。在外部中断初始化过程中,GPIO引脚的配置、外部中断线的选择和触发方式的设置都非常重要。在硬件连接时,要注意按键的连接方式和引脚的选择,确保按键按下时能够正确触发外部中断。编写中断服务函数时,要及时清除中断标志位,避免中断一直触发。在实验过程中,遇到了按键按下后LED不翻转的问题,经过检查发现是按键连接松动导致的,重新连接按键后问题得到解决。通过本次实验,掌握了外部中断的实现方法,为后续实现更复杂的事件响应和交互功能提供了支持。实验五:PWM输出实验实验步骤1.PWM功能概述PWM(脉冲宽度调制)是一种通过改变脉冲信号的占空比来控制输出信号平均功率的技术,在嵌入式系统中广泛应用于电机控制、LED亮度调节等领域。在STM32F4系列微控制器中,定时器可以用于产生PWM信号。2.PWM输出引脚选择和配置选择定时器TIM3的通道1作为PWM输出通道,对应的GPIO引脚为PA6。在KeilMDK-ARM中编写PWM初始化代码。首先,使能定时器和GPIO的时钟,然后对定时器的预分频器、自动重装载值等参数进行配置,同时对GPIO引脚进行复用功能配置。代码如下:```cinclude"stm32f4xx.h"voidTIM3_PWM_Init(void){GPIO_InitTypeDefGPIO_InitStructure;TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_OCInitTypeDefTIM_OCInitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;GPIO_Init(GPIOA,&GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period=999;TIM_TimeBaseStructure.TIM_Prescaler=83;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse=500;TIM_OCIn

温馨提示

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

评论

0/150

提交评论