物联物联网实习_第1页
物联物联网实习_第2页
物联物联网实习_第3页
物联物联网实习_第4页
物联物联网实习_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

学院 物联 学号:41624602 2018 7 18实验名称:I/O(流水灯)MDK5平台,掌握STM32能理解STM32I/O流水灯模块(8330Ω89P,万能板一块)9SWD(CH340)前提已经安装好MDK5,并成功返回 ,打开“2.流水灯”文件夹中的“USER”文件夹,粘贴返回“2.流水灯”文件夹,进入“USER初始化SysTick定时器,为系统分配时钟等初始化外设,将PA.0—PA.7引脚通过voidLED_Init(void的引脚设置为通用的I/O口,推挽输出。灯被点亮;当引脚输出高电平时,LED灯熄灭。在本实验中,使用库函数和寄存器两种方法来设置I/O口的高低电平①初始化LED,设置PA0-PA7void{, //使能端口A/*LEDI/O配置 =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2||GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;led_gpio.GPIO_Mode=GPIO_Mode_Out_PP; //通用推挽输出led_gpio.GPIO_Speed=GPIO_Speed_2MHz; //2MHzGPIO_Init(GPIOA,&led_gpio);/*配置完成后关闭所有LED*/}②设置LEDdefine/*控制LED1-LED4 PA0LED1#define#defineGPIOA->BSRR=GPIOA->BRR=//PA0输出高电平-LED1//PA0输出低电平LED1#defineGPIOA->ODR^=LED2#defineGPIOA->BSRR=LED2#defineGPIOA->BRR=LED2#defineGPIOA->ODR^=#define GPIOA->BSRR=#define GPIOA->BRR=#defineLED4_TOGGLE GPIOA->ODR^=GPIO_Pin_3#defineLED4_OFF GPIOA->BSRR=GPIO_Pin_3#define GPIOA->BRR=/*控制LED5-LED8#define , PA4输出高电平-LED5#define GPIO_ResetBits(GPIOAGPIO_Pin_4)//PA4LED5#defineLED6_OFF GPIO_SetBits(GPIOA,GPIO_Pin_5)#defineLED6_ON GPIO_ResetBits(GPIOA,GPIO_Pin_5)#defineLED7_OFF GPIO_SetBits(GPIOA,GPIO_Pin_6)#defineLED7_ON GPIO_ResetBits(GPIOA,GPIO_Pin_6)#defineLED8_OFF GPIO_SetBits(GPIOA,GPIO_Pin_7)#defineLED8_ON GPIO_ResetBits(GPIOA,GPIO_Pin_7)③在主函数中设置whilewhile{}}在此过需要实现基于STM32SysTick定时器的精确延时,分别实现(ms#includestatic fac_us0;//usstaticu16fac_ms0;//msvoid {SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择外部时钟HCLK/8 //为系统时钟的1/8fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数}voiddelay_us(u32nus)//nusus{u32SysTick->LOAD=nus*fac_us;//时间加载 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; {} SysTick->VAL=0X00; }为voiddelay_ms(u16nms)//SYSCLKHz,nms单位为ms,72M{u32SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)SysTick->VAL=0x00; SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; {} SysTick->VAL }程序成功运行后,8LED学院 物联 学号:41624602 2018 7 18实验名称:I/O(按键)学习GPIO掌握如何设定GPIOI/O掌握利用SysTick定时器实现精确延时STM32SSWD(或CH340前提已经安装好MDK5,并成功如流水灯实验,将led、bellkey对应的文件夹拷到“USER”文件夹中,并在工初始化SysTick定时器、LED,为系统分配时钟等将PB.8—PB.11引脚通过Scan_Key_Configuration()函数进行初始化,将上述的引脚设置为通用的I/O口,上拉输入。通过直接操作库函数方式或位带操作方式来PB.8—PB.11引脚状态来检测按键LED①初始化LED灯、按键和蜂鸣器,设置控制LEDPA0-PA7LED设置PB0控制蜂鸣器,PB8-PB11为按键的输。void{, //使能端口A/*LEDI/O配置 =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2||GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;led_gpio.GPIO_Mode=GPIO_Mode_Out_PP; //通用推挽输出led_gpio.GPIO_Speed=GPIO_Speed_2MHz; //2MHzGPIO_Init(GPIOA,&led_gpio);/*配置完成后关闭所有LED*/}void{GPIO_InitTypeDefbell_gpio;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/*蜂鸣器I/O配置*/ =GPIO_Pin_0; =GPIO_Mode_Out_PP; //通用推挽输出bell_gpio.GPIO_Speed=GPIO_Speed_2MHz; //2MHzGPIO_Init(GPIOB,&bell_gpio);/*配置完成后关闭蜂鸣器*/}void{GPIO_InitTypeDefkey_gpio;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/*按键I/O配置 GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;key_gpio.GPIO_Mode=GPIO_Mode_IPU; //上拉输入GPIO_Init(GPIOB,&key_gpio);}②在他们所对应的头文件key.hbell.hled.hdefine读按键使用GPIO_ReadInputDataBit库函数#defineKEY1_STA GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)//读按键Key1状态#defineKEY2_STA GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)//读按键Key2状态#defineKEY3_STA GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)//读按键Key3状态#define GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)//读按键Key4状还是使用GPIO_SetBits和GPIO_ResetBits1#defineBELL_ON GPIO_SetBits(GPIOB,GPIO_Pin_0) //蜂鸣器响#defineBELL_OFF GPIO_ResetBits(GPIOB,GPIO_Pin_0)//蜂鸣器停#defineBELL_TOGGLEGPIOB->ODR^=GPIO_Pin_0 //状态反转至于LED,可以参考流水灯实验,使用GPIO_SetBits和GPIO_ResetBits③下面开始进入主程序,要使用while循环检测按键是否有按下,然后执行相while{/*按键Key1和Key3if((KEY1_STAKEY_DN||(KEY3_STA { //延时消抖if(KEY1_STA //确认是否按键Key1{while(KEY1_STA //等待按键}elseif(KEY3_STA //确认是否按键Key3{while(KEY3_STA //等待按键}}/*按键Key2和Key4if((KEY2_STAKEY_DN||(KEY4_STA { //延时消抖if(KEY2_STA //确认是否按键Key2{while(KEY2_STA==KEY_DN);}elseif(KEY4_STA //确认是否按键Key4{while(KEY4_STA==KEY_DN);}}}voidDelay_ms(uint16_t{uint16_ti //循环计数变量for(i=0;i<u16_Time_ms;{for(j=0;j<8192;}}按下KEY2,LED2长亮,松开KEY2后LED2按下KEY3,led的状态;学院 物联 学号:41624602 2018 7 18实验名称:外部中断操作(按键)学会STM32的I/O理解I/O能够使用中断功能,点亮和熄灭LEDSTM32SWD前提已经安装好MDK5,并成功如流水灯实验,将exti、led、bell和key对应的文件夹拷到“USER”文件夹中,并在工添加C文件和h头文件的 件需要处理B,单片机就要暂停A去处理B,B结束后再回来继续处理A。初始化I/O开启I/O口复用时钟,设置I/O口与中断线的关系(NVIC编写中断服务函数,使中断通过LED灯来①首先初始化LED灯、按键和蜂鸣器的I/O口,这里直接在拷贝的c文件中就有,需要记得添加文件以及搜索路径。值得注意的是,因为cvoid{, //使能端口A =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2||GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;led_gpio.GPIO_Mode=GPIO_Mode_Out_PP; //通用推挽输出led_gpio.GPIO_Speed=GPIO_Speed_2MHz; //2MHzGPIO_Init(GPIOA,&led_gpio);}void{GPIO_InitTypeDefbell_gpio;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); =GPIO_Pin_0; =GPIO_Mode_Out_PP; //通用推挽输出bell_gpio.GPIO_Speed=GPIO_Speed_2MHz; //2MHzGPIO_Init(GPIOB,&bell_gpio);}void{GPIO_InitTypeDefkey_gpio;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); =GPIO_Pin_9|GPIO_Pin_10;= //上拉输入}几个引脚而不是连续接,是因为中断函数只有6个:中断线0-4每个中断线对应一个中断函数,中断线5-9共用中断函数EXTI9_5_IRQHandler,中断线10-15共用中断函数EXTI15_10_IRQHandlerPBPB8与PB9断函数,PB10与PB11共用一个中断函数。,③进入exti.c,设置中断。值得注意的是,在中断初始化函数中,需要初始化按键,在STM32PA1、PB1、PC1PA2、PB2、PC2也是共用一条的,为此,需要用库函数将中断线分别绑在PB的四个引脚上。接下来用结构体EXTI_InitStructure对其参数进行定义,以PB4EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;//下降沿触发EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_InitStructEXTI三个中断的初始化参数后,继续设置NVIC中断优先级,同样以PB4的中断NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;//使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;//抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能外部中断通道 //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存4void{ {} //清除EXTI0}⑤mainwhileKEY1LED1KEY2LED2KEY3LED3学院 物联 2018 7 18实验名称:串口输入与输出实验CH340串口通信,顾名思义就是将一整条的内容,切成一“串”来发送或接收。发送的思想,本实验要使用复用功能的IO,首先要使能GPIO时钟,然后使能复用功能时钟,同时要把GPIO模式设置为复用功能对应的模式。然后是串口参数的初始化设置,包括果开启了串口的中断当然要初始化NVIC设置中断优先级别最后编写中断服务函数GPIO端口模式设置。和RCC_APB2PeriphClockCmdRCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOAENABLE);//使能USART1,GPIOAUSART_DeInit(USART1);//复位串口在STM32中,PA9和PA10分别作为USART1的输出口TXD和输RXD,首先GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA9GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA10NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化VIC寄存器USART_InitStructure.USART_BaudRate=bound;//一般设置为9600;USART_InitStructure.USART_WordLengthUSART_WordLength_8b;//字长为8USART_InitStructure.USART_StopBits=USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity=USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;//无硬件数据流控USART_InitStructure.USART_ModeUSART_Mode_Rx| STM32的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDRRDR。当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内要用voidUSART_SendData和USART_ReceiveData对USART_DR串口的状态则可以通过状态寄存器USART_SR,要判断寄存器是否非空,可以用,)!=到USART_RX_BUF缓冲区中。void //串口1程{u8#ifdef 了if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收中断(接收到的数据必须是0x0d0x0a尾){Res=USART_ReceiveData(USART1);//(USART1->DR);//接收到的数{)//接收到了{elseUSART_RX_STA|=0x8000; }else//还没收到开始接}

USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重}}}#ifdef 了}④在mainwhile循环使程序一直运行,借助接收状态标记USART_RX_STA的{{printf("\r\n息为:\r\n");{USART1-}{

{串口实验\}if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.}}机的GND,TXD接单片机的PA10,RXD接单片机的PA9.打开串口调试助手,设置好程序学院 物联 2018 7 18实验名称:STM32LED12SWD(CH340,这一章来学习定时器中断,这个很简单只要设置好频率以及自动计数,始。比如设置频率为100Hz,最大值为200,那么单片机每秒能计100个数,2秒触发TIM3时钟使能。①先做一点零碎的工作,去led.c中设置LED灯初始化函数,以供正式实验使用。本实验中,只要LED0和LED1就可以,LED0用来表示程序正在运行,LED1则用来表示定void{GPIO_InitTypeDef //使端口时GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //LED0-->PA.0端口配置GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOA,&GPIO_InitStructure); //根据设定参数初始化GPIOA.8 //PA.8输出GPIO_InitStructure.GPIO_Pin //LED1-->PA.1端口配置,推挽输GPIO_Init(GPIOA //推挽输出,IO速度为 //PD.2输出}time.cTIM3RCC_APB1PeriphClockCmdTIM3TIM_TimeBaseInitTIM_TimeBaseInitTypeDef给计数器,作为计数器的时钟。arr0ARRRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//时钟使能TIM_TimeBaseStructure.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000TIM_TimeBaseStructure.TIM_Prescalerpsc设置用来作为TIMx频值10Khz数TIM_TimeBaseStructure.TIM_ClockDivision=0;//设置时钟分割:TDTS=Tck_timTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStructTIMxTIM_ITConfig(//使能或者失能指定的TIMTIM3,TIM_IT_Update,ENABLE//使能NVIC_InitStructure.NVIC_IRQChannelTIM3_IRQn;//TIM3NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority0;//先占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct指定的参数初始化外设NVIC存器④刚才的步骤中是设置好了TIM3,最后还要用TIM_Cmd(TIM3,ENABLE)函数来打开天才发现这里有一个BUG。到这里才算是完成TIM3的初始化函数。⑤下面来编写TIM3中断服务程序该服务程序的思想很简单使用TIM_GetITStatus函数检查时钟中断是否发生,如果发生了,就操作一下LED1,然后清除中断标志位。void //TIM3中{if(TIM_GetITStatus(TIM3,TIM_IT_UpdateRESET指定的TIMTIM中断{TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMxTIM中断源}}后可以看到LED0以较快的速度不停闪烁表示程序一直在喜爱运行中LED1学院 物联:学号:41624602实验日期 2018 7 18实验名称 理解(脉冲宽度调制)的基本原理学会设置输出,了解参数影响使用输出三角波LED12SWD(CH340脉宽调制(,PulseWidthModulation)是一种模拟控制方脉冲宽度调制,利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术在宏观上往往输出“三使 TIM1PA8TIM1的ARR和PSC设置TIM1_CH1 模式及通道方向,使能TIM1的CH1输出TIM1设置MOE输出,使能输出①先开启TIM1的时钟这点相信大家看了这么多代码应该明白了这里还要配置PA8TIM1_CH1PA8PA8输出,所以也需要使8的时钟,接下来PA8还需要普通的设置一下。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOAENABLE);//使能GPIO//设置该引脚为复用输出功能,输出TIM1CH1的 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//TIM_CH1GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);置方法和之前的TM3很相似,只不过必要的参数多了1个。同样的,在这里用结构体TIM_TimeBaseStructure.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值不分频TIM_TimeBaseStructure.TIM_ClockDivision=0;//设置时钟分割:TDTS=Tck_timTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStructTIMx③除了定时器实验里介绍的arr和psc两个寄存器(平时也是变量名)外,在这里要认识一下CCR1,接下来,要设置TIM1_CH1为模式(默认是冻结的因为的LED都是低电平亮,而希望当CCR1的值小的时候,LED就暗,CCR1值大的时候,LED就亮,所以要通过配置TIM1_CCMR1的相关位来控制TIM1_CH1的模式在库函数中,通道设置是通过函数TIM_OC1Init()~TIM_OC4Init(这里使用的是通道1,所以使用的函数是TIM_OC1Init()。TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_2;//选择定时器模式:TIM脉冲宽度调制模式2=TIM_OCInitStructure.TIM_Pulse=0;//设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性:TIM输出比较极性高TIM_OC1Init(TIM1,&TIM_OCInitStructure);//根据TIM_OCInitStruct化外设TIMx④回到主函数中,设置一个变量led0val来控制占空比。这里要认识一arr的整数,它与arr的比值就是占空比。int{u16led0 u8dir=1; //延时函数初始 {elseled0 }}学院 物联 学号:41624602 2018 7 18实验名称:DMA区分DMA学会使用DMA进行数据传输,体会使用DMACH340串接口调试助手普通传输方式,在串口实验中可以体会到:需要CPU一直操作写入并等待发送完成,这样浪费了大量的CPU时间。DMA,即直接器。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。STM32拥有多2个DMA控制器,每个控制器拥有多下面来看一下主要工作DMADMA4DMADMA14DMA①因为涉及时序问题,肯定是要对DMA进行时钟使能的。调用函数初始化DMA的时候,需要用到三个参数:DMA通道及其外设为串口、器,数据长度。接下来,需要用结构体DMA_InitStructure来配置DMA。该结构体的变量较多,比较重要的有:DMA_PeripheralBaseAddr用来设置DMA传输的外设址;数DMA_MemoryBaseAddr为内存址也就是存放DMA传输数据的内存地址;DMA_DIR设置数据传输方向,决定是从外设数据到内存还送从内存数据发送到外设也就是外设是源地还是目的 //使能DMA //将DMA通道1省DMA_InitStructure.DMA_PeripheralBaseAddr=cpar;//DMA外设ADC址DMA_InitStructure.DMA_MemoryBaseAddr=cmar;//DMA内存址DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//数据传输方向,从内存发送到外设DMA_InitStructure.DMA_BufferSize=cndtr;//DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//数据宽度为8位DMA_InitStructure.DMA

温馨提示

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

评论

0/150

提交评论