外观
四、代码介绍
总体概述
项目使用STM32F407VET6作为主控芯片,代码使用HAL库、STM32Cubemx进行图形化配置+Keil5进行编译,用户仅需关注逻辑代码实现即可。
该项目代码并不复杂,整个项目结构可分为四个部分,按键扫描、波形输出、波形自检、示波器输入;每个部分各司其职,尽量不相互传递参数,实现起来就比较简单了;相关屏幕数据的显示这里不做介绍,都是调用显示字符串与显示汉字函数实现的。
按键扫描&处理
按键处理比较简单,先扫描三个按键的状态,需注意这里有对按键长短按、双击进行判断,随后返回对应的值即可,由于我们波形输出、波形自检、示波器输入均需要使用按键,这里是采用分任务的思维,每个任务独立去对按键结果仅处理的,而不是一个处理结果给多个任务进行使用。
C
/*
函数内容:按键扫描
函数参数:无
返回值:按键1、2、3长按、双击、单击值
*/
uint8_t key_scanf(void)
{
uint8_t ret = KEY_ERROR; //按键返回值
static uint8_t keyCnt[3] = {0}; //用于按键计时消抖
static uint8_t keyFcnt[3] = {0}; //用于判断按键多久间隔算双击
static uint8_t keyCount[3] = {0}; //按键按下的次数
static uint8_t keyLongFlag[3] = {0}; //按键长按标志位,只有初级进入时判断长按才有效
if(GET_KEY1_IN == GPIO_PIN_RESET){
keyCnt[KEY1]++; //计时变量,记录按键按下低电平时间
if(keyCnt[KEY1] >= 120){
//防止数据越界
keyCnt[KEY1] = 120;
}
}
if(GET_KEY1_IN == GPIO_PIN_SET)
{
//如果按键抬起
if((keyCnt[KEY1] >= 100) && (keyLongFlag[KEY1] == 0)){
//按键大于1s且之前没有多击,证明是长按
ret = Key1LongPress;
}
else if(keyCnt[KEY1] >= 2)
{
//按键按下时间大于20ms,证明是一次按下
keyCount[KEY1]++; //按键按下的次数增加
keyFcnt[KEY1] = DOUBLE_TIME; //在300ms内再次按下算双击
keyLongFlag[KEY1] = 1; //已经有一次短按了,才能等待多击结束后才可长按
}
keyCnt[KEY1] = 0;
if(keyFcnt[KEY1])
{
keyFcnt[KEY1]--; //间隔时间不断减少
if(keyFcnt[KEY1] <= 0)
{
//间隔时间到了
if(keyCount[KEY1] == 1){
//单击
ret = Key1Press;
}
else if(keyCount[KEY1] ==2){
//双击
ret = Key1DoublePress;
}
keyFcnt[KEY1] = 0;
keyCount[KEY1] = 0;
keyLongFlag[KEY1] = 0;
}
}
}
if(GET_KEY2_IN == GPIO_PIN_RESET){
keyCnt[KEY2]++; //计时变量,记录按键按下低电平时间
if(keyCnt[KEY2] >= 120){
//防止数据越界
keyCnt[KEY2] = 120;
}
}
if(GET_KEY2_IN == GPIO_PIN_SET)
{
//如果按键抬起
if((keyCnt[KEY2] >= 100) && (keyLongFlag[KEY2] == 0)){
//按键大于1s且之前没有多击,证明是长按
ret = Key2LongPress;
}
else if(keyCnt[KEY2] >= 2)
{
//按键按下时间大于20ms,证明是一次按下
keyCount[KEY2]++; //按键按下的次数增加
keyFcnt[KEY2] = DOUBLE_TIME; //在300ms内再次按下算双击
keyLongFlag[KEY2] = 1; //已经有一次短按了,才能等待多击结束后才可长按
}
keyCnt[KEY2] = 0;
if(keyFcnt[KEY2])
{
keyFcnt[KEY2]--; //间隔时间不断减少
if(keyFcnt[KEY2] <= 0)
{
//间隔时间到了
if(keyCount[KEY2] == 1){
//单击
ret = Key2Press;
}
else if(keyCount[KEY2] ==2){
//双击
ret = Key2DoublePress;
}
keyFcnt[KEY2] = 0;
keyCount[KEY2] = 0;
keyLongFlag[KEY2] = 0;
}
}
}
if(GET_KEY3_IN == GPIO_PIN_RESET){
keyCnt[KEY3]++; //计时变量,记录按键按下低电平时间
if(keyCnt[KEY3] >= 120){
//防止数据越界
keyCnt[KEY3] = 120;
}
}
if(GET_KEY3_IN == GPIO_PIN_SET)
{
//如果按键抬起
if((keyCnt[KEY3] >= 100) && (keyLongFlag[KEY3] == 0)){
//按键大于1s且之前没有多击,证明是长按
ret = Key3LongPress;
}
else if(keyCnt[KEY3] >= 2)
{
//按键按下时间大于20ms,证明是一次按下
keyCount[KEY3]++; //按键按下的次数增加
keyFcnt[KEY3] = DOUBLE_TIME; //在300ms内再次按下算双击
keyLongFlag[KEY3] = 1; //已经有一次短按了,才能等待多击结束后才可长按
}
keyCnt[KEY3] = 0;
if(keyFcnt[KEY3])
{
keyFcnt[KEY3]--; //间隔时间不断减少
if(keyFcnt[KEY3] <= 0)
{
//间隔时间到了
if(keyCount[KEY3] == 1){
//单击
ret = Key3Press;
}
else if(keyCount[KEY3] ==2){
//双击
ret = Key3DoublePress;
}
keyFcnt[KEY3] = 0;
keyCount[KEY3] = 0;
keyLongFlag[KEY3] = 0;
}
}
}
return ret;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
波形输出任务
波形输出任务中,会对输出波形进行切换、以及放大倍数进行切换,同时,也会显示对应的频率。在该任务中,会去读取按键值,随后对AD9834以及模拟开关进行对应的切换。详细的代码会有点长,此处仅展示部分,重点介绍该任务做了什么。
C
/*
函数内容:波形输出任务按键处理
函数参数:keyValue - 按键值
返回值:无
*/
void waveOutTask_keyHandle(uint8_t keyValue,uint8_t *cur_task)
{
static uint8_t setState = 0; //是否进入设置状态
switch(keyValue)
{
case Key1Press:
{
if(task_index == out_wave_index)
{
//切换波形输出
if(out_wave_info == Square_Wave)
{
out_wave_info = Sine_Wave;
}
else if(out_wave_info == Triangle_Wave)
{
out_wave_info = Square_Wave;
}
else if(out_wave_info == Sine_Wave)
{
out_wave_info = Triangle_Wave;
}
}
else if(task_index == out_freq_index)
{
//减少输出频率
if(out_freq_info > FREQ_MIN){
out_freq_info-=500;
}
if(out_freq_info <= 0)
{
out_freq_info = FREQ_MIN;
}
}
else if(task_index == gain_factor_index)
{
//切换增益倍数
if(gain_factor == Magnification_2){
gain_factor = Magnification_4;
}
else{
gain_factor = Magnification_2;
}
}
setMagnification(gain_factor); //设置放大输出
AD9834_Select_Wave(out_wave_info); //设置输出波形
AD9834_Set_Freq(FREQ_0, out_freq_info); //设置输出频率
waveOutTask_Show(task_index); //修改显示内容
}
break;
case Key1DoublePress:
{
if(task_index == out_wave_index)
{
//切换波形输出
if(out_wave_info == Square_Wave)
{
out_wave_info = Triangle_Wave;
}
else if(out_wave_info == Triangle_Wave)
{
out_wave_info = Sine_Wave;
}
else if(out_wave_info == Sine_Wave)
{
out_wave_info = Square_Wave;
}
}
else if(task_index == out_freq_index)
{
//减少输出频率
if(out_freq_info > FREQ_MIN){
out_freq_info-=1000;
}
if(out_freq_info <= 0)
{
out_freq_info= FREQ_MIN;
}
}
else if(task_index == gain_factor_index)
{
//切换增益倍数
if(gain_factor == Magnification_2){
gain_factor = Magnification_4;
}
else{
gain_factor = Magnification_2;
}
}
setMagnification(gain_factor); //设置放大输出
AD9834_Select_Wave(out_wave_info); //设置输出波形
AD9834_Set_Freq(FREQ_0, out_freq_info); //设置输出频率
waveOutTask_Show(task_index); //修改显示内容
}
break;
case Key1LongPress:
break;
case Key2Press:
{
//切换设置选项
task_index++;
if(task_index == unselected_index)
{
//如果是切换到最末尾,就回到最开始
task_index = gain_factor_index;
}
waveOutTask_Show(task_index); //修改显示内容
}
break;
case Key2DoublePress:
{
if(setState == 0){
//进入设置状态,为增益倍数选项
setState++;
task_index = gain_factor_index;
waveOutTask_Show(task_index); //修改显示内容
}
else
{
//退出设置状态,为不选中选项
setState = 0;
task_index = unselected_index;
waveOutTask_Show(task_index); //修改显示内容
}
}
break;
case Key2LongPress:
{
//退出设置状态,为不选中选项
setState = 0;
task_index = unselected_index;
*cur_task = PAGE_SEL_TASK;
pageSel_Show();
}
break;
case Key3Press:
{
if(task_index == out_wave_index)
{
//切换波形输出
if(out_wave_info == Square_Wave)
{
out_wave_info = Triangle_Wave;
}
else if(out_wave_info == Triangle_Wave)
{
out_wave_info = Sine_Wave;
}
else if(out_wave_info == Sine_Wave)
{
out_wave_info = Square_Wave;
}
}
else if(task_index == out_freq_index)
{
//增加输出频率
if(out_freq_info < FREQ_MAX)
{
out_freq_info+=500;
}
if(out_freq_info >= FREQ_MAX)
{
out_freq_info = FREQ_MAX;
}
}
else if(task_index == gain_factor_index)
{
//切换增益倍数
if(gain_factor == Magnification_2){
gain_factor = Magnification_4;
}
else{
gain_factor = Magnification_2;
}
}
setMagnification(gain_factor); //设置放大输出
AD9834_Select_Wave(out_wave_info); //设置输出波形
AD9834_Set_Freq(FREQ_0, out_freq_info); //设置输出频率
waveOutTask_Show(task_index); //修改显示内容
}
break;
case Key3DoublePress:
{
if(task_index == out_wave_index)
{
//切换波形输出
if(out_wave_info == Square_Wave)
{
out_wave_info = Triangle_Wave;
}
else if(out_wave_info == Triangle_Wave)
{
out_wave_info = Sine_Wave;
}
else if(out_wave_info == Sine_Wave)
{
out_wave_info = Square_Wave;
}
}
else if(task_index == out_freq_index)
{
//增加输出频率
if(out_freq_info < FREQ_MAX)
{
out_freq_info+=1000;
}
if(out_freq_info >= FREQ_MAX)
{
out_freq_info = FREQ_MAX;
}
}
else if(task_index == gain_factor_index)
{
//切换增益倍数
if(gain_factor == Magnification_2){
gain_factor = Magnification_4;
}
else{
gain_factor = Magnification_2;
}
}
setMagnification(gain_factor); //设置放大输出
AD9834_Select_Wave(out_wave_info); //设置输出波形
AD9834_Set_Freq(FREQ_0, out_freq_info); //设置输出频率
waveOutTask_Show(task_index); //修改显示内容
}
break;
case Key3LongPress:
break;
default:
break;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
波形自检任务
波形自检任务中,延用波形输出任务的参数,支持对波形进行切换,以及显示输出的频率,与之不同的是,波形自检是控制模拟开关使信号输入到adc引脚中,通过单片机采集数据,然后转化成为波形显示在屏幕上,以此进行简单观察,看输出与输入是否一致。
C
/*
函数内容:adc输入任务按键处理
函数参数:keyValue - 按键值
返回值:无
*/
void adcInTask_keyHandle(uint8_t keyValue,uint8_t *cur_task)
{
static uint8_t setState = 0; //是否进入设置状态
switch(keyValue)
{
case Key1Press:
{
if(task_index == out_wave_index)
{
//切换波形输出
if(out_wave_info == Triangle_Wave)
{
out_wave_info = Sine_Wave;
}
else if(out_wave_info == Sine_Wave)
{
out_wave_info = Triangle_Wave;
}
}
else if(task_index == out_freq_index)
{
//减少输出频率
if(out_freq_info > FREQ_MIN){
out_freq_info-=500;
}
if(out_freq_info <= 0)
{
out_freq_info = FREQ_MIN;
}
}
else if(task_index == gain_factor_index)
{
//切换增益倍数
if(gain_factor == Magnification_2){
gain_factor = Magnification_4;
}
else{
gain_factor = Magnification_2;
}
}
set_adcSamplingTime(out_freq_info); //根据频率设置采样率
setMagnification(gain_factor); //设置放大输出
AD9834_Select_Wave(out_wave_info); //设置输出波形
AD9834_Set_Freq(FREQ_0, out_freq_info); //设置输出频率
adcInTask_Show(task_index); //修改显示内容
}
break;
case Key1DoublePress:
{
if(task_index == out_wave_index)
{
//切换波形输出
if(out_wave_info == Triangle_Wave)
{
out_wave_info = Sine_Wave;
}
else if(out_wave_info == Sine_Wave)
{
out_wave_info = Triangle_Wave;
}
}
else if(task_index == out_freq_index)
{
//减少输出频率
if(out_freq_info > FREQ_MIN){
out_freq_info-=1000;
}
if(out_freq_info <= 0)
{
out_freq_info = FREQ_MIN;
}
}
else if(task_index == gain_factor_index)
{
//切换增益倍数
if(gain_factor == Magnification_2){
gain_factor = Magnification_4;
}
else{
gain_factor = Magnification_2;
}
}
set_adcSamplingTime(out_freq_info); //根据频率设置采样率
setMagnification(gain_factor); //设置放大输出
AD9834_Select_Wave(out_wave_info); //设置输出波形
AD9834_Set_Freq(FREQ_0, out_freq_info); //设置输出频率
adcInTask_Show(task_index); //修改显示内容
}
break;
case Key1LongPress:
break;
case Key2Press:
{
//切换设置选项
task_index++;
if(task_index == unselected_index)
{
//如果是切换到最末尾,就回到最开始
task_index = gain_factor_index;
}
adcInTask_Show(task_index); //修改显示内容
}
break;
case Key2DoublePress:
{
if(setState == 0){
//进入设置状态,为增益倍数选项
setState++;
task_index = gain_factor_index;
adcInTask_Show(task_index); //修改显示内容
}
else
{
//退出设置状态,为不选中选项
setState = 0;
task_index = unselected_index;
adcInTask_Show(task_index); //修改显示内容
}
}
break;
case Key2LongPress:
{
//退出设置状态,为不选中选项
setState = 0;
task_index = unselected_index;
*cur_task = PAGE_SEL_TASK;
pageSel_Show();
}
break;
case Key3Press:
{
if(task_index == out_wave_index)
{
//切换波形输出
if(out_wave_info == Triangle_Wave)
{
out_wave_info = Sine_Wave;
}
else if(out_wave_info == Sine_Wave)
{
out_wave_info = Triangle_Wave;
}
}
else if(task_index == out_freq_index)
{
//增加输出频率
if(out_freq_info < FREQ_MAX)
{
out_freq_info+=500;
}
if(out_freq_info >= FREQ_MAX)
{
out_freq_info = FREQ_MAX;
}
}
else if(task_index == gain_factor_index)
{
//切换增益倍数
if(gain_factor == Magnification_2){
gain_factor = Magnification_4;
}
else{
gain_factor = Magnification_2;
}
}
set_adcSamplingTime(out_freq_info); //根据输出频率设置采样率
setMagnification(gain_factor); //设置放大输出
AD9834_Select_Wave(out_wave_info); //设置输出波形
AD9834_Set_Freq(FREQ_0, out_freq_info); //设置输出频率
adcInTask_Show(task_index); //修改显示内容
}
break;
case Key3DoublePress:
{
if(task_index == out_wave_index)
{
//切换波形输出
if(out_wave_info == Triangle_Wave)
{
out_wave_info = Sine_Wave;
}
else if(out_wave_info == Sine_Wave)
{
out_wave_info = Triangle_Wave;
}
}
else if(task_index == out_freq_index)
{
//增加输出频率
if(out_freq_info < FREQ_MAX)
{
out_freq_info+=1000;
}
if(out_freq_info >= FREQ_MAX)
{
out_freq_info = FREQ_MAX;
}
}
else if(task_index == gain_factor_index)
{
//切换增益倍数
if(gain_factor == Magnification_2){
gain_factor = Magnification_4;
}
else{
gain_factor = Magnification_2;
}
}
set_adcSamplingTime(out_freq_info); //根据输出频率设置采样率
setMagnification(gain_factor); //设置放大输出
AD9834_Select_Wave(out_wave_info); //设置输出波形
AD9834_Set_Freq(FREQ_0, out_freq_info); //设置输出频率
adcInTask_Show(task_index); //修改显示内容
}
break;
case Key3LongPress:
break;
default:
break;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
示波器任务
示波器任务与波形自检任务类似,此时是检测外部输入信号然后进行采集显示,需要通过控制数字电位器对外部信号进行放大缩小,使其能够被adc良好的采样转换到。
C
/*
* 函数内容:示波器波形数据显示
* 函数参数:无
* 返回值: 无
*/
void osc_waveShow(void)
{
uint16_t i = 0,t = 0;
int16_t prePos = 0; //前一个点坐标
float v_max = 0,v_min = 999;
if(osc_complete_flag == 1)
{
//如果adc数据采集完成了
for(i=0;i<ADC_NUM;i++)
{
//将adc数据转换为电压值并放大20倍,3.3V变成66,方便绘制波形
adc_value[i] = (adc_value[i] * 3.3f * 20) / 4095.0f;
if(v_min > adc_value[i]){
v_min = adc_value[i];
}
else if(v_max < adc_value[i]){
v_max = adc_value[i];
}
adc_value[i] = 95 - adc_value[i];
}
for(i=100;i<ADC_NUM;i++)
{
//得到一个起始波形位置
if((adc_value[i] < volThreshold) && (adc_value[i+2] > volThreshold))
{
if(i > (ADC_NUM - wave_width))
{
t = 100;
}
else
{
t = i;
}
break;
}
}
for(i=0;i<wave_width;i++)
{
//获取显示波形数据,从起始波形位置开始
newWave[i] = adc_value[t+i];
}
prePos = newWave[0];
for(i=1;i<wave_width-2;i++)
{
TFT_DrawLine(i,oldWave[i],i+1,oldWave[i+1],BLACK); //清除上一个线段
TFT_DrawLine(i,prePos,i+1,newWave[i],GREEN); //显示当前线段
prePos = newWave[i];
}
for(i=1;i<wave_width;i++)
{
//记录上一次波形数据
oldWave[i] = newWave[i-1];
}
maxVol = v_max / 20.0f;
minVol = v_min / 20.0f;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
主函数处理
大部分初始化操作cubemx已经帮我们处理完成了,这里对屏幕、ad9834、定时器、adc等外设进行初始化以及启动,随后在主循环中,通过按键扫描进行任务切换或显示处理。
C
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t keyValue = 0; //按键扫描值
uint8_t cur_task = PAGE_SEL_TASK; //当前任务为页面选择任务
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_DAC_Init();
MX_SPI1_Init();
MX_TIM3_Init();
MX_TIM4_Init();
MX_ADC2_Init();
/* USER CODE BEGIN 2 */
TFT_Init(); //初始化屏幕
pageSel_Show(); //页面选择显示
AD9834_Init(); //初始化ad9834
HAL_TIM_Base_Start_IT(&htim3); //开始消息定时器倒计时
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 400); //设置1.799v输出进行迟滞比较
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(keyTimer >= 10)
{
keyTimer = 0;
//每隔10ms扫描按键
keyValue = key_scanf();
}
if(cur_task == WAVE_OUT_TASK)
{
//如果是波形输出任务
if(keyValue != KEY_ERROR){
HAL_TIM_Base_Stop_IT(&htim3); //停止消息定时器倒计时
waveOutTask_keyHandle(keyValue,&cur_task);
keyValue = KEY_ERROR;
__HAL_TIM_SET_COUNTER(&htim3,0);
HAL_TIM_Base_Start_IT(&htim3); //开始消息定时器倒计时
}
}
else if(cur_task == ADC_IN_TASK)
{
if(adcInTimer>= 100)
{
//波形自检显示时间间隔--100ms
HAL_TIM_Base_Stop_IT(&htim3); //停止消息定时器倒计时
adcInTimer = 0;
adc_waveShow();
__HAL_TIM_SET_COUNTER(&htim3,0);
HAL_TIM_Base_Start_IT(&htim3); //开始消息定时器倒计时
}
//如果是ADC波形输入检测任务
if(keyValue != KEY_ERROR){
//进入按键处理前先关闭dma采集,并清除数据
HAL_ADC_Stop_DMA(&hadc1);
Clear_adcShowData();
HAL_TIM_Base_Stop_IT(&htim3); //停止消息定时器倒计时
adcInTask_keyHandle(keyValue,&cur_task);
keyValue = KEY_ERROR;
//处理完成,重新开始采集
adcInTimer = 0;
Register_adcShowData();
__HAL_TIM_SET_COUNTER(&htim3,0);
HAL_TIM_Base_Start_IT(&htim3); //开始消息定时器倒计时
}
}
else if(cur_task == PAGE_SEL_TASK)
{
//如果是页面切换任务
if(keyValue != KEY_ERROR){
HAL_TIM_Base_Stop_IT(&htim3); //停止消息定时器倒计时
pageSelTask_keyHandle(keyValue,&cur_task);
keyValue = KEY_ERROR;
__HAL_TIM_SET_COUNTER(&htim3,0);
HAL_TIM_Base_Start_IT(&htim3); //开始消息定时器倒计时
}
}
else if(cur_task == OSC_IN_TASK)
{
if(oscInTimer >= 100)
{
//示波器波形显示间隔时间--100ms
HAL_TIM_Base_Stop_IT(&htim3); //停止消息定时器倒计时
oscInTimer = 0;
drawNetwork(); //画网格
if(osc_state == 0){
osc_waveShow();
}
osc_showInfo();
__HAL_TIM_SET_COUNTER(&htim3,0);
HAL_TIM_Base_Start_IT(&htim3); //开始消息定时器倒计时
}
//如果是示波器任务
if(keyValue != KEY_ERROR){
HAL_TIM_Base_Stop_IT(&htim3); //停止消息定时器倒计时
oscInTask_keyHandle(keyValue,&cur_task);
keyValue = KEY_ERROR;
__HAL_TIM_SET_COUNTER(&htim3,0);
HAL_TIM_Base_Start_IT(&htim3); //开始消息定时器倒计时
}
}
}
/* USER CODE END 3 */
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135