嵌入式系统导论(第2版) 课件 第8、9章 STM32的DMA接口、STM32的定时器接口_第1页
嵌入式系统导论(第2版) 课件 第8、9章 STM32的DMA接口、STM32的定时器接口_第2页
嵌入式系统导论(第2版) 课件 第8、9章 STM32的DMA接口、STM32的定时器接口_第3页
嵌入式系统导论(第2版) 课件 第8、9章 STM32的DMA接口、STM32的定时器接口_第4页
嵌入式系统导论(第2版) 课件 第8、9章 STM32的DMA接口、STM32的定时器接口_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式系统导论主讲教师:第8章STM32的DMA接口本章内容提要8.1DMA控制器8.2DMA应用示例:USART接口的DMA传输8.3DMA、USART和GPIO的综合应用数据传送方式程序查询传送中断传送DMA传送8.1DMA控制器DMA传送希望克服程序控制传送的不足:外设→CPU→存储器外设←CPU←存储器直接存储器存取DMA:外设→存储器外设←存储器CPU释放总线,由DMA控制器管理查询要等,中断太烦,来个直接的DMA传送过程1)DMA预处理2)DMA请求和应答3)DMA传送DMA读:存储器→外设DMA写:存储器←外设4)增减地址和计数,判断传送是否完成STM32的DMA控制器直接存储器存取DMA(DirectMemoryAccess)利用系统总线直接在外设与存储器之间进行 大量和高速数据传输的方法STM32设计有2个DMA控制器单元DMA1单元,支持7个DMA通道DMA2单元,支持5个DMA通道具有多达12个独立的可配置DMA通道支持存储器到存储器、外设到存储器、 存储器到外设和外设到外设的自动传输每个通道都支持软件触发DMA框图DMA1各通道的请求外设通道1通道2通道3通道4通道5通道6通道7ADC1ADC1SPI/I2SSPI1_RXSPI1_TXSPI/I2S2_RXSPI/I2S2_TXUSARTUSART3_TXUSART3_RXUSART1_TXUSART1_RXUSART2_RXUSART2_TXI2CI2C2_TXI2C2_RXI2C1_TXI2C1_RXTIM1TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM1_CH3TIM2TIM2_CH3TIM2_UPTIM2_CH1TIM2_CH2TIM2_CH4TIM3TIM3_CH3TIM3_CH3TIM3_UPTIM3_CH1TIM3_TRIGTIM4TIM4_CH1TIM4_CH2TIM4_CH3TIM4_UPDMA1各条通道连接的外设参考手册STM32主要外设都支持DMADMA2各通道的请求外设通道1通道2通道3通道4通道5ADC3ADC3SPI/I2S3SPI/I2S3_RXSPI/I2S3_TXUART4UART4_RXUART4_TXSDIOSDIOTIM5TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM6/DAC_Channel1TIM6_UP/DAC_Channel1TIM7TIM7_UP/DAC_Channel2TIM8TIM8_CH3TIM8_UPTIM8_CH4TIM8_TRIGTIM8_COMTIM8_CH1TIM8_CH2DMA2各条通道连接的外设DMA通道的优先级和中断每个DMA通道可以由应用程序赋予4个优先级之一(很高、高级、中级和低级)在仲裁阶段,高优先级的通道优先获得总线响应相同优先级时,通道号小的通道优先获得总线响应每个DMA通道都可以在3个时刻产生中断请求DMA传输过半HTIFDMA传输完成TCIFDMA传输错误TEIF每个DMA通道都有自己的中断向量(除大容量产品中,DMA2通道4和DMA2通道5的中断被映射在同一个中断向量上)DMA通道的寄存器每个DMA通道由4个寄存器控制配置寄存器CCR定义DMA传输的特性传输数量寄存器CNDTR保存传输的数据个数外设地址寄存器CPAR保存外设的地址存储器地址寄存器CMAR保存存储器的地址中断操作由两个中断寄存器控制中断状态寄存器ISR中断标志清除寄存器IFCR参考手册DMA寄存器寄存器缩写寄存器中文名称DMA_CCR配置寄存器DMA_CNDTR传输数量寄存器DMA_CPAR外设地址寄存器DMA_CMAR存储器地址寄存器DMA_ISR中断状态寄存器DMA_IFCR中断标志清除寄存器8.2DMA应用示例:USART接口的DMA传输【例8-1】将主存一个数据块采用DMA方式传输到USART1发送接口(TX)DMA传输前,让所有LED灯灭DMA传输中,处理器继续执行程序让LED1灯亮DMA传输后,产生中断让LED2灯亮将USART1端口连接PC机串口,重定向在PC机远程终端程序中显示传输结果使用DMA方式进行USART1发送属于DMA1单元的通道4(USART1_TX)DMA传输的开发方法使用DMA传输之前,需要进行DMA初始化配置(1)开启DMA时钟:RCC_AHBPeriphClockCmd函数(2)如果使用中断,进行DMA的NVIC配置(3)DMA传输的参数配置:DMA_Init函数(4)允许DMA传输:DMA_Cmd函数(5)如果使用中断,设置DMA传输何时产生中断:

DMA_ITConfig函数当进行DMA传输时,需要进行DMA请求例如,USART使用USART_DMACmd函数开始DMA传输后,处理器可以继续执行程序启动DMA单元时钟使用STM32库函数

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx,ENABLE);DMAx是DMA1或DMA2直接寄存器编程通过允许RCC单元的AHB时钟寄存器实现

RCC->AHBENR|=0x000000001; //允许DMA时钟DMA初始化DMA初始化函数

voidDMA_Init(DMA_Channel_TypeDef*DMAy_Channelx,DMA_InitTypeDef*DMA_InitStruct)按照DMA_InitStruct结构变量初始化DMAy通道x(y=1、2,x=1~12)DMA_InitStruct是指向DMA_InitTypeDef结构体的指针,包含对DMA通道的配置信息帮助文档DMA初始化结构类型DMA_InitTypeDeftypedef

struct{uint32_tDMA_PeripheralBaseAddr; /*外设基地址*/uint32_tDMA_MemoryBaseAddr;/*存储器基地址*/uint32_tDMA_DIR; /*传输方向:外设是源还是目的*/uint32_tDMA_BufferSize; /*缓冲区大小*/uint32_tDMA_PeripheralInc; /*外设地址是否增量*/uint32_tDMA_MemoryInc; /*存储器地址是否增量*/uint32_tDMA_PeripheralDataSize; /*外设数据宽度*/uint32_tDMA_MemoryDataSize; /*存储器数据宽度*/uint32_tDMA_Mode;

/*操作模式*/

uint32_tDMA_Priority; /*软件优先级*/uint32_tDMA_M2M; /*是否存储器到存储器传输*/}DMA_InitTypeDef;DMA_InitTypeDef成员-1成员1:DMA_PeripheralBaseAddr,外设基地址本例的外设是USART1数据寄存器(USART1_DR)需要用户定义给出这个地址(STM32库没有定义)成员2:DMA_MemoryBaseAddr,存储器基地址通常是用户程序定义的主存缓冲区首地址成员3:DMA_DIR,传输方向选择外设是源(DMA_DIR_PeripheralSRC)还是目的(DMA_DIR_PeripheralDST)成员4:DMA_BufferSize,缓冲区大小传输的数据量(直接给出数值)单位是成员7给出的DMA_PeripheralDataSizeDMA_InitTypeDef成员-2成员5:DMA_PeripheralInc,外设地址增量允许(DMA_PeripheralInc_Enable)禁止(DMA_PeripheralInc_Disable)成员6:DMA_MemoryInc,存储器地址增量允许(DMA_MemoryInc_Enable)禁止(DMA_MemoryInc_Disable)成员7:DMA_PeripheralDataSize,外设数据宽度字节(DMA_PeripheralDataSize_Byte)半字(DMA_PeripheralDataSize_HalfWord)字(DMA_PeripheralDataSize_Word)DMA_InitTypeDef成员-3成员8:DMA_MemoryDataSize,存储器数据宽度字节(DMA_MemoryDataSize_Byte)半字(DMA_MemoryDataSize_HalfWord)字(DMA_MemoryDataSize_Word)成员9:DMA_Mode,操作模式正常(DMA_Mode_Normal):一次性传输循环(DMA_Mode_Circular):自动重复传输DMA_InitTypeDef成员-4成员10:DMA_Priority,软件优先级选择通道的4个优先级之一很高(DMA_Priority_VeryHigh)高级(DMA_Priority_High)中级(DMA_Priority_Medium)低级(DMA_Priority_Low)成员11:DMA_M2M,存储器到存储器传输允许(DMA_M2M_Enable)禁止(DMA_M2M_Disable)DMA初始化配置头文件dma.h配置DMA传输的外设基地址(USART1数据寄存器DR)(DMA_InitStructure.DMA_PeripheralBaseAddr)STM32库的头文件没有定义USART1_DR地址查阅STM32参考手册USART1的起始地址(0x40013800)数据寄存器DR在USART的偏移量(0x04)相加得到USART1_DR地址(0x40013804)

#defineUSART1_DR_Base0x40013804#defineSENDBUF_SIZE0x4000 //缓冲区大小voidDMA1_Config(void);DMA配置源文件dma.c-1/*DMA的中断配置函数*/voidNVIC_Config(void){NVIC_InitTypeDef

NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}DMA配置源文件dma.c-2//USART1进行DMA传送的初始化配置(含中断配置)uint8_t

SendBuf[SENDBUF_SIZE];//发送缓冲区voidDMA1_Config(void){DMA_InitTypeDefDMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); NVIC_Config(); /*配置DMA中断

*/

//设置DMA源:串口数据寄存器地址

DMA_InitStructure.DMA_PeripheralBaseAddr=USART1_DR_Base;DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SendBuf;/*内存地址(要传输的变量的指针)*/

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;/*方向:从内存到外设*/DMA配置源文件dma.c-3

DMA_InitStructure.DMA_BufferSize=SENDBUF_SIZE; /*传输大小*/

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; /*外设地址不增*/

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;

/*内存地址自增*/

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;

/*外设数据单位,字节*/

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;

/*内存数据单位,字节*/

DMA_InitStructure.DMA_Mode=DMA_Mode_Normal; /*DMA模式:一次传输,不循环*/DMA配置源文件dma.c-4

DMA_InitStructure.DMA_Priority=MA_Priority_Medium; /*优先级:中*/DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; /*禁止内存到内存的传输 */

DMA_Init(DMA1_Channel4,&DMA_InitStructure);

/*配置DMA1的4通道*/

DMA_Cmd(DMA1_Channel4,ENABLE); /*允许DMA1的4通道进行DMA传输

*/

DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); /*设置DMA1的4通道DMA传输完成产生中断*/}帮助文档进行DMA传输的主程序main.c-1int

main(void){ inti; USART1_Config();

//

USART1配置:1152008-N-1

DMA1_Config();

LED_Config();

LED_Off_all(); //LED灯全灭

for(i=0;i<SENDBUFF_SIZE;i++) {SendBuf[i]='A'; //填充缓冲区

}进行DMA传输的主程序main.c-2

printf("\r\nDMA传输开始\r\n"); //USART1接口发出DMA请求

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); LED_On(1); //点亮LED1灯

while(1) { //循环

}}中断服务程序stm32f10x_it.cvoidDMA1_Channel4_IRQHandler(void){ //判断是否为DMA发送完成中断

if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)

{LED_On(2);

//LED2灯亮

DMA_ClearFlag(DMA1_FLAG_TC4);

//清除标志

printf("\r\nDMA传输结束\r\n");} }8.3DMA、USART和GPIO的综合应用【例8-2】按键控制的应用项目按下KEY1键,触发KEY1中断, 让3个LED灯逐个点亮、并停留在LED3灯上按下KEY2键,触发KEY2中断,

让主存数据DMA传输给USART1发送接口

DMA传输前、灭灯,DMA传输中、LED1灯亮,

DMA传输后、LED2灯亮USART接口连接PC机串口,

在PC机上查阅发送结果KEY2键中断能够打断KEY1键中断【例8-2】综合应用项目分析源程序文件文件功能led.c和led.hLED灯初始化和驱动程序key.c和key.h按键初始化和驱动程序key.ini软件模拟按键的调试函数usart1.c和usart1.hUSART1初始化和驱动程序exti.c和exti.hEXTI初始化和驱动程序dma.c和dma.hDMA初始化和驱动程序nvic.c和nvic.hNVIC的中断配置程序stm32f10x_it.c和stm32f10x_it.h中断服务程序main.c主程序文件嵌入式系统导论主讲教师:第9章STM32的定时器接口本章内容提要9.1系统时钟(SysTick)9.2STM32看门狗9.3STM32定时器(TIMx)9.4STM32实时时钟(RTC)定时器基于计数器电路实现STM32微控制器的定时器接口系统时钟(SysTick)看门狗WatchDog独立看门狗(IWDG)独窗口看门狗(WWDG)通用定时器基本定时器(TIM6和TIM7)通用定时器(TIM2、TIM3、TIM4和TIM5)高级控制定时器(TIM1和TIM8)实时时钟RTC9.1系统时钟(SysTick)Corte-M3在内核包含的简单定时器该定时器的时钟源可以来自CM3内部时钟(FCLK),或CM3外部时钟(STCLK)在STM32微控制器中,SysTick的时钟源可以是:“AHB时钟”、或者“AHB时钟/8”SysTick定时器是一个24位递减计数器设置初值、允许计数,每来一个时钟,计数值减1计数值减为0,计数器被自动载入初值、继续计数同时内部标志COUNTFLAG被置位、并触发中断SysTick中断连接中断控制器NVIC,异常号为15SysTick寄存器SysTick是CM3内核的定时单元参阅“Cortex-M3一般用户手册”(不是“STM32参考手册”)寄存器缩写寄存器中文名称SysTick_CTRL控制和状态寄存器SysTick_LOAD重载值寄存器SysTick_VAL当前值寄存器SysTick_CALIB校准值寄存器控制和状态寄存器(SysTick_CTRL)用于控制SysTick工作和获取计数归0的状态名称功能ENABLE计数器使能:0=禁止SysTick定时器,1=允许SysTick定时器TICKINTSysTick异常请求使能:0=不触发异常请求,1=触发异常请求(中断)CLKSOURCE选择时钟源:0=外部时钟,1=处理器时钟COUNTFLAG计数状态:上次读取后定时器计数到0,返回1SysTick寄存器编程(1)禁止SysTick定时器(因为SysTick可能已经被允许了)

SysTick->CTRL=0;//关闭SysTick(2)写入重载值

SysTick->LOAD=256-1;//假设计数值为256(3)清除当前值为0(向当前值寄存器SysTick_VAL写入任何值)

SysTick->VAL=0;(4)允许SysTick定时器

SysTick->CTRL=5;//使用处理器时钟SysTick结构定义系统时钟SysTick属于Cortex内核部件驱动程序定义在core_cm3.h(不是core_cm3.c)文件SysTick寄存器的结构类型

typedef

struct {__IOuint32_tCTRL; __IOuint32_tLOAD; __IOuint32_tVAL; __Iuint32_tCALIB; }SysTick_Type;有关地址定义的语句如下:

#defineSCS_BASE(0xE000E000) #defineSysTick_BASE(SCS_BASE+0x0010) #defineSysTick((SysTick_Type*)SysTick_BASE)SysTick配置函数_STATIC__INLINEuint32_tSysTick_Config(uint32_tticks){if((ticks-1UL)>SysTick_LOAD_RELOAD_Msk){return(1UL); }

SysTick->LOAD=(uint32_t)(ticks-1UL);NVIC_SetPriority(SysTick_IRQn,(1UL<<__NVIC_PRIO_BITS)-1UL);

SysTick->VAL=0UL;

SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|

SysTick_CTRL_TICKINT_Msk|

SysTick_CTRL_ENABLE_Msk;return(0UL);}初始化、并启动SysTick计数器和中断设置每隔ticks脉冲引起一次中断配置成功返回0值,不成功则返回1值SysTick_Config函数-11、将ticks参数作为重载值赋给重载值寄存器(SysTick_LOAD)定时时间T是:T=ticks×(1/f)秒f是时钟源的时钟频率2、使用NVIC_SetPriority函数 配置系统时钟中断(SysTickIRQ)为15如果要改变SysTick中断的优先级,使用

NVIC_SetPriority(SysTick_IRQn,...)(定义在core_cm3.h文件)SysTick_Config函数-23、复位SysTick计数器(清零)4、设置控制和状态寄存器(SysTick_CTRL)允许计数和中断选择处理器时钟源(STM32是“AHB时钟”)如果使用STM32的“AHB时钟/8”直接编程控制和状态寄存器(SysTick_CTRL) 设置CLKSOURCE(D2位)为0使用STM32库的SysTick_CLKSourceConfig函数(在misc.c文件中)SysTick应用示例:精确定时SysTick可服务于操作系统也可用于精确定时、时间测量等系统时钟72MHz,最小的计时单位(时钟周期)(1/72)×10-6秒、即72分之一的微秒结合GPIO控制LED灯的示例【例9-1】使用SysTick精确的硬件定时主程序需要对SysTick进行初始化例如配置1ms产生一次中断SysTick初始化主程序SysTick_Config函数配置1ms产生一次中断

if(SysTick_Config(SystemCoreClock/1000)){while(1);/*没有初始化成功,死循环*/}

SysTick->CTRL&=~1;/*关闭SysTick定时器*/SystemCoreClock常量表示系统主时钟频率开发板的时钟频率是最高72MHz定时时间(SystemCoreClock与f相同):

T=(SystemCoreClock/1000)×(1/f)秒

=10-3

秒=1毫秒=1ms硬件定时的延时函数定义TimingDelay为静态变量每次进入函数时,让其保持上次退出的数值 这个变量的改变是在中断服务程序中static__IOuint32_tTimingDelay=0;voidDelay_ms(__IOuint32_tnTime){TimingDelay=nTime;/*

nTime是延时时间

*/

SysTick->CTRL|=1;/*

启动SysTick定时器*/

while(TimingDelay!=0);}

voidDecrement(void){if(TimingDelay!=0)TimingDelay--;}中断服务程序voidSysTick_Handler(void){Decrement(); //每次中断,TimingDelay减1}延时500ms的延时函数调用

Delay_ms(500);9.2STM32看门狗WatchDog看门狗是嵌入式应用系统的一个安全机制常用于防止程序失去控制,避免系统导致严重后果各种干扰可能影响程序的正常执行,导致“跑飞”如果系统在规定的时间内没有执行特定的“喂狗”程序,看门狗就会报警,系统可以及时纠正错误看门狗机制的实质是定时器,当计数器达到给定的超时值时,触发一个中断或产生系统复位STM32微控制器支持两个看门狗独立看门狗(IWDG)窗口看门狗(WWDG)9.2.1独立看门狗(IWDG)由专门的低速时钟(LSI)驱动即使系统主时钟发生故障也仍然有效适合看门狗作为独立于主程序之外的处理进程、对时间精度要求不高的应用场合一个独立运行的12位减量计数器启动后,当计数值减量为0,导致系统复位Independentwatchdog独立看门狗结构寄存器缩写寄存器英文名称寄存器中文名称IWDG_KRKeyRegister关键寄存器IWDG_PRPrescalerRegister预分频寄存器IWDG_RLRReloadRegister重载寄存器IWDG_SRStatusRegister状态寄存器独立看门狗的启动和重载启动独立看门狗向关键寄存器(IWDG_KR)写入数值0xCCCC计数器从复位值0xFFF开始减量计数当计数值减至结束值0x000时,触发复位没有及时“喂狗”导致系统复位、进入初始状态重载独立看门狗(喂狗)向关键寄存器(IWDG_KR)写入关键值0xAAAA重载寄存器(IWDG_RLR)内的数值被重新加载到计数器,这样就防止了看门狗复位及时进行了“喂狗”,系统可以正常运行IWDG寄存器关键寄存器(IWDG_KR)在待机模式被复位为0只能写入0xCCCC(启动看门狗)、0xAAAA(重载计数值)和0x5555(允许访问预分频和重载寄存器)预分频寄存器(IWDG_PR)表示8种分频系数(4/8/16/32/64/128/256)重载寄存器(IWDG_RLR)用于写入重载的计数初值(12位计数器)可写入编码0x000~0xFFF依次表示1~4096计数值待机模式会将其复位为最大值0xFFFIWDG寄存器寄存器缩写寄存器英文名称寄存器中文名称IWDG_KRKeyRegister关键寄存器IWDG_PRPrescalerRegister预分频寄存器IWDG_RLRReloadRegister重载寄存器IWDG_SRStatusRegister状态寄存器IWDG定时时间分频系数最小定时(ms)最大定时(ms)40.1409.680.2819.2160.41638.4320.83276.8641.66553.61283.213107.22566.426214.4LSI=40KHzIWDG函数设置重载寄存器值voidIWDG_SetReload(uint16_tReload)

设置预分频系数voidIWDG_SetPrescaler(uint8_tIWDG_Prescaler)将重载寄存器的值重新装载给IWDG计数器voidIWDG_ReloadCounter(void)允许或禁止对重载寄存器和重载寄存器写入voidIWDG_WriteAccessCmd(uint16_tIWDG_WriteAccess)允许IWDG(写入重载寄存器和重载寄存器被禁止)voidIWDG_Enable(void)检测IWDG标志置位与否FlagStatus

IWDG_GetFlagStatus(uint16_tIWDG_FLAG)RCC标志检测和清除函数RCC_GetFlagStatus函数获得系统复位原因

FlagStatus

RCC_GetFlagStatus(uint8_tRCC_FLAG)参数RCC_FLAG表示要检测的标志,例如复位标志有RCC_FLAG_PINRST(引脚复位)RCC_FLAG_PORRST(电源开/电源关复位)RCC_FLAG_SFTRST(软件复位)RCC_FLAG_IWDGRST(IWDG复位)RCC_FLAG_WWDGRST(WWDG复位)RCC_FLAG_LPWRRST(低电源电压复位)FlagStatus返回置位(SET),表示发生了检测的复位返回复位(RESET),表示没有发生检测的复位RCC_ClearFlag函数清除(复位)上述所有复位标志

voidRCC_ClearFlag(void)【例9-2】IWDG应用示例:IWDG复位启用独立看门狗,设置约10秒的喂狗间隔用户在10秒内按下KEY1按键(需要每隔10秒内,连续按下)、让系统进行喂狗如果在10s内“喂狗”、LED3灯常亮,表示正常用户(连续)按下KEY1间隔超过10s程序没有及时“喂狗”,系统将复位复位后,系统重新执行程序检测到是由于IWDG导致的复位,LED2指示灯亮如果是其他原因导致的复位,LED1指示灯亮IWDG初始化配置voidIWDG_Config(void){//允许看门狗寄存器写入IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//时钟分频系数256IWDG_SetPrescaler(IWDG_Prescaler_256);//喂狗时间10s,设置计数值1562.5IWDG_SetReload(1563);//写入计数值(喂狗)IWDG_ReloadCounter();//允许IWDG看门狗IWDG_Enable();}IWDG主程序-1int

main(void){KEY_Config();

LED_Config();IWDG_Config();LED_ON_all();Delay(0x990000);//LED等亮一会表示系统复位

LED_OFF_all();//LED灯全灭IWDG主程序-2//

如果上次复位是IWDG复位,LED2亮if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET)

{LED_ON(2);

Delay(0x990000); //延时,让用户观察到

LED_OFF(2);

RCC_ClearFlag();

}//如果上次复位是不是IWDG复位,LED1亮else

{LED_ON(1); Delay(0x990000); //延时,让用户观察到

LED_OFF(1); }IWDG主程序-3//检测按键,适时喂狗while(1)

{if(KEY_scan(1)==

0){while(KEY_scan(1)==0);

IWDG_ReloadCounter();

LED_ON(3); Delay(0x990000); LED_OFF(3);

}}}9.2.3窗口看门狗(WWDG)时钟由APB1时钟分频后得到具有可配置的时间窗口用于检测应用程序过迟或过早的非正常操作适合在精确计时窗口起作用的应用程序一个独立运行的可编程减量计数器启动后,就设置了一个刷新时间间隔(窗口)在这个时间窗口内写入计数值,才保证系统不复位“喂狗”时间既不能太早、也不能太晚(或不喂)Windowwatchdog窗口看门狗结构窗口看门狗的定时时间【例9-3】WWDG应用示例:适时喂狗启用WWDG,设置约43~58ms的喂狗时间窗口系统如果在刷新时间窗口内“喂狗”LED2灯闪烁,表示正常工作使用按键KEY1按下模拟“喂狗”时间“喂狗”时间太早或时间太晚系统会复位让LED1灯闪烁启用提前唤醒中断EWI当喂狗时间太晚进入EWI中断服务程序让LED3灯闪烁WWDG初始化函数voidWWDG_Config(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);WWDG_SetPrescaler(WWDG_Prescaler_8);WWDG_SetWindowValue(0x50);WWDG_Enable(0x7F);WWDG_ClearFlag();WWDG_EnableIT();}0x50=0x7F–0x2F启用WWDG提前唤醒中断NVIC初始化函数

……NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn; ……WWDG中断程序voidWWDG_IRQHandler(void){LED_On(3);//LED3灯闪烁1次

Delay(0xffff);LED_Off(3); WWDG_ClearFlag();//清除WWDG中断标志位

}WWDG应用的主程序

WWDG_Config();//配置WWDGwhile(1){if(KEY_scan(1)==0){while(KEY_scan(1)==0); //等待按键结束

WWDG_SetCounter(0x7F);LED_On(2);

//喂狗时间合适时,LED2灯闪烁1次

Delay(0xffff);LED_Off(2); }}9.3STM32定时器2个基本定时器(TIM6、TIM7)主要用于产生数字模拟转换器(DAC)的触发信号也可用于普通的16位时基计数器4个普通定时器(TIM2-TIM5)能够测量输入信号的脉冲长度(输入捕获功能)产生需要的输出波形(输出比较、脉冲宽度调制PWM脉冲和单脉冲输出等)2个高级控制定时器(TIM1、TIM8)能够产生3对PWM互补输出的高级定时器常用于三相电机的驱动基本定时器(TIM6和TIM7)结构基本定时器(TIM6和TIM7)工作原理分频系数为2,计数值36基本定时器应用示例:周期性定时中断【例9-4】周期性定时中断,控制LED灯闪烁利用基本定时器(TIM6)的基本定时功能产生周期性定时中断控制LED灯每隔1秒闪烁一次定时时间=(计数值+1)×(预分频值+1)÷定时器时钟1s=2000×36000÷72M基本定时器的初始化配置voidTIM6_Config(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);TIM_TimeBaseStructure.TIM_Prescaler=36000-1;TIM_TimeBaseStructure.TIM_Period=2000-1;TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);

TIM_UpdateRequestConfig(TIM6,TIM_UpdateSource_Regular);

TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);TIM_Cmd(TIM6,ENABLE);}基本定时器的中断服务程序voidTIM6_IRQHandler(void){if(TIM_GetITStatus(TIM6,TIM_IT_Update)==SET){TIM_ClearITPendingBit(TIM6,TIM_FLAG_Update);GPIOB->ODR^=GPIO_Pin_0; //LED1灯反转

GPIOF->ODR^=GPIO_Pin_7; //LED2灯反转

GPIOF->ODR^=GPIO_Pin_8; //LED3灯反转

}}9.4STM32实时时钟可以依靠后备电池供电、维持运行的定时器提供日历、

温馨提示

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

评论

0/150

提交评论