1 #include "hw_config.h"
2
3 // <<< Use Configuration Wizard in Context Menu >>>
4
5 // <e> 电源控制(PWR)
6 // <h> 电源控制寄存器 (PWR_CR) 3.4.1
7 // <o1.8> DBP:取消后备区域的写保护
8 // <i> 在复位后,RTC和后备寄存器处于被保护状态以防意外写入。
9 // <i> 设置这位允许写入这些寄存器。
10 // <i> 0:禁止写入RTC和后备寄存器
11 // <i> 1:允许写入RTC和后备寄存器
12
13 // <o1.5..7> PLS[2:0]:PVD电平选择
14 // <0=> 2.2V <1=> 2.3V <2=> 2.4V <3=> 2.5V
15 // <4=> 2.6V <5=> 2.7V <6=> 2.8V <7=> 2.9V
16 // <i> 这些位用于选择电源电压监测器的电压阀值
17 // <i> 000:2.2V
18 // <i> 001:2.3V
19 // <i> 010:2.4V
20 // <i> 011:2.5V
21 // <i> 100:2.6V
22 // <i> 101:2.7V
23 // <i> 110:2.8V
24 // <i> 111:2.9V
25 // <i> 注:详细说明参见数据手册中的电气特性部分。
26
27 // <o1.4> PVDE:电源电压监测器(PVD)使能
28 // <i> 0:禁止PVD
29 // <i> 1:开启PVD
30
31 // <o1.3> CSBF:清除待机位
32 // <i> 始终读出为0
33 // <i> 0:无功效
34 // <i> 1:清除SBF待机位(写)
35
36 // <o1.2> CWUF:清除唤醒位
37 // <i> 始终读出为0
38 // <i> 0:无功效
39 // <i> 1:2个系统时钟周期后清除WUF唤醒位(写)
40
41 // <o1.1> PDDS:掉电深睡眠
42 // <i> 与LPDS位协同操作
43 // <i> 0:当CPU进入深睡眠时进入停机模式,调压器的状态由LPDS位控制。
44 // <i> 1:CPU进入深睡眠时进入待机模式。
45
46 // <o1.0> LPDS:深睡眠下的低功耗
47 // <i> PDDS=0时,与PDDS位协同操作
48 // <i> 0:在停机模式下电压调压器开启
49 // <i> 1:在停机模式下电压调压器处于低功耗模式
50
51 // </h>
52
53
54 // <h> 电源控制/状态寄存器 (RCC_CSR) 3.4.1
55 // <o2.8> EWUP:使能WKUP管脚
56 // <i> 0:WKUP管脚为通用I/O。WKUP管脚上的事件不能将CPU从待机模式唤醒
57 // <i> 1:WKUP管脚用于将CPU从待机模式唤醒,WKUP管脚被强置为输入下拉的配
58 // <i> 置(WKUP管脚上的上升沿将系统从待机模式唤醒)
59 // <i> 注:在系统复位时清除这一位。
60
61 // <o2.2> PVDO:PVD输出
62 // <i> 当PVD被PVDE位使能后该位才有效
63 // <i> 0:VDD高于由PLS[2:0]选定的PVD阀值
64 // <i> 1:VDD低于由PLS[2:0]选定的PVD阀值
65 // <i> 注:在待机模式下PVD被停止。因此,待机模式后或复位后,直到设置PVDE位之前,该位为0。
66
67 // <o2.1> SBF:待机标志
68 // <i> 该位由硬件设置,并只能由POR/PDR(上电/掉电复位)或设置电源控制寄存器
69 // <i> (PWR_CR)的CSBF位清除。
70 // <i> 0:系统不在待机模式
71 // <i> 1:系统进入待机模式
72
73 // <o2.0> WUF:唤醒标志
74 // <i> 该位由硬件设置,并只能由POR/PDR(上电/掉电复位)或设置电源控制寄存器
75 // <i> (PWR_CR)的CWUF位清除。
76 // <i> 0:没有发生唤醒事件
77 // <i> 1:在WKUP管脚上发生唤醒事件或出现RTC闹钟事件。
78 // <i> 注:当WKUP管脚已经是高电平时,在(通过设置EWUP位)使能WKUP管脚时,会检测
79 // <i> 到一个额外的事件。
80
81 // </h>
82 // </e>
83
84 #define PWR_SETUP 1
85 #define PWR_CR_Val 0x04000083
86 #define PWR_CFGR_Val 0x00000100
87
88
89 // <e> 复位与时间控制(RCC、RST)
90 // <h> 时钟控制寄存器 (RCC_CR) 4.3.1
91 // <o1.26> PLLRDY:PLL时钟就绪标志
92 // <i> PLL锁定后由硬件置1,
93 // <i> 0:PLL未锁定 1:PLL锁定
94 // <o1.25> PLLON:PLL使能
95 // <i> 由软件置1或清零。当进入待机和停止模式时,该位由硬件清零。
96 // <i> 当PLL时钟被用作或被选择将要作为系统时钟时,该位不能被清零。
97 // <i> 0:PLL关闭 1:PLL使能
98 // <o1.19> CSSON:时钟安全系统使能
99 // <i> 使能时钟监测器。
100 // <i> 0:时钟监测器关闭
101 // <i> 1:如果外部1-25MHz时钟就绪,时钟监测器开启。
102 // <o1.18> HSEBYP:外部高速时钟旁路
103 // <i> 在调试模式下由软件置1或清零来旁路外部晶体振荡器。只有在外部1-
104 // <i> 25MHz振荡器关闭的情况下,该位才可以写入。
105 // <i> 0:外部1-25MHz振荡器没有旁路
106 // <i> 1:外部1-25MHz外部晶体振荡器被旁路。
107 // <o1.17> HSERDY:外部高速时钟就绪标志
108 // <i> 由硬件置1来指示外部时钟已经稳定。在HSEON位清零后,该位需要
109 // <i> 6个外部时钟周期清零。
110 // <i> 0:外部1-25MHz时钟没有就绪
111 // <i> 1:外部1-25MHz时钟就绪
112 // <o1.16> HSEON:外部高速时钟使能
113 // <i> 由软件置1或清零。当进入待机和停止模式时,该位由硬件清零,关
114 // <i> 闭外部时钟。当外部时钟被用作或被选择将要作为系统时钟时,该位不能被清零。
115 // <i> 0:HSE振荡器关闭
116 // <i> 1:HSE振荡器开启
117 // <o1.8..15> HSICAL[7:0]:内部高速时钟校准 <0-255>
118 // <i> 在系统启动时,这些位被自动初始化
119 // <o1.3..7> HSITRIM[4:0]:内部高速时钟调整 <0-31>
120 // <i> 由软件写入来调整内部高速时钟,它们被叠加在HSICAL[5:0]数值上。
121 // <i> 这些位在HSICAL[7:0]的基础上,让用户可以输入一个调整数值,根
122 // <i> 据电压和温度的变化调整内部HSI RC振荡器的频率。
123 // <i> 默认数值为16,在TA= 25°C时这个默认的数值可以把HSI调整到
124 // <i> 8MHz;增大HSICAL的数值则增大HSI RC振荡器的频率,反之则减
125 // <i> 小RC振荡器的频率;每步HSICAL的变化调整约40kHz。
126 // <o1.1> HSIRDY:内部高速时钟就绪标志
127 // <i> 由硬件置1来指示内部8MHz时钟已经稳定。在HSION位清零后,该位
128 // <i> 需要6个内部时钟周期清零。
129 // <i> 0:内部8MHz时钟没有就绪
130 // <i> 1:内部8MHz时钟就绪
131 // <o1.0> HSION:内部高速时钟使能
132 // <i> 由软件置1或清零。
133 // <i> 当从待机和停止模式返回或用作系统时钟的外部1-25MHz时钟发生故
134 // <i> 障时,该位由硬件置1来启动内部8MHz的RC振荡器。当内部8MHz时
135 // <i> 钟被直接或间接地用作或被选择将要作为系统时钟时,该位不能被清零。
136 // <i> 0:内部8MHz时钟关闭
137 // <i> 1:内部8MHz时钟开启
138 // </h>
139 //
140 // <h> 时钟配置寄存器 (RCC_CFGR) 4.3.2
141 // <o2.24..26> MCO 微控制器时钟输出
142 // <0=> 没有时钟输出 <4=> 系统时钟输出 <5=> 内部8MHz的RC振荡器时钟输出
143 // <6=> 外部1-25MHz振荡器时钟输出 <7=> PLL时钟2分频后输出
144 // <i> 由软件置1或清零。
145 // <i> 0xx: 没有时钟输出
146 // <i> 100: 系统时钟输出
147 // <i> 101: 内部8MHz的RC振荡器时钟输出
148 // <i> 110: 外部1-25MHz振荡器时钟输出
149 // <i> 111: PLL时钟2分频后输出
150 // <i> 注意:- 该时钟输出在启动和切换MCO时钟源时可能会被截断。
151 // <i> - 在系统时钟作为输出时钟时,请保证输出时钟频率不超过50MHz (IO口最高频率)
152 // <o2.22> USBPRE:USB预分频
153 // <i> 由软件设置来产生48MHz的USB时钟。在RCC_APB1ENR寄存器中使能USB时
154 // <i> 钟之前,必须保证该位已经有效。如果USB时钟被使能,该位可以被清零。
155 // <i> 0:PLL时钟1.5倍分频作为USB时钟
156 // <i> 1:PLL时钟直接作为USB时钟
157 // <o2.18..21> PLLMUL:PLL倍频系数
158 // <0=> PLL 2倍频输出 <1=> PLL 3倍频输出 <2=> PLL 4倍频输出 <3=> PLL 5倍频输出
159 // <4=> PLL 6倍频输出 <5=> PLL 7倍频输出 <6=> PLL 8倍频输出 <7=> PLL 9倍频输出
160 // <8=> PLL 10倍频输出 <9=> PLL 11倍频输出 <10=> PLL 12倍频输出 <11=> PLL 13倍频输出
161 // <12=> PLL 14倍频输出 <13=> PLL 15倍频输出 <14=> PLL 16倍频输出 <15=> PLL 16倍频输出
162 // <i> 由软件设置来确定PLL倍频系数。只有在PLL关闭的情况下才可被写入。
163 // <i> 注意:PLL的输出频率不能超过72MHz
164 // <i> 0000:PLL 2倍频输出
165 // <i> 0001:PLL 3倍频输出
166 // <i> 0010:PLL 4倍频输出
167 // <i> 0011:PLL 5倍频输出
168 // <i> 0100:PLL 6倍频输出
169 // <i> 0101:PLL 7倍频输出
170 // <i> 0110:PLL 8倍频输出
171 // <i> 0111:PLL 9倍频输出
172 // <i> 1000:PLL 10倍频输出
173 // <i> 1001:PLL 11倍频输出
174 // <i> 1010:PLL 12倍频输出
175 // <i> 1011:PLL 13倍频输出
176 // <i> 1100:PLL 14倍频输出
177 // <i> 1101:PLL 15倍频输出
178 // <i> 1110:PLL 16倍频输出
179 // <i> 1111:PLL 16倍频输出
180 // <o2.17> PLLXTPRE:HSE分频器作为PLL输入
181 // <i> 由软件设置来分频HSE后作为PLL输入时钟。该位只有在PLL关闭时才可以被写入。
182 // <i> 0:HSE不分频
183 // <i> 1:HSE 2分频
184 // <o2.16> PLLSRC:PLL输入时钟源
185 // <i> 由软件设置来选择PLL输入时钟源。该位只有在PLL关闭时才可以被写入。
186 // <i> 0:HSI时钟2分频后作为PLL输入时钟
187 // <i> 1:HSE时钟作为PLL输入时钟。
188 // <o2.14..15> ADCPRE:ADC预分频
189 // <i> 由软件设置来确定ADC时钟频率
190 // <i> 00:PCLK2 2分频后作为ADC时钟
191 // <i> 01:PCLK2 4分频后作为ADC时钟
192 // <i> 10:PCLK2 6分频后作为ADC时钟
193 // <i> 11:PCLK2 8分频后作为ADC时钟
194 // <o2.11..13> PPRE2:高速APB预分频(APB2)
195 // <0=> HCLK不分频 <4=> HCLK 2分频 <5=> HCLK 4分频 <6=> HCLK 8分频 <7=> HCLK 16分频
196 // <i> 由软件设置来控制高速APB2预分频系数。
197 // <i> 0xx:HCLK不分频
198 // <i> 100:HCLK 2分频
199 // <i> 101:HCLK 4分频
200 // <i> 110:HCLK 8分频
201 // <i> 111:HCLK 16分频
202 // <o2.8..10> PPRE1:低速APB预分频(APB1)
203 // <0=> HCLK不分频 <4=> HCLK 2分频 <5=> HCLK 4分频 <6=> HCLK 8分频 <7=> HCLK 16分频
204 // <i> 由软件设置来控制低速APB1预分频系数。软件必须保证APB1时钟频率不超过36MHz。
205 // <i> 0xx:HCLK不分频
206 // <i> 100:HCLK 2分频
207 // <i> 101:HCLK 4分频
208 // <i> 110:HCLK 8分频
209 // <i> 111:HCLK 16分频
210 // <o2.4..7> HPRE: AHB预分频
211 // <0=> SYSCLK不分频 <8=> SYSCLK 2分频 <9=> SYSCLK 4分频 <10=> SYSCLK 8分频 <11=> SYSCLK 16分频
212 // <12=> SYSCLK 64分频 <13=> SYSCLK 128分频 <14=> SYSCLK 256分频 <15=> SYSCLK 512分频
213 // <i> 由软件设置来控制AHB预分频系数。
214 // <i> 0xxx:SYSCLK不分频
215 // <i> 1000:SYSCLK 2分频
216 // <i> 1001:SYSCLK 4分频
217 // <i> 1010:SYSCLK 8分频
218 // <i> 1011:SYSCLK 16分频
219 // <i> 1100:SYSCLK 64分频
220 // <i> 1101:SYSCLK 128分频
221 // <i> 1110:SYSCLK 256分频
222 // <i> 1111:SYSCLK 512分频
223 // <i> 注意:当AHB时钟的预分频系数大于1时,必须保持预取缓冲器开启。详见读闪存存储器一节。
224 // <o2.2..3> SWS:系统时钟切换状态
225 // <0=> HSI作为系统时钟 <1=> HSE作为系统时钟 <2=> PLL输出作为系统时钟 <3=> 不可用
226 // <i> 由硬件置1和清零来指示哪一个时钟源被作为系统时钟。
227 // <i> 00:HSI作为系统时钟
228 // <i> 01:HSE作为系统时钟
229 // <i> 10:PLL输出作为系统时钟
230 // <i> 11:不可用
231 // <o2.0..1> SW:系统时钟切换
232 // <0=> HSI作为系统时钟 <1=> HSE作为系统时钟 <2=> PLL输出作为系统时钟 <3=> 不可用
233 // <i> 由软件设置来选择系统时钟源。
234 // <i> 在从停止或待机模式中返回时或直接或间接作为系统时钟的HSE出现故障时,由
235 // <i> 硬件强制选择HSI作为系统时钟(如果时钟安全系统已经启动)
236 // <i> 00:HSI作为系统时钟
237 // <i> 01:HSE作为系统时钟
238 // <i> 10:PLL输出作为系统时钟
239 // <i> 11:不可用
240 // </h>
241 // <h> 时钟中断寄存器 (RCC_CIR) 4.3.3
242 // <o3.23> CSSC:时钟安全系统中断清除
243 // <i> 由软件置1来清除CSSF安全系统中断标志位CSSF。
244 // <i> 在清除操作完成后,该位由硬件复位。
245 // <i> 0: CSSF安全系统中断标志位未清零
246 // <i> 1: CSSF安全系统中断标志位清零
247 //
248 // <o3.20> PLLRDYC:PLL就绪中断清除
249 // <i> 由软件置1来清零PLL就绪中断标志位PLLRDYF。
250 // <i> 在清除操作完成后,该位由硬件复位。
251 // <i> 0: PLL就绪中断标志位PLLRDYF未清零
252 // <i> 1: PLL就绪中断标志位PLLRDYF清零
253 //
254 // <o3.19> HSERDYC:HSE就绪中断清除
255 // <i> 由软件置1来清零HSE就绪中断标志位HSERDYF。
256 // <i> 在清除操作完成后,该位由硬件复位。
257 // <i> 0: HSE就绪中断标志位HSERDYF未清零
258 // <i> 1: HSE就绪中断标志位HSERDYF清零
259 //
260 // <o3.18> HSIRDYC HSI就绪中断清除
261 // <i> 由软件置1来清零HSI就绪中断标志位HSIRDYF。
262 // <i> 在清除操作完成后,该位由硬件复位。
263 // <i> 0: HSI就绪中断标志位HSIRDYF未清零
264 // <i> 1: HSI就绪中断标志位HSIRDYF清零
265 //
266 // <o3.17> LSERDYC:LSE就绪中断清除
267 // <i> 由软件置1来清零LSE就绪中断标志位LSERDYF。
268 // <i> 在清除操作完成后,该位由硬件复位。
269 // <i> 0: LSE就绪中断标志位LSERDYF未清零
270 // <i> 1: LSE就绪中断标志位LSERDYF清零
271 //
272 // <o3.16> LSIRDYC:LSI就绪中断清除
273 // <i> 由软件置1来清零LSI就绪中断标志位LSIRDYF。
274 // <i> 在清除操作完成后,该位由硬件复位。
275 // <i> 0: LSI就绪中断标志位LSIRDYF未清零
276 // <i> 1: LSI就绪中断标志位LSIRDYF清零
277 //
278 // <o3.12> PLLRDYIE:PLL就绪中断使能
279 // <i> 由软件置1或清零来使能或关闭PLL就绪中断
280 // <i> 0:PLL就绪中断关闭
281 // <i> 1:PLL就绪中断使能
282 //
283 // <o3.11> HSERDYIE:HSE就绪中断使能
284 // <i> 由软件置1或清零来使能或关闭外部1-25MHz振荡器就绪中断
285 // <i> 0:HSE就绪中断关闭
286 // <i> 1:HSE就绪中断使能
287 //
288 // <o3.10> HSIRDYIE:HSI就绪中断使能
289 // <i> 由软件置1或清零来使能或关闭内部8MHz RC振荡器就绪中断
290 // <i> 0:HSI就绪中断关闭
291 // <i> 1:HSI就绪中断使能
292 //
293 // <o3.9> LSERDYIE:LSE就绪中断使能
294 // <i> 由软件置1或清零来使能或关闭外部40kHz RC振荡器就绪中断
295 // <i> 0:LSE就绪中断关闭
296 // <i> 1:LSE就绪中断使能
297 //
298 // <o3.8> LSIRDYIE:LSI就绪中断使能
299 // <i> 由软件置1或清零来使能或关闭内部40kHz RC振荡器就绪中断
300 // <i> 0:LSI就绪中断关闭
301 // <i> 1:LSI就绪中断使能
302 //
303 // <o3.7> CSSF:时钟安全系统中断标志
304 // <i> 由软件通过置1 CSSC位来清零
305 // <i> 在外部1-25MHz振荡器时钟出现故障时,由硬件置1
306 // <i> 0:无HSE时钟失效安全系统中断
307 // <i> 1:产生HSE时钟失效安全系统中断
308 //
309 // <o3.4> PLLRDYF:PLL就绪中断标志
310 // <i> 由软件通过置1 PLLRDYC位来清零
311 // <i> 在PLL就绪且PLLRDYIE位被置1时,由硬件置1
312 // <i> 0:无PLL就绪中断
313 // <i> 1:产生PLL就绪中断
314 //
315 // <o3.3> HSERDYF:HSE就绪中断标志
316 // <i> 由软件通过置1 HSERDYC位来清零
317 // <i> 在外部低速时钟就绪且HSERDYIE位被置1时,由硬件置1
318 // <i> 0:无外部1-25MHz振荡器就绪中断
319 // <i> 1:产生外部1-25MHz振荡器就绪中断
320 //
321 // <o3.2> HSIRDYF:HSI就绪中断标志
322 // <i> 由软件通过置1 HSIRDYC位来清零
323 // <i> 在内部高速时钟就绪且HSIRDYIE位被置1时,由硬件置1
324 // <i> 0:无内部8MHz RC振荡器就绪中断
325 // <i> 1:产生内部8MHz RC振荡器就绪中断
326 //
327 // <o3.1> LSERDYF:LSE就绪中断标志
328 // <i> 由软件通过置1 LSERDYC位来清零
329 // <i> 在外部低速时钟就绪且LSERDYIE位被置1时,由硬件置1
330 // <i> 0:无外部32kHz振荡器就绪中断
331 // <i> 1:产生外部32kHz振荡器就绪中断
332 //
333 // <o3.0> LSIRDYF:LSI就绪中断标志
334 // <i> 由软件通过置1 LSIRDYC位来清零
335 // <i> 在内部低速时钟就绪且LSIRDYIE位被置1时,由硬件置1
336 // <i> 0:无内部40kHz RC振荡器就绪中断
337 // <i> 1:产生内部40kHz RC振荡器就绪中断
338 //
339 //
340 // </h>
341 // <h> APB2外设复位寄存器 (RCC_APB2RSTR) 4.3.4
342 // <o4.14> USART1RST:USART1复位
343 // <i> 由软件置1或清零
344 // <i> 0:无效
345 // <i> 1:复位USART1
346 //
347 // <o4.12> SPI1RST:SPI1复位
348 // <i> 由软件置1或清零
349 // <i> 0:无效
350 // <i> 1:复位SPI1
351 //
352 // <o4.11> TIM1RST:TIM1复位
353 // <i> 由软件置1或清零
354 // <i> 0:无效
355 // <i> 1:复位TIM1
356 //
357 // <o4.10> ADC2RST:ADC2复位
358 // <i> 由软件置1或清零
359 // <i> 0:无效
360 // <i> 1:复位ADC2
361 //
362 // <o4.9> ADC1RST:ADC1复位
363 // <i> 由软件置1或清零
364 // <i> 0:无效
365 // <i> 1:复位ADC1
366 //
367 // <o4.6> IOPERST:IO口E复位
368 // <i> 由软件置1或清零
369 // <i> 0:无效
370 // <i> 1:复位IO口E
371 //
372 // <o4.5> IOPDRST:IO口D复位
373 // <i> 由软件置1或清零
374 // <i> 0:无效
375 // <i> 1:复位IO口D
376 //
377 // <o4.4> IOPCRST:IO口C复位
378 // <i> 由软件置1或清零
379 // <i> 0:无效
380 // <i> 1:复位IO口C
381 //
382 // <o4.3> IOPBRST:IO口B复位
383 // <i> 由软件置1或清零
384 // <i> 0:无效
385 // <i> 1:复位IO口B
386 //
387 // <o4.2> IOPARST:IO口A复位
388 // <i> 由软件置1或清零
389 // <i> 0:无效
390 // <i> 1:复位IO口A
391 //
392 // <o4.0> AFIORST:辅助功能IO复位
393 // <i> 由软件置1或清零
394 // <i> 0:无效
395 // <i> 1:复位辅助功能
396 //
397 // </h>
398 //
399 //
400 // <h> APB1外设复位寄存器 (RCC_APB1RSTR) 4.3.5
401 // <o5.28> PWRRST:电源复位
402 // <i> 由软件置1或清零
403 // <i> 0:无效
404 // <i> 1:复位电源电路
405 //
406 // <o5.27> BKPRST:备份复位
407 // <i> 由软件置1或清零
408 // <i> 0:无效
409 // <i> 1:复位备份电路
410 //
411 // <o5.25> CANRST:CAN复位
412 // <i> 由软件置1或清零
413 // <i> 0:无效
414 // <i> 1:复位CAN
415 //
416 // <o5.23> USBRST:USB复位
417 // <i> 由软件置1或清零
418 // <i> 0:无效
419 // <i> 1:复位USB
420 //
421 // <o5.22> I2C2RST:I2C 2复位
422 // <i> 由软件置1或清零
423 // <i> 0:无效
424 // <i> 1:复位I2C 2
425 //
426 // <o5.21> I2C1RST:I2C 1复位
427 // <i> 由软件置1或清零
428 // <i> 0:无效
429 // <i> 1:复位I2C 1
430 //
431 // <o5.18> USART3RST:USART3复位
432 // <i> 由软件置1或清零
433 // <i> 0:无效
434 // <i> 1:复位USART3
435 //
436 // <o5.17> USART2RST:USART2复位
437 // <i> 由软件置1或清零
438 // <i> 0:无效
439 // <i> 1:复位USART2
440 //
441 // <o5.11> WWDGRST:窗口看门狗复位
442 // <i> 由软件置1或清零
443 // <i> 0:无效
444 // <i> 1:复位窗口看门狗
445 //
446 // <o5.2> TIM4RST:定时器4复位
447 // <i> 由软件置1或清零
448 // <i> 0:无效
449 // <i> 1:复位定时器4
450 //
451 // <o5.1> TIM3RST:定时器3复位
452 // <i> 由软件置1或清零
453 // <i> 0:无效
454 // <i> 1:复位定时器3
455 //
456 // <o5.0> TIM2RST:定时器2复位
457 // <i> 由软件置1或清零
458 // <i> 0:无效
459 // <i> 1:复位定时器2
460 //
461 // </h>
462 //
463 //
464 // <h> AHB外设时钟使能寄存器 (RCC_AHBENR) 4.3.6
465 // <o6.4> FLITFEN:闪存接口电路时钟使能
466 // <i> 由软件来置1或清零来开启或关闭睡眠模式时闪存接口电路时钟。
467 // <i> 0:睡眠模式时闪存接口电路时钟关闭
468 // <i> 1:睡眠模式时闪存接口电路时钟开启
469 //
470 // <o6.2> SRAMEN:SRAM时钟使能
471 // <i> 由软件来置1或清零来开启或关闭睡眠模式时SRAM时钟。
472 // <i> 0:睡眠模式时SRAM时钟关闭
473 // <i> 1:睡眠模式时SRAM时钟开启
474 //
475 // <o6.0> DMAEN:DMA时钟使能
476 // <i> 由软件来置1或清零来开启或关闭DMA时钟。
477 // <i> 0:DMA时钟关闭
478 // <i> 1:DMA时钟开启
479 //
480 // </h>
481 // <h> APB2外设时钟使能寄存器(RCC_APB2ENR) 4.3.7
482 // <o7.14> USART1EN:USART1时钟使能
483 // <i> 由软件来置1或清零
484 // <i> 0:USART1时钟关闭
485 // <i> 1:USART1时钟开启
486 //
487 // <o7.12> SPI1EN:SPI1时钟使能
488 // <i> 由软件来置1或清零
489 // <i> 0:SPI1时钟关闭
490 // <i> 1:SPI1时钟开启
491 //
492 // <o7.11> TIM1EN:TIM1时钟使能
493 // <i> 由软件来置1或清零
494 // <i> 0:TIM1时钟关闭
495 // <i> 1:TIM1时钟开启
496 //
497 // <o7.10> ADC2EN:ADC2时钟使能
498 // <i> 由软件来置1或清零
499 // <i> 0:ADC2时钟关闭
500 // <i> 1:ADC2时钟开启
501 //
502 // <o7.9> ADC1EN:ADC1时钟使能
503 // <i> 由软件来置1或清零
504 // <i> 0:ADC1时钟关闭
505 // <i> 1:ADC1时钟开启
506 //
507 // <o7.6> IOPEEN:IO口E时钟使能
508 // <i> 由软件来置1或清零
509 // <i> 0:IO口E时钟关闭
510 // <i> 1:IO口E时钟开启
511 //
512 // <o7.5> IOPDEN:IO口D时钟使能
513 // <i> 由软件来置1或清零
514 // <i> 0:IO口D时钟关闭
515 // <i> 1:IO口D时钟开启
516 //
517 // <o7.4> IOPCEN:IO口C时钟使能
518 // <i> 由软件来置1或清零
519 // <i> 0:IO口C时钟关闭
520 // <i> 1:IO口C时钟开启
521 //
522 // <o7.3> IOPBEN:IO口B时钟使能
523 // <i> 由软件来置1或清零
524 // <i> 0:IO口B时钟关闭
525 // <i> 1:IO口B时钟开启
526 //
527 // <o7.2> IOPAEN:IO口A时钟使能
528 // <i> 由软件来置1或清零
529 // <i> 0:IO口A时钟关闭
530 // <i> 1:IO口A时钟开启
531 //
532 // <o7.0> AFIOEN:辅助功能IO时钟使能
533 // <i> 由软件来置1或清零
534 // <i> 0:辅助功能IO时钟关闭
535 // <i> 1:辅助功能IO时钟开启
536 //
537 // </h>
538 // <h> APB1外设时钟使能寄存器(RCC_APB1ENR) 4.3.8
539 // <o8.28> PWREN:电源时钟使能
540 // <i> 由软件来置1或清零
541 // <i> 0:电源时钟关闭
542 // <i> 1:电源时钟开启
543 //
544 // <o8.27> BKPEN:备份时钟使能
545 // <i> 由软件来置1或清零
546 // <i> 0:备份时钟关闭
547 // <i> 1:备份时钟开启
548 //
549 // <o8.25> CANEN:CAN时钟使能
550 // <i> 由软件来置1或清零
551 // <i> 0:CAN时钟关闭
552 // <i> 1:CAN时钟开启
553 //
554 // <o8.23> USBEN:USB时钟使能
555 // <i> 由软件来置1或清零
556 // <i> 0:USB时钟关闭
557 // <i> 1:USB时钟开启
558 //
559 // <o8.22> I2C2EN:I2C 2时钟使能
560 // <i> 由软件来置1或清零
561 // <i> 0:I2C 2时钟关闭
562 // <i> 1:I2C 2时钟开启
563 //
564 // <o8.21> I2C1EN:I2C 1时钟使能
565 // <i> 由软件来置1或清零
566 // <i> 0:I2C 1时钟关闭
567 // <i> 1:I2C 1时钟开启
568 //
569 // <o8.18> USART3EN:USART 3时钟使能
570 // <i> 由软件来置1或清零
571 // <i> 0:USART 3时钟关闭
572 // <i> 1:USART 3时钟开启
573 //
574 // <o8.17> USART2EN:USART 2时钟使能
575 // <i> 由软件来置1或清零
576 // <i> 0:USART 2时钟关闭
577 // <i> 1:USART 2时钟开启
578 //
579 // <o8.14> SPI2EN:SPI 2时钟使能
580 // <i> 由软件来置1或清零
581 // <i> 0:SPI 2时钟关闭
582 // <i> 1:SPI 2时钟开启
583 //
584 // <o8.11> WWDGEN:窗口看门狗时钟使能
585 // <i> 由软件来置1或清零
586 // <i> 0:窗口看门狗时钟关闭
587 // <i> 1:窗口看门狗时钟开启
588 //
589 // <o8.2> TIM4EN:定时器4时钟使能
590 // <i> 由软件来置1或清零
591 // <i> 0:定时器4时钟关闭
592 // <i> 1:定时器4时钟开启
593 //
594 // <o8.1> TIM3EN:定时器3时钟使能
595 // <i> 由软件来置1或清零
596 // <i> 0:定时器3时钟关闭
597 // <i> 1:定时器3时钟开启
598 //
599 // <o8.0> TIM2EN:定时器2时钟使能
600 // <i> 由软件来置1或清零
601 // <i> 0:定时器2时钟关闭
602 // <i> 1:定时器2时钟开启
603 //
604 // </h>
605 //
606 //
607 // <h> 备份域控制寄存器 (RCC_BDCR) 4.3.9
608 // <i> 备份域控制寄存器中(RCC_BDCR)的LSEON、LSEBYP、RTCSEL和
609 // <i> RTCEN位处于备份域。由此,这些位在复位后被写保护,只有在电源控制寄存器
610 // <i> (PWR_CR)中的DBP位置 1之后才能对这些位进行改动。
611 //
612 // <o9.16> BDRST:备份域软件复位
613 // <i> 由软件置1或清零
614 // <i> 0:复位未激活
615 // <i> 1:复位整个备份域
616 //
617 // <o9.15> RTCEN:RTC时钟使能
618 // <i> 由软件置1或清零
619 // <i> 0:RTC时钟关闭
620 // <i> 1:RTC时钟开启
621 //
622 // <o9.8..9> RTCSEL[1:0]:RTC时钟源选择
623 // <0=> 无时钟 <1=> LSE振荡器作为RTC时钟 <2=> LSI振荡器作为RTC时钟
624 // <3=> HSE振荡器在128分频后作为RTC时钟
625 // <i> 由软件设置来选择RTC时钟源。一旦RTC时钟源被选定,直到下次后备域被复位,它不能在
626 // <i> 被改变。可通过设置BDRST位来清除。
627 // <i> 00:无时钟
628 // <i> 01:LSE振荡器作为RTC时钟
629 // <i> 10:LSI振荡器作为RTC时钟
630 // <i> 11:HSE振荡器在128分频后作为RTC时钟
631 //
632 // <o9.2> LSEBYP:外部低速时钟振荡器旁路
633 // <i> 在调试模式下由软件置1或清零来旁路LSE。只有在外部32kHz振荡器关闭时,才能写入该位
634 // <i> 0:LSE时钟未被旁路
635 // <i> 1:LSE时钟被旁路
636 //
637 // <o9.1> LSERDY:外部低速LSE就绪
638 // <i> 由硬件置1或清零来指示是否外部32kHz振荡器就绪。在LSEON被清零后,该位需要6个外
639 // <i> 部低速振荡器的周期才被清零。
640 // <i> 0:外部32kHz振荡器未就绪
641 // <i> 1:外部32kHz振荡器就绪
642 //
643 // <o9.1> LSEON:外部低速振荡器使能
644 // <i> 由软件置1或清零。
645 // <i> 0:外部32kHz振荡器关闭
646 // <i> 1:外部32kHz振荡器开启
647 //
648 // </h>
649 //
650 //
651 // <h> 控制/状态寄存器 (RCC_CSR) 4.3.10
652 // <o10.31> LPWRRSTF:低功耗复位标志
653 // <i> 由软件通过写RMVF位清零,在低功耗管理复位发生时由硬件置1。
654 // <i> 0:无低功耗管理复位发生
655 // <i> 1:发生低功耗管理复位
656 // <i> 关于低低功耗管理复位的进一步信息,请参考低功耗管理复位章节。
657 //
658 // <o10.30> WWDGRSTF:窗口看门狗复位标志
659 // <i> 由软件通过写RMVF位清零,在窗口看门狗复位发生时由硬件置1。
660 // <i> 0:无窗口看门狗复位发生
661 // <i> 1:发生窗口看门狗复位
662 //
663 // <o10.29> IWDGRSTF:独立看门狗复位标志
664 // <i> 由软件通过写RMVF位清零,在独立看门狗复位发生时由硬件置1。
665 // <i> 0:无独立看门狗复位发生
666 // <i> 1:发生独立看门狗复位
667 //
668 // <o10.28> SFTRSTF:软件复位标志
669 // <i> 由软件通过写RMVF位清零,在软件复位发生时由硬件置1。
670 // <i> 0:无软件复位发生
671 // <i> 1:发生软件复位
672 //
673 // <o10.27> PORRSTF:上电/掉电复位标志
674 // <i> 由软件通过写RMVF位清零,在上电/掉电复位发生时由硬件置1。
675 // <i> 0:无上电/掉电复位发生
676 // <i> 1:发生上电/掉电复位
677 //
678 // <o10.26> PINRSTF:NRST管脚复位标志
679 // <i> 由软件通过写RMVF位清零,在NRST管脚复位发生时由硬件置1。
680 // <i> 0:无NRST管脚复位发生
681 // <i> 1:发生NRST管脚复位
682 //
683 // <o10.24> RMVF 清除复位标志
684 // <i> 由软件置1或清零来清除复位标志。
685 // <i> 0:保持复位标志
686 // <i> 1:清零复位标志
687 //
688 // <o10.1> LSIRDY:内部低速时钟就绪
689 // <i> 由硬件置1或清零来指示内部40kHz RC振荡器是否就绪。在LSION清零后,3个
690 // <i> 内部40kHz RC振荡器的周期后LSIRDY被清零。
691 // <i> 0:LSI(内部40kHz RC振荡器)时钟未就绪
692 // <i> 1:LSI(内部40kHz RC振荡器)时钟就绪
693 //
694 // <o10.0> LSION:内部低速振荡器使能
695 // <i> 由软件置1或清零。
696 // <i> 0:内部40kHz RC振荡器关闭
697 // <i> 1:内部40kHz RC振荡器开启
698 //
699 // </h>
700 // </e>
701
702 #define RCC_SETUP 1
703 #define RCC_CR_Val 0x00000083
704 #define RCC_CFGR_Val 0x00000000
705 #define RCC_CIR_Val 0x00000000
706 #define RCC_APB2RSTR_Val 0x00000000
707 #define RCC_APB1RSTR_Val 0x00000000
708 #define RCC_AHBENR_Val 0x00000000
709 #define RCC_APB2ENR_Val 0x00000000
710 #define RCC_APB1ENR_Val 0x00000000
711 #define RCC_BDCR_Val 0x00000000
712 #define RCC_CSR_Val 0x0C000000
713
714
715 // <e> USART通用同步异步收发器(USART)
716 // <h> 状态寄存器(USART_SR) 19.5.1
717 // <o1.9> CTS: CTS 标志
718 // <i> 如果CTSE位置位,当nCTS输入变化状态时,该位被硬件置高。由软件将其清零。如果
719 // <i> USART_CR3中的CTSIE为一,产生中断
720 // <i> 0:nCTS状态线上没有变化
721 // <i> 1:nCTS状态线上发生变化
722 //
723 // <o1.8> LBD: LIN break检测标志(状态标志)
724 // <i> 0:没有检测到LIN break
725 // <i> 1:检测到LIN break
726 // <i> 注意:若LBDIE=1,当LBD为1时要产生中断
727 //
728 // <o1.7> TXE:发送数据寄存器空
729 // <i> 当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。如果
730 // <i> USART_CR1寄存器中的TXEIE为1,则产生中断。对USART_DR的写操作,将该位清零。
731 // <i> 0:数据还没有被转移到移位寄存器
732 // <i> 1:数据已经被转移到移位寄存器
733 // <i> 注意:单缓冲器传输中使用该位
734 //
735 // <o1.6> TC: 发送完成
736 // <i> 当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,产
737 // <i> 生中断。由软件序列清除该位(先对USART_SR进行读操作,然后对USART_DR进行写操作)
738 // <i> 0:发送还未完成
739 // <i> 1:发送完成成
740
741 // <o1.5> RXNE:读数据寄存器非空
742 // <i> 当RDR移位寄存器中的数据被转移到USART_DR寄存器中,该位被硬件置位。如果
743 // <i> USART_CR1寄存器中的RXNEIE为1,中断产生。对USART_DR的读操作可以将改位清零。
744 // <i> 0:数据没有收到
745 // <i> 1:收到数据,可以读出
746 //
747 // <o1.4> IDLE:监测到IDLE总线
748 // <i> 当检测到空闲总线时,该位被硬件置位。如果USART_CR1中的IDLEIE为1,产生中断。由
749 // <i> 软件序列清除该位(先读USART_SR,然后读USART_DR)
750 // <i> 0:没有检测到空闲总线
751 // <i> 1:检测到空闲总线
752 // <i> 注意:IDLE位不会再次被置高直到RXNE位被置起(即又检测到一次空闲总线)
753 //
754 // <o1.3> ORE:过载错误
755 // <i> 当RXNE还是1的时候,当前被接收在移位寄存器中的数据要往RDR寄存器中传送时,硬件
756 // <i> 将该位置位。如果USART_CR1中的RXNEIE为1的话,产生中断。由软件序列将其清零(先读USART_SR,然后读USART_CR)
757 // <i> 0:没有过载错误
758 // <i> 1:检测到过载错误
759 // <i> 注意:该位被置位时,RDR寄存器中的值不会丢失,但是移位寄存器中的数据会被覆盖。
760 // <i> 如果EIE位被设置,在多缓冲器通信模式下,ORE标志置位会产生中断的。
761 //
762 // <o1.2> NE: 噪声错误标志
763 // <i> 在接收到的帧检测到噪音时,由硬件对该位置位。由软件序列对其清玲(先读USART_SR,再读USART_DR)
764 // <i> 0:没有检测到噪声
765 // <i> 1:检测到噪声
766 // <i> 注意:该位不会产生中断,因为它和RXNE一起出现,后者自己会在RXNE标志置位时产生
767 // <i> 中断,如果EIE位被设置,并且工作在多缓冲区通信模式下
768 //
769 // <o1.1> FE: 帧错误
770 // <i> 当检测到同步错位,过多的噪声或者检测到break符,该位被硬件置位。由软件序列将其清
771 // <i> 零(先读USART_SR,再读USART_DR)
772 // <i> 0:没有检测到帧错误
773 // <i> 1:检测到帧错误或者break符
774 // <i> 注意:该位不会产生中断,因为它和RXNE一起出现,后者自己会在RXNE标志置位时产生
775 // <i> 中断。如果当前传输的数据既产生了帧错误,又产生了过载错误,还是会继续该数据的传
776 // <i> 输,并且只有ORE位会被置位。
777 // <i> 如果EIE位被置位,在多缓冲区通信模式下,随着FE标志被置位,中断产生。
778 //
779 // <o1.0> PE: 校验错误
780 // <i> 在接收模式下,如果出现校验错误,硬件对该位置位。由软件序列对其清零(依次读
781 // <i> USART_SR和USART_DR)。如果USART_CR1中的PEIE为1,产生中断。
782 // <i> 0:没有校验错误
783 //
784 // </h>
785 //
786 //
787 // <h> 数据寄存器(USART_DR) 19.5.2
788 // <o2.0..8> DR[8:0]:数据值
789 // <i> 包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR),一个给
790 // <i> 接收用(RDR),该寄存器兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄
791 // <i> 存器之间的并行接口(参见图1)。RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。
792 // <i> 当使能校验位(USART_CR1种PCE位被置位)进行发送时,写到MSB的值(根据数据的
793 // <i> 长度不同,MSB是第7位或者第8位)会被后来的校验位该取代。
794 // <i> 当使能校验位进行接收时,读到的MSB位是接收到的校验位。
795 //
796 // </h>
797 //
798 //
799 // <h> 波特比率寄存器(USART_BRR) 19.5.3
800 // <o3.4..15> DIV_Mantissa[11:0]:USARTDIV的小数部分
801 // <i> 这12位定义了USART分频器除法因子(USARTDIV)的小数部分
802 // <o3.0..3> DIV_Fraction[3:0]:USARTDIV的整数部分
803 // <i> 这4位定义了USART分频器除法因子(USARTDIV)的整数部分
804 // </h>
805
806
807 // <h> 控制寄存器1 (USART_CR1) 19.5.4
808 // <o4.13> UE: USART使能
809 // <i> 当该位被清零,USART的分频器和输出在当前字节传输完成后停止工作,以减少功耗。该
810 // <i> 位的置起和清零,是由软件操作的。
811 // <i> 0:USART分频器和输出被禁止
812 // <i> 1:USART模块使能
813 //
814 // <o4.12> M: 字长
815 // <i> 该位定义了数据字的长度,由软件对其置位和清零操作
816 // <i> 0:一个起始位,8个数据位,n个停止位
817 // <i> 1:一个起始位,9个数据位,一个停止位
818 // <i> 注意:在数据传输过程中(发送或者接收时),不能修改这个位
819
820 // <o4.11> WAKE: 唤醒的方法
821 // <i> 这位决定了把USART唤醒的方法,由软件对该位置位或者清零。
822 // <i> 0:被空闲总线唤醒
823 // <i> 1:被地址标记唤醒
824 //
825 // <o4.10> PCE: 检验控制使能
826 // <i> 用该位来选择是否进行硬件校验控制(对于发送来说就是校验位的产生;对于接收来说就是
827 // <i> 校验位的检测)。当使能了该位,在发送数据的MSB(如果M=1,MSB就是第9位;如果
828 // <i> M=0,MSB就是第8位)插入校验位;对接收到的数据检查其校验位。软件对它置位或者清
829 // <i> 零。一旦该位被置位,当前字节传输完成后,校验控制才生效。
830 // <i> 0:校验控制被禁止
831 // <i> 1:校验控制被使能
832 //
833 // <o4.9> PS: 校验选择
834 // <i> 该位用来选择当校验控制使能后,是采用偶校验还是奇校验。软件对它置位或者清零。当前
835 // <i> 字节传输完成后,该选择生效
836 // <i> 0:偶校验
837 // <i> 1:奇校验
838
839 // <o4.8> PEIE: PE中断使能
840 // <i> 软件对该位置位或者清零
841 // <i> 0:中断被禁止
842 // <i> 1:当USART_SR中的PE为1时,产生USART中断
843
844 // <o4.7> TXEIE: 发送缓冲区空中断使能
845 // <i> 软件对该位置位或者清零
846 // <i> 0:中断被禁止
847 // <i> 1:当USART_SR中的TXE为1时,产生USART中断
848
849 // <o4.6> TCIE: 发送完成中断使能
850 // <i> 软件对该位置位或者清零
851 // <i> 0:中断被禁止
852 // <i> 1:当USART_SR中的TC为1时,产生USART中断
853
854 // <o4.5> RXNEIE: 接收缓冲区非空中断使能
855 // <i> 软件对该位置位或者清零
856 // <i> 0:中断被禁止
857 // <i> 1:当USART_SR中的ORE或者RXNE为1时,产生USART中断
858
859 // <o4.4> IDLEIE: IDLE中断使能
860 // <i> 软件对该位置位或者清零
861 // <i> 0:中断被禁止
862 // <i> 1:当USART_SR中的IDLE为1时,产生USART中断
863
864 // <o4.3> TE: 发送使能
865 // <i> 该位使能发送器。软件对该位置位或者清零
866 // <i> 0:发送被禁止
867 // <i> 1:发送被使能
868 // <i> 注意:
869 // <i> 在数据传输过程中,除了在智能卡模式下,如果TE位上有个0脉冲(即“0”之后来一个
870 // <i> “1”),会在当前数据字传输完成后,发送一个“预备状态”(空闲总线)
871 // <i> 当TE被设置后,在真正发送开始之前,有一个比特时间的延迟。
872
873 // <o4.2> RE: 接收使能
874 // <i> 软件对该位置位或者清零
875 // <i> 0:接收被禁止
876 // <i> 1:接收被使能,开始搜寻RX引脚上的起始位。
877 //
878 // <o4.1> RWU: 接收唤醒
879 // <i> 该位用来决定是否把USART置于静默模式。软件对该位置位或者清零。当唤醒序列到来
880 // <i> 时,硬件也会将其清零。
881 // <i> 0:接收器处于正常工作模式
882 // <i> 1:接收器处于静默模式
883 // <i> 注意:
884 // <i> 在把USART置于静默模式(设置RWU位)之前,USART要已经先接收了一个数据字节。否则
885 // <i> 在静默模式下,不能被空闲总线检测唤醒。
886 // <i> 当配置成地址标记检测唤醒(WAKE位为1),在RXNE位被置位时,不能用软件来修改RWU位。
887 //
888 // <o4.0> SBK: 发送断开帧
889 // <i> 使用该位来发送断开字符。软件可以对该位置位或者清零。应该由软件来置位它,然后在断
890 // <i> 开帧的停止位时,由硬件将该位复位。
891 // <i> 0:没有发送断开字符
892 // <i> 1:将要发送断开字符
893 //
894 // </h>
895 //
896 //
897 // <h> 控制寄存器2(USART_CR2) 19.5.5
898 // <o5.14> LINEN: LIN模式使能
899 // <i> 软件对该位置位或者清零。
900 // <i> 0:LIN模式被禁止
901 // <i> 1:LIN模式被使能
902 // <i> LIN模式可以用USART_CR1寄存器中的SBK位发送LIN同步breaks,以及检测LIN同步break
903 //
904 // <o5.12..13> STOP: 停止位
905 // <0=> 1个停止位 <1=> 0.5个停止位 <2=> 2个停止位 <3=> 1.5个停止位
906 // <i> 用来设置停止位的位数
907 // <i> 00:1个停止位
908 // <i> 01:0.5个停止位
909 // <i> 10:2个停止位
910 // <i> 11:1.5个停止位
911 //
912 // <o5.11> CLKEN: 时钟使能
913 // <i> 该位用来使能SCLK引脚
914 // <i> 0:SCLK引脚被禁止
915 // <i> 1:SCLK引脚被使能
916 //
917 // <o5.10> CPOL: 时钟极性
918 // <i> 用户可以用该位来选择同步模式下SLCK引脚上时钟输出的极性。和CPHA位一起配合来产
919 // <i> 生用户希望的时钟/数据的采样关系
920 // <i> 0:总线空闲时SCLK引脚上保持低电平
921 // <i> 1:总线空闲时SCLK引脚上保持高电平
922 //
923 // <o5.9> CPHA: 时钟相位
924 // <i> 用户可以用该位来选择同步模式下SLCK引脚上时钟输出的相位。和CPOL位一起配合来产
925 // <i> 生用户希望的时钟/数据的采样关系(参见图174和0)
926 // <i> 0:时钟第一个边沿进行数据捕获
927 // <i> 1:时钟第二个边沿进行数据捕获
928 //
929 // <o5.8> LBCL: 最后一位时钟脉冲
930 // <i> 使用该位来控制是否在同步模式下,在SCLK引脚上输出最后发送的那个数据字节(MSB)对
931 // <i> 应的时钟脉冲
932 // <i> 0:最后一位数据的时钟脉冲不从SCLK输出
933 // <i> 1:最后一位数据的时钟脉冲会从SCLK输出
934 // <i> 注意:最后一个数据位就是第8或者第9个发送的位(根据USART_CR1寄存器中的M位所定
935 // <i> 义的8或者9位数据帧格式)
936 //
937 // <o5.6> LBDIE: LIN break检测中断使能
938 // <i> Break中断掩码(使用break定界符来检测break)
939 // <i> 0:中断被禁止
940 // <i> 1:只要USART_SR寄存器中的LBD为1就产生中断
941 //
942 // <o5.5> LBDL: LIN break检测长度
943 // <i> 该位用来选择是11位还是10位的break检测
944 // <i> 0:10位的break检测
945 // <i> 1:11位的break检测
946 //
947 // <o5.0..3> ADD[3:0]:该USART节点的地址
948 // <i> 该位域给出这个USART节点的地址
949 // <i> 这是在多处理器通信下的静默模式中使用的,使用地址标记来唤醒某个USART设备
950 //
951 // </h>
952 //
953 //
954 // <h> 控制寄存器3(USART_CR3) 19.5.6
955 // <o6.10> CTSIE: CTS中断使能
956 // <i> 0:中断被禁止
957 // <i> 1:只要USART_SR寄存器中的CTS为1就产生中断
958 //
959 // <o6.9> CTSE: CTS使能
960 // <i> 0:CTS硬件流控制被禁止
961 // <i> 1:CTS模式使能,只有nCTS输入信号有效(拉成低电平)时才能发送数据。如果在数据传
962 // <i> 输的过程中,nCTS信号变成无效,那么发完这个数据后,传输就停止下来。如果当nCTS为
963 // <i> 无效的时候,往数据寄存器里写了数据,那么这个数据要等到nCTS有效的时候才会被发送出去。
964 //
965 // <o6.8> RTSE: RTS使能
966 // <i> 0:RTS硬件流控制被禁止
967 // <i> 1:RTS中断使能,只有接收缓冲区内有空闲的空间时才请求下一个数据。当前数据发送完
968 // <i> 成后,发送操作就需要暂停下来。如果可以接收数据了,将nRTS输出置为有效(拉至低电平)
969 //
970 // <o6.7> DMAT: DMA使能发送
971 // <i> 由软件对该位清零或者置位
972 // <i> 1:发送时的DMA模式使能
973 // <i> 0:发送时的DMA模式被禁止
974 //
975 // <o6.6> DMAR: DMA使能接收
976 // <i> 由软件对该位清零或者置位
977 // <i> 1:接收时的DMA模式使能
978 // <i> 0:接收时的DMA模式被禁止
979 //
980 // <o6.5> SCEN: 智能卡模式使能
981 // <i> 该位用来使能智能卡模式
982 // <i> 0:智能卡模式使能
983 // <i> 1:智能卡模式被禁止
984 //
985 // <o6.4> NACK:智能卡NACK使能
986 // <i> 0:校验错误出现时,不发送NACK
987 // <i> 1:校验错误出现时,发送NACK
988 //
989 // <o6.3> HDSEL:半双工选择
990 // <i> 选择单线半双工模式
991 // <i> 0:不选择半双工模式
992 // <i> 1:选择半双工模式
993 //
994 // <o6.2> IRLP:红外低功耗
995 // <i> 该位用来选择普通模式还是低功耗红外模式
996 // <i> 0:通常模式
997 // <i> 1:低功耗模式
998 //
999 // <o6.1> IREN:红外模式使能
1000 // <i> 由软件对该位清零或者置位
1001 // <i> 0:红外被禁止
1002 // <i> 1:红外使能
1003 //
1004 // <o6.0> EIE:错误中断使能
1005 // <i> 在多缓冲区通信模式下,当有帧错误、过载或者噪声错误时(USART_SR中德FE=1,或者
1006 // <i> ORE=1,或者NE=1),产生中断。
1007 // <i> 0:中断被禁止
1008 // <i> 1:只要USART_CR3中的DMAR=1,并且USART_SR中的FE=1,或者ORE=1,或者
1009 // <i> NE=1,产生中断
1010 //
1011 // </h>
1012 //
1013 //
1014 // <h> 保护时间和预分频寄存器(USART_GTPR) 19.5.7
1015 // <o7.8..15> GT[7:0]:保护时间值
1016 // <i> 该位域规定了以波特时钟为单位的保护时间的值。在智能卡模式下,需要这个功能。当保护
1017 // <i> 时间过去后,发送完成标志才被置起。
1018 //
1019 // <o7.0..7> PSC[7:0]:预分频器值
1020 // <i> - 在红外低功耗模式下:
1021 // <i> PSC[7:0]=红外低功耗波特率
1022 // <i> 对系统时钟分频已到达低功耗的频率:
1023 // <i> 源时钟被寄存器中的值(仅有8位有效)分频
1024 // <i> 00000000:保留 – 不要写入该值
1025 // <i> 00000001:对源时钟1分频
1026 // <i> 00000010:对源时钟2分频
1027 // <i> ……
1028 // <i> - 在红外的通常模式下:PSC只能设置为0000001
1029 //
1030 // <i> - 在智能卡模式下:
1031 // <i> PSC[4:0]:预分频值
1032 // <i> 对系统时钟进行分频,给智能卡提供时钟。
1033 // <i> 寄存器中给出的值(5个有效位)乘以2后,作为对源时钟的分频因子
1034 // <i> 00000:保留 – 不要写入该值
1035 // <i> 00001:对源时钟进行2分频
1036 // <i> 00010:对源时钟进行4分频
1037 // <i> 00011:对源时钟进行6分频
1038 // <i> ……
1039 // <i> 注意:位[7:5]在智能卡模式下没有意义
1040 //
1041 // </h>
1042 //
1043 // </e>
1044
1045 #define USART_SETUP 1
1046 #define USART_SR_Val 0x00000000
1047 #define USART_DR_Val 0x00000000
1048 #define USART_BRR_Val 0x00000000
1049 #define USART_CR1_Val 0x00000000
1050 #define USART_CR2_Val 0x00000000
1051 #define USART_CR3_Val 0x00000000
1052 #define USART_CTPR_Val 0x00000000
1053
1054 // <e> 串行外设接口(SPI)
1055 // <h> SPI控制寄存器1(SPI_CR1) 18.4.1
1056 // <o1.15> BIDIMODE: 双向数据模式使能
1057 // <i> 0:选择“双线双向”模式
1058 // <i> 1:选择“单线双向”模式
1059 //
1060 // <o1.14> BIDIOE: 双向模式下的输出使能
1061 // <i> 和BIDIMODE位一起决定在“单线双向”模式下数据的输出方向
1062 // <i> 0:输出禁止(只收模式)
1063 // <i> 1:输出使能(只发模式)
1064 // <i> 这个“单线”数据线在主设备端为MOSI引脚,在从设备端为MISO引脚。
1065 //
1066 // <o1.13> CRCEN: 硬件CRC校验使能
1067 // <i> 0:禁止CRC计算
1068 // <i> 1:启动CRC计算
1069 // <i> 注意:只有在SPI被禁止时(SPE=0),才能写该位,否则出错。
1070 // <i> 该位只能在全双工模式下使用。
1071
1072 // <o1.12> CRCNEXT: 下一个发送CRC
1073 // <i> 0:下一个发送的值来自发送缓冲区
1074 // <i> 1:下一个发送的值来自发送CRC寄存器
1075 // <i> 注意:最后一个数据被写入SPI_DR寄存器后应马上设置该位。该位只在全双工模式下使用。
1076 //
1077 // <o1.11> DFF: 数据帧格式
1078 // <i> 0:使用8位数据帧格式进行发送/接收
1079 // <i> 1:使用16位数据帧格式进行发送/接收
1080 // <i> 注意:只有当SPI被禁止(SPE=0)时,才能写该位,否则出错。
1081 //
1082 // <o1.10> RXONLY:只接收
1083 // <i> 该位和BIDIMODE位一起决定在“双线双向”模式下的传输方向。在多个从设备的配置中,
1084 // <i> 在未被访问的从设备上该位被置1,使得只有被访问的从设备有输出,从而不会造成数据线
1085 // <i> 上数据冲突。
1086 // <i> 0:全双工(发送和接收)
1087 // <i> 1:禁止输出(只接收模式)
1088 //
1089 // <o1.9> SSM:软件从设备管理
1090 // <i> 当SSM被置位时,NSS引脚上的电平由SSI位的值决定。
1091 // <i> 0:禁止软件从设备管理。
1092 // <i> 1:启用软件从设备管理
1093 //
1094 // <o1.8> SSI: 内部从设备选择
1095 // <i> 该位只在SSM被置位时意义:它决定了NSS引脚上的电平,在NSS引脚上操作的I/O输出无效。
1096
1097 // <o1.7> LSBFIRST:帧格式
1098 // <i> 0:先发送MSB
1099 // <i> 1:先发送LSB
1100 // <i> 注:当通信在进行时不能改变该位的值。
1101 //
1102 // <o1.6> SPE: SPI使能
1103 // <i> 0:禁止SPI设备
1104 // <i> 1:开启SPI设备
1105 //
1106 // <o1.3..5> BR[2:0]:波特率控制
1107 // <0=> fPCLK/2 <1=> fPCLK/4 <2=> fPCLK/8 <3=> fPCLK/16
1108 // <4=> fPCLK/32 <5=> fPCLK/64 <6=> fPCLK/128 <7=> fPCLK/256
1109 // <i> 000: fPCLK/2 001: fPCLK/4 010: fPCLK/8 011: fPCLK/16
1110 // <i> 100: fPCLK/32 101: fPCLK/64 110: fPCLK/128 111: fPCLK/256
1111 // <i> 当通信正在进行的时候,不能修改这些位。
1112 //
1113 // <o1.2> MSTR: 主设备选择
1114 // <i> 0:配置为从设备
1115 // <i> 1:配置为主设备
1116 // <i> 注意:当通信正在进行的时候,不能修改该位。
1117
1118 // <o1.1> CPOL: 时钟极性
1119 // <i> 0: 空闲状态时,SCK保持低电平
1120 // <i> 1: 空闲状态时,SCK保持高电平
1121 // <i> 注意:当通信正在进行的时候,不能修改该位。
1122
1123 // <o1.0> CPHA: 时钟相位
1124 // <i> 0: 数据采样从第一个时钟边沿开始
1125 // <i> 1: 数据采样从第二个时钟边沿开始
1126 // <i> 注意:当通信正在进行的时候,不能修改该位。
1127 //
1128 // </h>
1129 //
1130 // <h> SPI控制寄存器2(SPI_CR2) 18.4.2
1131 // <o2.7> TXEIE:发送缓冲区空中断使能
1132 // <i> 0:禁止TXE中断
1133 // <i> 1:允许TXE中断,当TXE标志置位时产生中断请求
1134 // <i> 注意:不要同时设置TXEIE和TXDMAEN
1135
1136 // <o2.6> RXNEIE:接收缓冲区非空中断使能
1137 // <i> 0:禁止RXNE中断
1138 // <i> 1:允许RXNE中断,当RXNE标志置位时产生中断请求
1139 // <i> 注意:不要同时设置RXEIE和RXDMAEN
1140 //
1141 // <o2.5> ERRIR:错误中断使能
1142 // <i> 当错误(CRCERR、OVR、MODF)产生时,该位控制是否产生中断
1143 // <i> 0:禁止错误中断
1144 // <i> 1:允许错误中断
1145 //
1146 // <o2.2> SSOE:SS输出使能
1147 // <i> 0:禁止在主模式下SS输出,该设备可以工作在多主设备模式
1148 // <i> 1:设备开启时,开启主模式下SS输出,该设备不能工作在多主设备模式
1149 //
1150 // <o2.1> TXDMAEN:发送缓冲区DMA使能
1151 // <i> 当该位被设置时,TXE标志一旦被置位就发出DMA请求
1152 // <i> 0:禁止发送缓冲区DMA
1153 // <i> 1:启动发送缓冲区DMA
1154 //
1155 // <o2.0> RXDMAEN:接收缓冲区DMA使能
1156 // <i> 当该位被设置时,RXNE标志一旦被置位就发出DMA请求
1157 // <i> 0:禁止接收缓冲区DMA
1158 // <i> 1:启动接收缓冲区DMA
1159 //
1160 // </h>
1161 //
1162 // <h> SPI 状态寄存器(SPI_SR) 18.4.3
1163 // <o3.7> BSY:忙标志
1164 // <i> 0:SPI不忙
1165 // <i> 1:SPI正忙于通信,或者发送缓冲非空
1166 // <i> 该位由硬件置位或者复位
1167
1168 // <o3.6> OVR:溢出标志
1169 // <i> 0:没有出现溢出错误
1170 // <i> 1:出现溢出错误
1171 // <i> 该位由硬件置位,由软件序列复位。关于软件序列的详细信息,参考章节18.3.8
1172
1173 // <o3.5> MODF:模式错误
1174 // <i> 0:没有出现模式错误
1175 // <i> 1:出现模式错误
1176 // <i> 该位由硬件置位,由软件序列复位。关于软件序列的详细信息,参考章节18.3.8
1177 //
1178 // <o3.4> CRCERR:CRC错误标志
1179 // <i> 0:收到的CRC值和SPI_RXCRCR寄存器中的值匹配
1180 // <i> 1:收到的CRC值和SPI_RXCRCR寄存器中的值不匹配
1181 // <i> 该位由硬件置位,由软件写0而复位
1182 // <i> 注意:该位只在全双工模式时有意义
1183 //
1184 // <o3.1> TXE:发送缓冲为空
1185 // <i> 0:发送缓冲非空
1186 // <i> 1:发送缓冲为空
1187 //
1188 // <o3.0> RXNE:接收缓冲非空
1189 // <i> 0:接收缓冲为空
1190 // <i> 1:接收缓冲非空
1191 //
1192 // </h>
1193 //
1194 // <h> SPI 数据寄存器(SPI_DR) 18.4.4
1195 // <o4.0..15> DR[15:0]:数据寄存器 <0-65535>
1196 // <i> 待发送或者已经收到的数据
1197 // <i> 数据寄存器对应两个缓冲区:一个用于写(发送缓冲);另外一个用于读(接收缓冲)。
1198 // <i> 写操作将写数据到发送缓冲区;读操作将返回接收缓冲区里的数据。
1199 // <i> 注意:根据SPI_CR1的DFF位对数据帧格式的选择,数据可以是8位或者16位的。要在启用
1200 // <i> SPI之前就确定好数据帧格式。
1201 // <i> 对于8位的数据,发送和接收时只会用到SPI_DR[7:0]。在接收时,SPI_DR[15:8]被强制为0。
1202 // <i> 对于16位的数据,发送和接收时会用到整个数据寄存器,即SPI_DR[15:0]。
1203 //
1204 // </h>
1205 //
1206 // <h> SPI CRC多项式寄存器(SPI_CRCPR) 18.4.5
1207 // <o5.0..15> CRCPOLY[15:0]:CRC多项式寄存器 <0-65535>
1208 // <i> 该寄存器包含了CRC计算时用到的多项式。其复位值为0x0007,根据应用要求可以做其他配置。
1209 //
1210 // </h>
1211 //
1212 // <h> SPI Rx CRC寄存器(SPI_RXCRCR) 18.4.6
1213 // <o6.0..15> RXCRC[15:0]:接收CRC寄存器 <0-65535>
1214 // <i> 在启用CRC计算的情况下,RXCRC[15:0]中包含了依据收到的字节计算的CRC数值。当
1215 // <i> SPI_CR1的CRCEN位被置位时,该寄存器被复位。CRC计算使用SPI_CRCPR中的多项式。
1216 // <i> 当数据帧格式被设置为8位时,仅低8位参与计算,并且按照CRC8的方法进行;当数据帧格
1217 // <i> 式为16位时,寄存器中的所有16位都参与计算,并且按照CRC16–CCITT的标准。
1218 // <i> 注意:当BSY标志被置位时读该寄存器,将可能读到不正确的数值。
1219 //
1220 // </h>
1221 //
1222 // <h> SPI Tx CRC寄存器(SPI_TXCRCR) 18.4.7
1223 // <o7.0..15> TXCRC[15:0]:发送CRC寄存器 <0-65535>
1224 // <i> 在启用CRC计算的情况下,TXCRC[15:0]中包含了依据将要发送的字节计算的CRC数值。当
1225 // <i> SPI_CR1中的CRCEN位被置位时,该寄存器被复位。CRC计算使用SPI_CRCPR中的多项式。
1226 // <i> 当数据帧格式被设置为8位时,仅低8位参与计算,并且按照CRC8的方法进行;当数据帧格
1227 // <i> 式为16位时,寄存器中的所有16个位都参与计算,并且按照CRC16–CCITT的标准。
1228 // <i> 注意:当BSY标志被置位时读该寄存器,将可能读到不正确的数值。
1229 //
1230 // </h>
1231 //
1232 // </e>
1233
1234 #define SPI_SETUP 1
1235 #define SPI_CR1_Val 0x0000
1236 #define SPI_CR2_Val 0x0000
1237 #define SPI_SR_Val 0x0000
1238 #define SPI_DR_Val 0x0000
1239 #define SPI_CRCPR_Val 0x0000
1240 #define SPI_RXCRCR_Val 0x0000
1241 #define SPI_TXCRCR_Val 0x0000
1242
1243 // <e> DMA 控制器(DMA)
1244 // <h> DMA中断状态寄存器(DMA_ISR) 7.4.1
1245 // <o1.27> TEIF7:通道7的传输错误标志
1246 // <i> 硬件设置这些位。在DMA_IFCR寄存器的相应位写入1可以清除这里对应的标志位。
1247 // <i> 0:在通道x没有传输错误(TE)
1248 // <i> 1:在通道x发生传输错误(TE)
1249 // <o1.23> TEIF6:通道6的传输错误标志
1250 // <o1.19> TEIF5:通道5的传输错误标志
1251 // <o1.15> TEIF4:通道4的传输错误标志
1252 // <o1.11> TEIF3:通道3的传输错误标志
1253 // <o1.7> TEIF2:通道2的传输错误标志
1254 // <o1.3> TEIF1:通道1的传输错误标志
1255 //
1256 // <o1.26> HTIF7:通道7的半传输标志
1257 // <i> 硬件设置这些位。在DMA_IFCR寄存器的相应位写入1可以清除这里对应的标志位。
1258 // <i> 0:在通道x没有半传输事件(HT)
1259 // <i> 1:在通道x产生半传输事件(HT)
1260 // <o1.22> HTIF6:通道6的半传输标志
1261 // <o1.18> HTIF5:通道5的半传输标志
1262 // <o1.14> HTIF4:通道4的半传输标志
1263 // <o1.10> HTIF3:通道3的半传输标志
1264 // <o1.6> HTIF2:通道2的半传输标志
1265 // <o1.2> HTIF1:通道1的半传输标志
1266 //
1267 // <o1.25> TCIF7:通道7的传输完成标志
1268 // <i> 硬件设置这些位。在DMA_IFCR寄存器的相应位写入1可以清除这里对应的标志位。
1269 // <i> 0:在通道x没有传输完成事件(TC)
1270 // <i> 1:在通道x产生传输完成事件(TC)
1271 // <o1.21> TCIF6:通道6的传输完成标志
1272 // <o1.17> TCIF5:通道5的传输完成标志
1273 // <o1.13> TCIF4:通道4的传输完成标志
1274 // <o1.9> TCIF3:通道3的传输完成标志
1275 // <o1.5> TCIF2:通道2的传输完成标志
1276 // <o1.1> TCIF1:通道1的传输完成标志
1277 //
1278 // <o1.24> GIF7:通道7的全局中断标志
1279 // <i> 硬件设置这些位。在DMA_IFCR寄存器的相应位写入1可以清除这里对应的标志位。
1280 // <i> 0:在通道x没有TE、HT或TC事件
1281 // <i> 1:在通道x产生TE、HT或TC事件
1282 // <o1.20> GIF6:通道6的全局中断标志
1283 // <o1.16> GIF5:通道5的全局中断标志
1284 // <o1.12> GIF4:通道4的全局中断标志
1285 // <o1.8> GIF3:通道3的全局中断标志
1286 // <o1.4> GIF2:通道2的全局中断标志
1287 // <o1.0> GIF1:通道1的全局中断标志
1288 //
1289 // </h>
1290 //
1291 //
1292 // <h> DMA中断标志清除寄存器(DMA_IFCR) 7.4.2
1293 // <o2.27> CTEIF7:清除通道7的传输错误标志
1294 // <i> 这些位由软件设置和清除。
1295 // <i> 0:不起作用
1296 // <i> 1:清除DMA_ISR寄存器中的对应TEIF标志。
1297 // <o2.23> CTEIF6:清除通道6的传输错误标志
1298 // <o2.19> CTEIF5:清除通道5的传输错误标志
1299 // <o2.15> CTEIF4:清除通道4的传输错误标志
1300 // <o2.11> CTEIF3:清除通道3的传输错误标志
1301 // <o2.7> CTEIF2:清除通道2的传输错误标志
1302 // <o2.3> CTEIF1:清除通道1的传输错误标志
1303 //
1304 // <o2.26> CHTIF7:清除通道7的半传输标志
1305 // <i> 这些位由软件设置和清除。
1306 // <i> 0:不起作用
1307 // <i> 0:清除DMA_ISR寄存器中的对应HTIF标志。
1308 // <o2.22> CHTIF6:清除通道6的半传输标志
1309 // <o2.18> CHTIF5:清除通道5的半传输标志
1310 // <o2.14> CHTIF4:清除通道4的半传输标志
1311 // <o2.10> CHTIF3:清除通道3的半传输标志
1312 // <o2.6> CHTIF2:清除通道2的半传输标志
1313 // <o2.2> CHTIF1:清除通道1的半传输标志
1314 //
1315 // <o2.25> CTCIF7:清除通道7的传输完成标志
1316 // <i> 这些位由软件设置和清除。
1317 // <i> 0:不起作用
1318 // <i> 0:清除DMA_ISR寄存器中的对应TCIF标志。
1319 // <o2.21> CTCIF6:清除通道6的传输完成标志
1320 // <o2.17> CTCIF5:清除通道5的传输完成标志
1321 // <o2.13> CTCIF4:清除通道4的传输完成标志
1322 // <o2.9> CTCIF3:清除通道3的传输完成标志
1323 // <o2.5> CTCIF2:清除通道2的传输完成标志
1324 // <o2.1> CTCIF1:清除通道1的传输完成标志
1325 //
1326 // <o2.24> CGIF7:清除通道7的全局中断标志
1327 // <i> 这些位由软件设置和清除。
1328 // <i> 0:不起作用
1329 // <i> 0:清除DMA_ISR寄存器中的对应的GIF、TEIF、HTIF和TCIF标志。
1330 // <o2.20> CGIF6:清除通道6的全局中断标志
1331 // <o2.16> CGIF5:清除通道5的全局中断标志
1332 // <o2.12> CGIF4:清除通道4的全局中断标志
1333 // <o2.8> CGIF3:清除通道3的全局中断标志
1334 // <o2.4> CGIF2:清除通道2的全局中断标志
1335 // <o2.0> CGIF1:清除通道1的全局中断标志
1336 //
1337 // </h>
1338 //
1339 //
1340 // <h> DMA通道x配置寄存器(DMA_CCRx)(x = 1…7) 7.4.3
1341 // <o3.14> MEM2MEM:存储器到存储器模式
1342 // <i> 该位由软件设置和清除。
1343 // <i> 0:非存储器到存储器模式
1344 // <i> 1:启动存储器到存储器模式
1345 //
1346 // <o3.12..13> PL[1:0]:通道优先级
1347 // <0=> 低 <1=> 中 <2=> 高 <3=> 最高
1348 // <i> 这些位由软件设置和清除。
1349 // <i> 00:低
1350 // <i> 01:中
1351 // <i> 10:高
1352 // <i> 11:最高
1353 //
1354 // <o3.10..11> MSIZE[1:0]:存储器数据宽度
1355 // <0=> 8位 <1=> 16位 <2=> 32位 <3=> 保留
1356 // <i> 这些位由软件设置和清除。
1357 // <i> 00:8位
1358 // <i> 01:16位
1359 // <i> 10:32位
1360 // <i> 11:保留
1361 //
1362 // <o3.8..9> PSIZE[1:0]:外设数据宽度
1363 // <0=> 8位 <1=> 16位 <2=> 32位 <3=> 保留
1364 // <i> 这些位由软件设置和清除。
1365 // <i> 00:8位
1366 // <i> 01:16位
1367 // <i> 10:32位
1368 // <i> 11:保留
1369 //
1370 // <o3.7> MINC:存储器地址增量模式
1371 // <i> 该位由软件设置和清除。
1372 // <i> 0:不执行存储器地址增量操作
1373 // <i> 1:执行存储器地址增量操作
1374 //
1375 // <o3.6> PINC:外设地址增量模式
1376 // <i> 该位由软件设置和清除。
1377 // <i> 0:不执行外设地址增量操作
1378 // <i> 1:执行外设地址增量操作
1379 //
1380 // <o3.5> CIRC:循环模式
1381 // <i> 该位由软件设置和清除。
1382 // <i> 0:不执行循环操作
1383 // <i> 1:执行循环操作
1384 //
1385 // <o3.4> DIR:数据传输方向
1386 // <i> 该位由软件设置和清除。
1387 // <i> 0:从外设读
1388 // <i> 1:从存储器读
1389 //
1390 // <o3.3> TEIE:允许传输错误中断
1391 // <i> 该位由软件设置和清除。
1392 // <i> 0:禁止TE中断
1393 // <i> 1:允许TE中断
1394 //
1395 // <o3.2> HTIE:允许半传输中断
1396 // <i> 该位由软件设置和清除。
1397 // <i> 0:禁止HT中断
1398 // <i> 1:允许HT中断
1399 //
1400 // <o3.1> TCIE:允许传输完成中断
1401 // <i> 该位由软件设置和清除。
1402 // <i> 0:禁止TC中断
1403 // <i> 1:允许TC中断
1404 //
1405 // <o3.0> EN:通道开启
1406 // <i> 该位由软件设置和清除。
1407 // <i> 0:通道不工作
1408 // <i> 1:通道开启
1409 //
1410 // </h>
1411 //
1412 // <h> DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7) 7.4.4
1413 // <o4.0..15> NDT[15:0]:数据传输数量
1414 // <i> 数据传输数量为0至65535。这个寄存器只能在通道不工作(DMA_CCRx的
1415 // <i> EN=0)时写入。通道开启后该寄存器变为只读,指示剩余的待传输的字节数
1416 // <i> 目。寄存器内容在每次DMA传输后递减。
1417 // <i> 数据传输结束后,寄存器的内容或者变为0;或者当该通道配置为自动重加载
1418 // <i> 模式时,寄存器的内容将被自动重新加载为之前配置时的数值。
1419 // <i> 当寄存器的内容为0时,无论通道是否开启,都不会发生任何数据传输。
1420 // </h>
1421 //
1422 // <h> DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7) 7.4.5
1423 // <o5.0..31> PA[31:0]:外设地址
1424 // <i> 外设数据寄存器的基地址,作为数据传输的源或目标。
1425 // </h>
1426 //
1427 // <h> DMA通道x存储器地址寄存器(DMA_CMARx)(x = 1…7) 7.4.6
1428 // <o6.0..31> MA[31:0]:存储器地址
1429 // <i> 存储器地址作为数据传输的源或目标。
1430 // </h>
1431 //
1432 // </e>
1433 #define DMA_SETUP 1
1434 #define DMA_CR1_Val 0x0000
1435 #define DMA_CR2_Val 0x0000
1436 #define DMA_SR_Val 0x0000
1437 #define DMA_DR_Val 0x0000
1438 #define DMA_CRCPR_Val 0x0000
1439 #define DMA_RXCRCR_Val 0x0000