《嵌入式系统设计(基于STM32F429)》
第9章课后题参考答案
1.STM32F429定时器的计数方式有__递增计数__、__递减计数_、___中心对齐_。
2.STM32F429计数寄存器是__TIMx_CNT __,自动重载寄存器是__TIMx_ARR) _,预分频寄存器是__TIMx_PSC __。
3.若TIMx_PSC=4,则时钟源的预分频系数是____5____。
4.若TIMx_ARR=89,则一次计数溢出的计数次数是___90_____。
5.什么是PWM信号?什么是占空比?请绘图举例。
答:
PWM(Pulse 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=8,TIM2_ARR=49,则计数溢出一次,时间为多长?怎么计算?
答:
(TIM2_PSC+1)*(TIM2_ARR +1)/ 90000000 = 9 * 50 / 90000000 = 5us
11.使用内部时钟时,怎么确定各定时器的时钟基准频率?
答:
除非APB的分频系数是1,否则通用定时器的时钟等于APB时钟的2倍。
默认调用SystemInit函数情况下:
SYSCLK=180M
AHB时钟=180M
APB1时钟=45M,APB2时钟=90M
APB分频系数分别是4和2
所以,定时器时钟是相应挂载总线时钟的2倍。
12.编程序,使用TIM1产生1s的定时。
答:
TIM1挂载在APB2总线上,在系统时钟=180MH时,PCLK2=90MHz,TIM1的内部时钟源= PCLK2*2=180MHz。
Tout(定时时间)=1s=(ARR+1)(PSC+1)/1800000000,则可以取PSC=18000-1,ARR=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);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论