《嵌入式系统设计(基于STM32F429)》
第9章课后题参考答案
1.STM32F429定时器的计数方式有__递增计数__、__递减计数_、___对齐_。
2.STM32F429计数寄存器是__TIMx_CNT __,自动重载寄存器是__TIMx_ARR) _,预分频寄存器是__TIMx_PSC __。
3.TIMx_PSC=4则时钟源的预分频系数是____5____。
4.TIMx_ARR=89一次计数溢出的计数次数是___90_____。
5.什么是PWM信号?什么是占空比?请绘图举例
答:
PWMPulse Width Modulation): 脉冲宽度调制,简称脉宽调制。
PWM信号:周期内高电平占空比可调的信号。
占空比:一个周期内高电平持续时间与一个周期时间的比值。
6.递增计数模式是0计数到___ARR_____的值,然后产生一次__溢出事件___。
7.递减计数模式是从_ ARR _计数到0的值,然后产生一次向下溢出。中心对齐计数模式是先以递增计数模式,0计数到__ ARR -1___,然后产生一次向上溢出,再在___ ARR _____计数到____1____,然后产生一次向下溢出
8.当使能了比较输出功能,输出PWM波,在边沿比较模式下寄存器___ARR_____控制PWM周期寄存器___ CCR ___控制占空比。
9.当使能了比较输出功能,输出PWM波,在边沿比较模式下TIMx_CNT计数值在_0~ CCR-1 寄存器___范围时输出有效电平;  CCR~ARR  范围时,输出反向电平。
10.定时器TIM2挂载APB1总线上,假设PCLK1=45MHz,选择内部时钟作为计数时钟源(默认情况下一时钟频率=2×PCLK1),TIM2_PSC=8TIM2_ARR=49则计数溢出一次,时间为多长怎么计算?
答:
(TIM2_PSC+1)(TIM2_ARR +1)/ 90000000 = 9 50 / 90000000 = 5us
11.使用内部时钟时,怎么确定各定时器的时钟基准频率?
答:
除非APB的分频系数是1,否则通用定时器的时钟等于APB时钟的2倍。
默认调用SystemInit函数情况下:
SYSCLK=180M
AHB时钟=180M
APB1时钟=45MAPB2时钟=90M
APB分频系数分别是42
所以,定时器时钟是相应挂载总线时钟的2倍。
12.编程序,使用TIM1产生1s的定时。
: 
TIM1挂载在APB2总线上,在系统时钟=180MH时,PCLK2=90MHz,TIM1的内部时钟源= PCLK2*2=180MHz。
Tout(定时时间)=1s=ARR+1)(PSC+1)/1800000000,则可以取PSC=18000-1ARR=10000-1
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
  /*-------------------第1步--------------------*/
    // 开启TIM1时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
   
  /*-------------------第2步--------------------*/
TIM_TimeBaseStructure.TIM_Period = 10000-1;         
  TIM_TimeBaseStructure.TIM_Prescaler = 18000-1;   
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   
TIM_TimeBaseStructure. TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
stm32怎么使用printf
   
    /*-------------------第3-1步--------------------*/
    // 开启定时器更新中断
    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
    // 清除定时器更新中断标志位
    TIM_ClearFlag(TIM1, TIM_FLAG_Update);   
   
    /*-------------------第3-2步--------------------*/   
    // 设置中断组为0
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);       
    // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_TIM10_IRQn;   
    // 设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   
    // 设置子优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);   
   
    /*-------------------第4步--------------------*/   
    // 使能定时器
    TIM_Cmd(TIM1, ENABLE);
13.编程序,使用TIM3产生PWM波。
答:
1)通过TIM3的CH1输出PWM波。
2)PWM波周期为200KHz,占空比为20%。
(3)TIM3的CH1对用的引脚为PA6。
GPIO_InitTypeDef GPIO_InitStructure;   
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
    /*-------------------第1步--------------------*/
    /*开启相关的GPIO外设时钟*/
    RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
  // 使能TIM3时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
   
    /*-------------------第2步--------------------*/ 
    //TIM3输出通道3复用引脚配置
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); //TIM3输出通道1引脚复用
    /* TIM3输出通道3引脚配置 */                                                             
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);   
   
    /*-------------------第3步--------------------*/
    // 定义PWM波的周期
    //当定时器从0计数到999,即为1000次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Period = 1000-1;     
    // 定时器时钟源TIMxCLK = HCLK/2=90MHz
    // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=200KHz
  TIM_TimeBaseStructure.TIM_Prescaler = 450-1;   
  // 采样时钟分频
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  // 计数方式
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
       
    /*-------------------第4步--------------------*/   
    /*设置比较输出通道,PWM模式配置*/
    /* PWM1 Mode configuration: Channel1 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   
  TIM_OCInitStructure.TIM_Pulse = 200;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //输出有效电平为高电平
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);    //使能通道1 
    /*使能通道3重载*/
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
   
    /*-------------------第5步--------------------*/   
    // 使能定时器
    TIM_Cmd(TIM3, ENABLE);