stm32嵌入式系统与应用习题4

一、选择题

1. 定时器的时基单元不包括(D )
A. 自动重载寄存器
B. 定时器计数器
C. 预分频寄存器
D. 溢出寄存器
2. 下列不属于通用定时器的是( D )
A.TIM2
B.TIM4 C TIM5
D. TIM
3. 下列属于高级通用定时器的是(A )
A.TIM1
B.TIM4 C TIM5
D. TIM7
4. 带互补输出功能的定时器是(A )
A. 高级定时器
B. 通用定时器
C. 基本定时器
5. 没有捕获 / 比较功能的定时器是(C )
A. 高级定时器
B. 通用定时器
C. 基本定时器

二、填空题

1. STM32 通用定时器的 16 位计数器可以采用三种方式工作, 向上计数模式、向下计数模式、中央 对齐计数模式
2. STM32 定时器具备 16 位可编程预分频器,时钟频率的分频系数为 65535 之间的任意数值。
3. 当定时器使用 GPIO 引脚实现输出比较产生 PWM IO 引脚必须设置为 复用输出 模式。
4. STM32F103 芯片有 2 个普通定时器。
5. 除去看门狗定时器和系统定时器的八个定时器, STM32F103 分成 3 类,分别为 基本定时器 、
高级定时器 和 通用定时器。
6. SysTick 定时器是 24 位的。
7. 可以使用定时器的输入 捕获 来测量输入脉冲信号频率。
8. TIM_TimeBaseInit ) 函数的功能是 初始化时基单元
9. STM32 的定时器是 16 位定时器。

三、简答题

1. STM32F103 微控制器定时器的类型有哪几种? STM32F103 微控制器不同类型的定时器有什么区别?

类型

编号

总线

功能

高级定时器

TIM1TIM8

APB2

拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能

通用定时器

TIM2TIM3TIM4TIM5

APB1

拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能

基本定时器

TIM6TIM7

APB1

拥有定时中断、主模式触发DAC的功能

2. STM32F103 微控制器通用定时器的常用工作模式有哪些?

1. 单脉冲模式(One-pulse Mode):定时器在接收到触发事件后,产生一个单脉冲信号,并停止计数。
2. 自由运行模式:定时器持续运行,不受外部事件的影响,周期性地产生中断或更新事件。
3. 输入捕获模式:定时器用于测量输入信号的脉冲宽度或输入信号与定时器时钟之间的时间间隔。
4. 输出比较模式:定时器与一个或多个输出通道配合使用,比较计数器的值与预设的比较值,根据比较结果控制输出信号的状态。
5. PWM 模式:定时器通过设置占空比控制输出信号的脉冲宽度,用于产生 PWM 信号。
3. 简述 STM32 定时器的计数器模式。
• 上升计数模式(Up Counting Mode):计数器从 0 开始递增,直到达到最大值(通常是定时器的自动重装载    
   值),然后重新从 0 开始计数。这是最常用的计数模式。
• 下降计数模式(Down Counting Mode):计数器从设定的初始值开始递减,直到达到 0,然后重新从初始值开    
   始计数。
• 中央对齐模式(Center-aligned Mode):计数器在上升和下降之间交替计数,并在达到最大值和最小值时反 
  向计数。这种模式可以用于产生对称的脉冲信号或实现高级的 PWM 控制。

四、程序设计题

1.使用stm32f103c8t6设计程序,使用定时器在 PA2 端口输出 f=2Hz,占空比 q=2/3 的方波。

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟
TIM_TimeBaseStructure.TIM_Period = 49999; // 设置自动重装载值,频率为2Hz
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 设置预分频值,时钟频率为72MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 上升计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 配置通道1为PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 33333; // 设置占空比为2/3
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE); // 启动定时器2
TIM_CtrlPWMOutputs(TIM2, ENABLE); // 使能PWM输出
2 设计程序,使用定时器 TIMER2 的通道 CHANNEL_1 实现输入捕获。
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟
// 配置TIMER2为输入捕获模式
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿触发
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_Cmd(TIM2, ENABLE); // 启动定时器2
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); // 使能通道1的输入捕获中断

3.通过定时器TIM3 完成定时功能使 LED 闪烁间隔为 1s,写出定时器初始化函数和中断函数即可。

// 配置定时器TIM3
TIM_TimeBaseStructure.TIM_Period = 9999;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

// 定时器TIM3的中断服务程序
void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
    {
        GPIOC->ODR ^= GPIO_Pin_13; // 翻转LED的状态
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除中断标志位
     }
 }

其他试题:

stm32嵌入式系统与应用习题 2-优快云博客

stm32嵌入式系统与应用习题1-优快云博客

stm32嵌入式系统与应用习题3-优快云博客

stm32嵌入式系统与应用习题4-优快云博客

### 关于STM32F103的学习资源习题 #### 一、学习资料概述 STM32F103系列属于STMicroelectronics推出的基于ARM Cortex-M3内核的微控制器家族,具有高性能、低功耗的特点,在嵌入式领域广泛应用。以下是关于该芯片的一些重要学习方向及其参考资料: - **硬件基础** STM32F103的核心架构涉及Cortex-M3处理器特性[^1]。了解其外设配置(如GPIO、UART、I2C、SPI等)是入门的关键。 - **软件开发环境** 使用官方提供的HAL库或LL库可以简化底层驱动程序编写过程。例如,`HAL_I2C_Master_Transmit()` 函数用于实现I2C总线上的主机发送操作[^2]。 - **项目实践** 实践案例通常围绕具体应用场景展开,比如LED控制、按键扫描、OLED显示、传感器数据采集等。这些实例有助于理解理论知识的实际运用。 --- #### 二、推荐练习题及示例代码 ##### 1. GPIO基本操作 通过设置引脚高低电平来点亮外部连接的LED灯泡。 ```c #include "stm32f1xx_hal.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1){ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 切换PA5状态 HAL_Delay(500); // 延时500ms } } static void MX_GPIO_Init(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_5; // 配置PA5 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` ##### 2. UART串口通信 利用USART模块完成简单的字符收发功能。 ```c #include "stm32f1xx_hal.h" #define USARTx_TX_PIN GPIO_PIN_9 #define USARTx_RX_PIN GPIO_PIN_10 #define USARTx_PORT GPIOA uint8_t receivedData; void SystemClock_Config(void); static void MX_USART1_UART_Init(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1){ if(HAL_OK == HAL_UART_Receive(&huart1,&receivedData,1,10)){ HAL_UART_Transmit(&huart1,&receivedData,1,10); } } } // 初始化USART1 static void MX_USART1_UART_Init(void){ huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&huart1); } static void MX_GPIO_Init(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = USARTx_TX_PIN | USARTx_RX_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(USARTx_PORT, &GPIO_InitStruct); } ``` ##### 3. I2C驱动SSD1306 OLED屏 展示如何借助I2C协议操控显示屏并打印字符串。 ```c #include "stm32f1xx_hal.h" #include "u8g2.h" U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, GPIO_PIN_X, GPIO_PIN_Y, GPIO_PIN_Z); void SystemClock_Config(void); static void MX_I2C1_Init(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); u8g2.begin(); while (1){ u8g2.firstPage(); do{ u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(0, 10, "Hello World!"); }while(u8g2.nextPage()); HAL_Delay(1000); } } static void MX_I2C1_Init(void){ hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; HAL_I2C_Init(&hi2c1); } ``` --- #### 三、进一步扩展建议 除了上述基础实验之外,还可以尝试更复杂的课题,如下所示: - 设计一个温度监控系统,结合DS18B20数字温度传感器获取实时温湿度信息并通过LCD屏幕呈现出来; - 开发基于定时器中断机制的任务调度框架模拟RTOS行为模式; - 将W25Q128 SPI Flash存储单元接入电路板中保存用户自定义参数或者固件升级包文件等内容[^3]; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值