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