本章习题
一、
选择题
1、关于定时计数器通常使用的公式(6-1),以下说法错误的是( B )
A. 计数值N与定时长度T成正比,N越大,T越长 B. 最大的定时时间是PR=0时的值
C. 定时器最小的定时时间为PR=0且N=1时的值,即此时定时时间就是一个FPCLK周期 D. 当计满N个计数周期时,在定时器输出端通常有溢出标志或产生中断信号 2、以下关于定时计数器的功能说法错误的是( A )
A. 比较(匹配)功能主要用于外部信号的计数
B. 比较的条件定时器计数值与预设的比较寄存器的值相等时 C. 捕获功能可用于测量外部信号的周期或频率
D. 捕获的条件有上升沿触发、下降沿触发、以及上下边沿触发 3、关于STM32F10x系列微控制器的定时计数器,以下说法错误的是( D )
A. 高级定时器只包括TIM1和TIM8、
B. 通用定时器包括TIM2、TIM3、TIM4和TIM5,均具有PWM功能 C. 基本定时器仅具备更新功能
D. 所有定时器都是通过APB2总线连接的
4、关于STM32F10x系列微控制器定时计数器相关寄存器,以下说法错误的是( A )
A. 定时器控制寄存器TIMx_CR1可以决定计数器是否允许更新,是否使能,不能决定向上向下计数 B. 普通定时器中断使能寄存器TIMx_DIER用于是否允许更新和DMA中断 C. 定时器状态寄存器TIMx_SR记录哪个中断源有中断
D. 定时器重装载寄存器TIMx_ARR和预分频器TIMx_PSC决定定时器的定时周期或时间 5、关于STM32F10x系列微控制器看门狗,以下说法错误的是( D )
A. IWDG为独立看门狗,WWDG为窗口看门狗
B. IWDG的时钟输入源固定40KHz,WWDG输入频率可编程
C. 无论IWDG还是WWDG均要定期喂狗操作才能让系统正常有序工作 D. IWDG和WWDG的喂狗方式一样,都是写入0xAAAA到键寄存器中 6、关于STM32F10x列微控制器实时钟RTC,以下说法错误的是( A )
A. RTC的直接提供了年月日和时分秒这些数据 B. RTC组件是接到APB1总线上的
C. RTC的时钟可以是外部32.768KHz,也可以选择内部40KHz以及代功耗RC(LSI)时钟 D. RTC闹钟寄存器的值与计数寄存器的值相等时,将产生闹钟中断
7、关于STM32F10x系列微控制器定时器,每个定时器有4个PWM输出通道,以下说法错误的是( A )
A. 每个PWM输出通道周期不可以单独编程设置 B. 每个PWM输出通道的占空比可以单独编程设置 C. 每个PWM输出通道可以编程输出正脉冲或负脉冲
D. 每个PWM输出通道占空比取决于比较寄存器CCR和自动重装载寄存器ARR的值 8、关于STM32F10x系列通用定时器用作PWM功能以下说法错误( A )
A. GPIO任何一个引脚均可以配置为PWM输出 B. PWM输出具有边沿对齐和中心对齐方式
C. PWM输出周期由自动重装载寄存器TIMx_ARR决定R D. PWM输出占空比取决于捕获/比较寄存器TIMx_CRRi
9、为操作系统或其它系统管理软件提供固定10ms或可软件编程定时时间的定时中断,该定时部件的名称是( C )
A. PWM定时器 B. 看门狗定时器WDT C.系统节拍定时器SysTick D.通用定时器
87
嵌入式系统原理及应用(第三版)
二、 填充题
1、当定时计数器运行时,在某引脚上出现有效的边沿触发动作,此时定时计数器的当前值被保持在指定寄存器中,这一定时计数器的功能称为__输入捕获或捕获________,当定时计数器计数值与预设值相等时将产生一个标志或触发一个中断,这一定时计数器的功能称为____比较或匹配__________。
2、已知定时计数器所接时钟为FTIMxLCK=72MHz,预分频器的值TIM_Prescaler=99,如果要定时10ms,则采用更新方法定时时,自动重装载寄存器的值应该为_____7199____________; 如果预分频器的值为0,则最大定时时间为______910.625_______us,此时重装寄存器的值为______65535_______。
3、利用STM32F10x系列微控制器通用定时计数器要记录PA0脉冲的个数,采用定时计数器TIM2的____CH2或第二通道_______,利用PWM功能在PC6引脚上输出1KHz方波,则选择定时计数器TIM3通道1(TIM3_CH1),如果FPCLK=SystemFrequency Hz,预分频器的值为99,则自动重装载寄存器的值为__SystemCoreFrequency/100/1000______________。
4、最小的独立看门狗IWDG定时溢出时间为____4*1/40K=10_________毫秒,最大的溢出时间为_____4*2*2/40KHz=256*4096/40000=26.2144______秒。要使IWDT的溢出时间为1.2秒,如果选择IWDG_PR=0,则IWDG_RLR的值为___1.2*40000/4-1=11999_(IWDG使用内部固定时钟为40KHz)__________。
5、对于窗口看门狗WWDG如果WWDG计数时钟为36MHz,则当WDGTB=2时,设置WWDG溢出时间为20ms,则WWDG_CR低7位的值为__36MHz*20ms/4096/4-1=43.94-1=42.94取43__________。
6、已知STM32F10x系列微控制器PWM预分频寄存器PMW1PR=1,FPCLK=1MHz,PWM输入的计数频率fPWMIN=_________500_____KHz、PWM1最快的输出频率为FPWMOUT=____500______KHz,如果要 PWM1输出周期为2KHz,占空比为50%的方波,则PWM1MR0=____250_____,PWM1MR1=___125______。本题去掉 7、对于边沿对齐的PWM模式,PWM输出波形变化出现两个位置,一是当计数到与___________捕获/比较寄存器或TIMx_CCRi______相等时,后面是继续计数到与___自动重装载寄存器或TIMx_ARR____ 的值相等时。对于中心对齐的PWM模式,PWM输出波形变化出现两个位置,一是当加1计数到是与___________捕获/比较寄存器或TIMx_CCRi______相等时,PWM输出波形翻转,到计数到自动重装载寄存器的值相等时,开始减1计数,直到计数值与_捕获/比较寄存器或TIMx_CCRi_______PWM输出再次翻转。
8、对于STM32F10x,影响PWM输出周期的包括定时器计数时钟、预分频器值以及________自动重装载寄存器或TIMx_ARR _______________中的值,影响PWM输出占空比的寄存器除了自动重装载寄存器之外,还包括_______相应通道的捕获/比较寄存器TIMx_CCRi_______.
6
12
三、 应用题
一基于STM32F10x微控制器的嵌入式应用系统使用的GPIO情况如图6.24所示,PA0接一按键,PC4通过光耦驱动一个VDD=24VDC的继电器,继电器触点做为可控制的开关,连接到220VAC工作的喇叭,当PC4输出0逻辑时,光耦发光而使继电器得电闭合,喇叭发声。PD2连接LED发光二极管,PD2输出逻辑0时发光管亮。PB1产生200Hz~1KHz方波,假设已经按照第5章的有关内容初始化PA0为输入,PD2.、PC4和PB1为输出。
VCCVDDJACR11010KSTM32F10xKEY1SW-PBR92继电器K1喇叭12220VACPA0 PD11PC4R93光耦R2VDDJFOUT12R112VCC200Hz~1KHzPB1 PC15PD2LD1光耦
图6.1 应用题图 88
嵌入式系统原理及应用(第三版)
1、 利用定时计数器3(TIM3)定时10ms,每当10ms中断一次,在中断服务程序中判断按键,当按键按下超过0.5秒小于1秒时称为短按,按下超过3秒时为长按。试用C语言写出定时器3(TIM3)定时10ms的初始化函数; 当短按奇数次按键时,让LED发光,短按偶数按键时,让LED熄灭,长按偶数次按键时让喇叭发声报警,长按奇数次按键时停止发声,写入定时器3(TIM3)的中断服务程序。
已知已初始化了GPIO,此处无需重新设置,定时计数器的初始化函数参见【例6.1】TIM_Configuration ()定时器TIM3初始化函数,例中是定时500ms,如果要定时其它时间可自行修改。
void NVIC_Configuration(void)//定时器中断配置 {
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
void TIM_Configuration(void) /*配置定时器3*/ { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); ;/*使能TIM3对应时钟*/ TIM_TimeBaseStructure.TIM_Period = 10*10-1; /*定时10ms */ TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/10000-1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* 初始化TIM3*/ /* TIM Interrupts enable */ TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);/*使能TIM3更新中断*/ TIM_Cmd(TIM3, ENABLE);/*启动TIM3计数器*/ }
中断服务函数如下:
#define ShortKeyConst 50 //0.5秒 10ms*50 #define LongKeyConst 300 //3秒 10ms*300
void TIM3_IRQHandler(void) /* TIM3中断服务函数0.5秒中断一次 {
uint8_t LongOddEvenFlags=0; uint16_t KeyTimes=0; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update);/*有更新中断,清除中断标志*/
if (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11)==0) KeyTimes++;//按下键计10ms倍数 else KeyTimes=0; if (KeyTimes >=LongKeyConst) {LongOddEvenFlags ++;//如果超过长按键时间,则长键次数加1 if((LongOddEvenFlags&1)==1) GPIO_SetBits(GPIOC,GPIO_Pin_4);//喇叭响 else GPIO_ReSetBits(GPIOC,GPIO_Pin_4);;//喇叭不响 } else
{if ((KeyTimes>=ShortKeyConst)&&(KeyTimes<=ShortKeyConst*2)) ShortOddEvenFlags ++;//如果为短按键,则短键次数加1
if((ShortOddEvenFlags &1)==1) GPIO_ReSetBits(GPIOD,GPIO_Pin_2);//发光 else GPIO_SetBits(GPIOD,GPIO_Pin_2);//不发光 } } }
实际:
extern u32 TP1,TP2,Times;
89
嵌入式系统原理及应用(第三版)
int main(void) { SystemInit(); GPIO_Configuration(); TIM_Configuration(); /* 初始化TIMx定时器 */ NVIC_Configuration(); LCD_Init(); /* LCD初始化 */ Welcome(); /* 显示主界面 */ LED1(1);LED2(1);LED3(1);LED4(1); while(1) { if (Times>=300) { if (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11)==0) TP2++; if (TP2&1){GPIO_SetBits(GPIOC,GPIO_Pin_4);Times=0;}//停止报警 else {GPIO_ResetBits(GPIOC,GPIO_Pin_4);Times=0;}//报警 } else if ((Times>=50)&&(Times<=150)) { TP1++; Delay_ms(10); if (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11)==1) {if (TP1&1) {GPIO_ResetBits(GPIOD,GPIO_Pin_2);Times=0;}//LED1亮 else {GPIO_SetBits(GPIOD,GPIO_Pin_2);Times=0;}//LED1灭 } } } }
u32 Times=0,TP1=0,TP2;
void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) /*判断是否是更新中断*/ { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); /*清除中断标志*/
if (GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11)==0) Times++;//按下键计10ms倍数 } }
2、 利用PWM的捕获功能确定按键按下,通过PWM1(PB1:TIM3_CH4)输出
200Hz~1KHz占空比为50%的方波,由按键控制频率的改变,起始频率200HZ,频率增加1Hz。当达到1KHz时让LED亮,再按一次按键则回到200Hz,当频率小于950Hz时让LED灭。试编程实现。
void PWM_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO结构体变量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PB1 TIM3 CH4通道引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用输出推挽 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置端口速度为50M GPIO_Init(GPIOB, &GPIO_InitStructure); //将端口GPIOD进行初始化配置 }
90
嵌入式系统原理及应用(第三版)
void TIM2_Cap_Init()//TIM2 CH1捕获方式PA0 { GPIO_InitTypeDef GPIO_InitStructure; TIM_ICInitTypeDef TIM2_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /*使能TIM2时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/*使能GPIOA时钟*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /*PA0 引脚 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*PA0 上拉输入 */ GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_0); /*初始化TIM2输入捕获参数*/ TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; /*选择输入端 IC1映射到TI1上*/
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; /*下升沿捕获*/ TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; /*映射到TI1上*/ TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /*配置输入不分频*/ TIM2_ICInitStructure.TIM_ICFilter = 0x00; /*配置输入不滤波*/
TIM_ICInit(TIM2, &TIM2_ICInitStructure); /*中断分组初始化*/ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; /*TIM2中断*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; /*先占优先级2级*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /*从优先级0级*/ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*IRQ通道被使能*/ NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM2, TIM_IT_CC1,ENABLE);/*允许CC1IE捕获中断*/
TIM_Cmd(TIM2,ENABLE ); /*使能定时器2*/ }
91
因篇幅问题不能全部显示,请点此查看更多更全内容