[嵌⼊式系统设计(基于STM32F4)][徐灵飞][习题解答](9)
《嵌⼊式系统设计(基于STM32F429)》
第9章课后题参考答案
1.STM32F429定时器的计数⽅式有__递增计数__、__递减计数_、___中⼼对齐_。
2.STM32F429计数寄存器是__TIMx_CNT __,⾃动重载寄存器是__TIMx_ARR) _,预分频寄存器是__TIMx_PSC __。3.若TIM x_PSC=4,则时钟源的预分频系数是____5____。
4.若TIM x_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波,在边沿⽐较模式下,当TIM x_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);
/*-------------------第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);
14.编程序,使⽤TIM2检测外部⼀未知时钟的频率。
答:
信号从TIM2的通道1 输⼊。使⽤的引脚是PA5。
(1)定时器初始化
void TIM_Config_IC(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/*-------------------第1步--------------------*/
//使能TIM2和相关GPIO时钟
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/*-------------------第2步--------------------*/
//配置输⼊通道引脚
GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_TIM2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
float upGPIO_Init(GPIOA, &GPIO_InitStructure);
/*-------------------第3步--------------------*/
//初始化定时器测量时钟
TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF;
// 定时器时钟源TIMxCLK = HCLK/2=90MHz
// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz
TIM_TimeBaseStructure.TIM_Prescaler = 90-1;
// 计数⽅式
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
// 采样时钟分频
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
// 初始化定时器TIMx, x[1,8]
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/*-------------------第4步--------------------*/
//设置输⼊捕获通道
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//捕抓到上降延时,把计数寄存器中的值所存到CCR2寄存器TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//⼀对⼀连接
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
/*-------------------第5步--------------------*/
//选择定时器复位触发源
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); // 选择从模式: 复位模式
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
/*-------------------第6步--------------------*/
//开启定时器中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 设置中断组为0
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // 设置中断来源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// 设置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 设置⼦优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); //使能捕获/⽐较1中断请求
/*-------------------第7步--------------------*/
TIM_Cmd(TIM2, ENABLE);//使能定时器。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。