对之前的手动上电进行了优化改进,配置了两个GPIO输入输出,外部硬件进行连接,从而实现输出给输入供电。采集1024个数据。
程序框架理解:
先进入主函数,对外设及设备时钟等初始化;ADC、SOC、GPIO初始化,GPIO1上升沿触发XINT2,计数加一;进while循环;ADC开始转化一次,结果存放至ADCRESULT寄存器中,再放至数组;然后翻转函数TOGGLE翻转GPIO1变为低电平,延时2ms,再变为高电平;XINT2再次触发,计数加一;ADC开始转化一次,结果存放至ADCRESULT寄存器中,再放至数组。and so on.
转换至1024个数据时跳出循环,程序结束。
(本人刚开始接触DSP,还有很多不懂的地方,欢迎各位大佬只进行指点 ///~-~\)
复制代码
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#include "driverlib.h" #include "device.h" uint16_t a1[1024] = {0}; uint16_t a2[1024] = {0}; uint16_t a3[1024] = {0}; uint16_t a4[1024] = {0}; uint16_t a5[1024] = {0}; uint16_t a6[1024] = {0}; uint16_t i = 0 ,j = 0 ; uint16_t p = 0 ,q = 0 ; uint16_t u = 0 ,v = 0 ; void initADCs(void); void initADCSOCs(void); void initExintGPIO(void); interrupt void xint2ISR(void); int testCount=0; void main(void) { Device_init(); //初始化设备时钟和外设 Device_initGPIO(); //禁用引脚锁并启用内部上拉 Interrupt_initModule(); //初始化PIE并清除PIE寄存器。禁用CPU中断。 Interrupt_initVectorTable(); //用指向shell中断的指针初始化PIE向量表ISR服务程序。 // 初始化ADC,初始化SOC为软件触发。 initADCs(); initADCSOCs(); initExintGPIO(); EINT; //打开全局中断 ERTM; //当使用仿真器调试时 开启DEBUG中断 while(1) { // 等待ADC转换完成,并清除中断标志位 while(ADC_getInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1) == false) { } ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1); while(ADC_getInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1) == false) { } ADC_clearInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1); while(ADC_getInterruptStatus(ADCC_BASE, ADC_INT_NUMBER1) == false) { } ADC_clearInterruptStatus(ADCC_BASE, ADC_INT_NUMBER1); // 储存结果 a1[i++] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0); // if(i >= sizeof(a1) / sizeof(a1[0])) //(400/4=100)同i>=100,此方法不用修改两处,只用将定义数组处的数组内数据随意修改即可。 if(i >= 1024) { i=0; } a2[j++] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER1); if(j >= 1024) { j=0; } a3[p++] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER0); if(p >= 1024) { p=0; } a4[q++] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER1); if(q >= 1024) { q=0; ESTOP0; } a5[u++] = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER0); if(u >= 1024) { u=0; } a6[v++] = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER1); if(v >= 1024) { v=0; } GPIO_togglePin(1); DEVICE_DELAY_US(2000); GPIO_togglePin(1); } } // 初始化ADC void initADCs(void) { // ADC使用片内参考3.3V // Setup VREF as internal ADC_setVREF(ADCA_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V); ADC_setVREF(ADCB_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V); ADC_setVREF(ADCC_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V); // ADC时钟4分频 // Set ADCCLK divider to /4 ADC_setPrescaler(ADCA_BASE, ADC_CLK_DIV_4_0); ADC_setPrescaler(ADCB_BASE, ADC_CLK_DIV_4_0); ADC_setPrescaler(ADCC_BASE, ADC_CLK_DIV_4_0); // 设置转换结束时触发中断 // Set pulse positions to late ADC_setInterruptPulseMode(ADCA_BASE, ADC_PULSE_END_OF_CONV); ADC_setInterruptPulseMode(ADCB_BASE, ADC_PULSE_END_OF_CONV); ADC_setInterruptPulseMode(ADCC_BASE, ADC_PULSE_END_OF_CONV); // 启动AD并延迟1ms // Power up the ADCs and then delay for 1 ms ADC_enableConverter(ADCA_BASE); ADC_enableConverter(ADCB_BASE); ADC_enableConverter(ADCC_BASE); DEVICE_DELAY_US(1000); //在ADC转换前要延迟一段时间 } void initExintGPIO(void) { Interrupt_register(INT_XINT2, &xint2ISR); Interrupt_enable(INT_XINT2); // 使能 XINT2 中断 GPIO_setPinConfig(GPIO_15_GPIO15); // GPIO15 复用为GPIO功能 GPIO_setDirectionMode(15, GPIO_DIR_MODE_IN); // GPIO15 设置为输入 GPIO_setQualificationMode(15, GPIO_QUAL_SYNC); //GPIO15 的时钟周期同系统时钟周期 GPIO_writePin(1, 0); //GPIO1 为输出。从低电平开始 GPIO_setPinConfig(GPIO_1_GPIO1); GPIO_setDirectionMode(1, GPIO_DIR_MODE_OUT); GPIO_setInterruptPin(15, GPIO_INT_XINT2); // XINT2 connected to GPIO15 // GPIO_setInterruptType(GPIO_INT_XINT2, GPIO_INT_TYPE_FALLING_EDGE); //下降沿 GPIO_setInterruptType(GPIO_INT_XINT2, GPIO_INT_TYPE_RISING_EDGE); // XINT2 对应GPIO 15 ,上升沿触发(因为电压起初是低电平) GPIO_enableInterrupt(GPIO_INT_XINT2); //使能XINT2 中断 GPIO_writePin(1, 1); // Raise GPIO1, trigger XINT2 } interrupt void xint2ISR(void) { testCount++; Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1); } // 初始化ADCSOC void initADCSOCs(void) { // 采样窗口持续10个系统时钟 ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_GPIO, ADC_CH_ADCIN0, 10); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_GPIO, ADC_CH_ADCIN1, 10); // 设置中断为ADCINT1,并启用 ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER1); ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1); // 采样窗口持续10个系统时钟 ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_GPIO, ADC_CH_ADCIN0, 10); ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_GPIO, ADC_CH_ADCIN1, 10); // 设置中断为ADCINT1,并启用 ADC_setInterruptSource(ADCB_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER1); ADC_enableInterrupt(ADCB_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1); // 采样窗口持续10个系统时钟 ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_GPIO, ADC_CH_ADCIN15, 10); ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_GPIO, ADC_CH_ADCIN15, 10); // 设置中断为ADCINT1,并启用 ADC_setInterruptSource(ADCC_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER1); ADC_enableInterrupt(ADCC_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCC_BASE, ADC_INT_NUMBER1); }
过程中的一些问题:
1. 中断函数中不能出现延时函数以及死循环!
2. 翻转函数起初放到了中断中,导致ADC采集无法进行;
3. 将翻转函数重新添加至主函数中,由于若翻转一次即,将GPIO高电平转为低电平,此后无法再触发中断,因此需要再添加一个翻转将低电平变为高电平,从而触发ADC开始转换。
最后
以上就是暴躁服饰最近收集整理的关于F280049M ADC外部触发GPIO(改进)的全部内容,更多相关F280049M内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复