stm32f103简易示波器切换挡位
时间: 2024-12-29 15:25:13 浏览: 9
### 实现STM32F103简易示波器的挡位切换
在STM32F103系列微控制器上实现简易示波器的过程中,挡位切换是一个重要的功能。这允许用户调整采样率和显示比例,从而更好地观察不同频率范围内的信号。
#### 挡位切换的设计思路
为了实现挡位切换,通常会采用不同的时间间隔来进行ADC采集,并通过按键或其他输入设备改变这些参数。具体来说:
- **硬件部分**:使用外部按键或旋钮来触发挡位变化事件。
- **软件部分**:编写程序逻辑处理来自按键的中断请求,更新全局变量以反映新的设置;随后修改定时器配置以及DMA传输周期等关联操作[^1]。
#### 关键技术点
##### ADC + DMA 配合工作模式下的高效数据获取
当涉及到高速连续的数据收集时,直接由CPU轮询查询状态不仅效率低下而且占用过多资源。因此,在此场景下推荐使用DMA (Direct Memory Access),它可以在不打断主处理器工作的前提下自动完成内存到外设之间的大量数据搬运任务。这样就能确保即使是在高负载情况下也能稳定可靠地记录电压值的变化情况[^2]。
##### 定时器用于精确控制采样时刻
为了让每次测量都发生在固定的时间节点上,可以借助于定时器产生的PWM脉冲作为启动条件之一。每当到达预设好的时间节点之后就会发出一次触发指令给模数转换模块开始新一轮的工作流程。与此同时还可以根据实际需求灵活调节计数值大小进而达到动态调整扫描速度的效果[^3]。
#### 代码实例展示
下面给出一段简化版的C语言源码片段用来说明上述概念是如何体现在具体的编程实践中去的:
```c
#include "stm32f1xx_hal.h"
//定义几个常用的常量宏
#define SAMPLE_RATE_LOW 1000U /*低速档每秒采样次数*/
#define SAMPLE_RATE_MID 5000U /*中速档每秒采样次数*/
#define SAMPLE_RATE_HIGH 20000U /*高速档每秒采样次数*/
volatile uint8_t g_nSampleRate = SAMPLE_RATE_LOW; //默认初始为最低速率
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM2_Init(uint32_t sample_rate);
/* 用户自定义函数 */
void Change_Sample_Rate(uint32_t new_sample_rate){
if(new_sample_rate != g_nSampleRate){
__HAL_TIM_DISABLE(&htim2); //先关闭旧设定
switch(new_sample_rate){
case SAMPLE_RATE_LOW :
MX_TIM2_Init(SAMPLE_RATE_LOW);
break;
case SAMPLE_RATE_MID :
MX_TIM2_Init(SAMPLE_RATE_MID);
break;
case SAMPLE_RATE_HIGH:
MX_TIM2_Init(SAMPLE_RATE_HIGH);
break;
default: ;
}
HAL_Delay(1); //等待一段时间再开启新设定
__HAL_TIM_ENABLE(&htim2);
g_nSampleRate = new_sample_rate; //最后才更改全局变量的内容
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
while (1)
{
//在此处加入其他必要的业务逻辑...
}
}
```
这段代码展示了如何根据不同档次的选择重新初始化定时器`TIM2`的相关参数,以此来间接影响最终形成的图像分辨率高低差异。同时注意到了保护措施的存在,即只有确认当前所选选项确实发生了变动才会执行后续一系列较为耗时的操作过程。
阅读全文