|
一、前言6 `! K8 r2 b# x" R 今天在论坛上看到有人在讨论STM32睡眠模式的唤醒,一时兴起,就开始打扫“仓库”了。: z T" K/ F, [2 }$ M 结果扫出很多“旧货”,拿来分享给刚接触STM32的新人们!希望对你的学习有所帮助~~~ 二、目录 所有代码的功能使用和描述,均在头文件开头的注释中!(通过点击楼层,直接跳转到目标代码)* H2 V! L p2 y 注:所有代码均是在例程上改版而来的,所以嵌入自己的程序前需要验证!所有资料都是2012年的,所以部分描述对现有版本不适用! 1)楼层#2:3ADCs_DMA.h ADC1,2,3:独立模式、单通道、连续转换5 P- T: B) c& z0 }; u ADC1:通过 DMA1_Channel1 将数据存入 ADC1ConvertedValue 变量地址7 ]- e& i6 X& T7 s+ f4 u3 n, e ADC2:用中断 ADC1_2_IRQn 将数据存入 ADC2ConvertedValue 变量6 |* H$ j, y6 q. `. ] ADC3:通过 DMA2_Channel5 将数据存入 ADC3ConvertedValue 变量地址 2)楼层#3:ADC_AnalogWatchdog.h ADC1:独立模式、单通道、连续转换# ^5 C1 A" n" {. M 如果ADC转换的模拟电压 超出阀值范围,SR的AWD置1可产生中断.$ r$ b- d: ~- s3 W8 L 阀值位于ADC_HTR和ADC_LTR寄存器的最低12个有效位中.0 _& m# H6 d+ K' x- M 阀值独立于由ADC_CR2寄存器上的ALIGN位选择的数据对齐模式. 比较是在对齐之前完成的.2 C5 X2 G; ?: D$ ?- K' O: v, O 3)楼层#4:ADC_RegSimulDualMode.h ADC1,2:双ADC同步规则模式4 D2 G+ Q# l3 p6 D3 K; Q( i% E9 U6 J 注意1: 不要在2个ADC上转换相同的通道(如果转换两个ADC的相同通道,不可能提供重叠的采样时间)。 注意2: ADC2的外部触发必须使能,否则只能采集一个数据。 4)楼层#5:ADC_TIMTrigAutoInjection.h 0 A9 W; B4 }& o1 g/ F' T ADC1:独立模式、单通道、单次转换、外部触发、自动注入 自动注入 如果设置了JAUTO位,在规则组通道之后,注入组通道被自动转换。& n) k9 R9 y; u! q% Q- W 5)楼层#6:BKP_Tamper.h+ [& D' `7 U8 Z+ V9 a. D3 r BKP:保存VBAT掉电前的数据# j! w* K( K7 y/ ^7 V 当TAMPER引脚上的信号从’0’变成’1’或者从’1’变成’0’ (取决于备份控制寄存器BKP_CR的TPAL位),BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);//设置侵入检测管脚的有效电平6 S/ P5 _$ @. B 会产生一个侵入检测事件。0 k4 U6 a- G1 ] }7 r% ` 侵入检测事件将所有数据备份寄存器内容清除。0 J0 @* \3 {% u0 q- L& y/ `' Q7 i 在一个侵入事件被检测到并被清除后,侵入检测引脚TAMPER应该被禁止。 然后,在再次写入备份数据寄存器前重新用TPE位启动侵入检测功能。$ E: M6 C+ g+ c, T- z! C" Q 这样,可以阻止软件在侵入检测引脚上仍然有侵入事件时对备份数据寄存器进行写操作。这相当于对侵入引脚TAMPER进行电平检测。8 D, C5 ^7 W* F! R5 d6 {1 F 6)楼层#7:CAN_Example.h 收发寄存器 RDLR,RDHR,TDLR,TDHR! ] S5 E% n: M 例如 CANx->sFIFOMailBox[FIFONumber].RDLR; 7)楼层#9:CM3_BitBand.h CM3:BitBand(别名区域) use CortexM3 Bit-Band access to perform atomic read-modify-write and read operations on a varaible in SRAM.: |" H: i7 N2 i7 u1 D 对Bit-band区域某个字节的写操作,Cortex-M3都将自动转换成对相对应比特位的读-修改-写操作。 对Bit-band区域某个字节的读操作则将转换成相对应比特位的读操作。+ l6 _; C" w* [# L; ?( U) t m# j 公式:Bit-Band地址= Bit-Band域首地址 + (操作字节的偏移量× 32) + (操作位的偏移量× 4)+ G6 G8 O$ r2 H5 U- s+ [7 p = Bit-Band域首地址 | (操作字节的偏移量<<5) | (操作位的偏移量<<2)0 M- u2 y5 p9 w2 p3 W# c! [ 内置SRAM区的Bit-Band域首地址为0x22000000; G( [, }" ?$ {3 D$ G# H$ @( a$ i 外设寄存器区的Bit-Band域首地址为0x42000000 8)楼层#10:CM3_ModePrivilege.h2 s T, T8 m3 F+ y CM3:特殊模式 (此例未验证成功:__set_PSP()等宏未定义)) s' L1 I* p7 @ 阀值独立于由ADC_CR2寄存器上的ALIGN位选择的数据对齐模式. 比较是在对齐之前完成的. 9)楼层#11:CRC_Example.h CRC:以多项式(0x4C11DB7)进行CRC计算得到一个32位的值 10)楼层#12:DAC_2ChTriangleWave.h 1 Y E, F8 ?* D8 c DAC:使用不同三角波发生器的同时触发3 x0 ?2 \* {! v; q 11)楼层#13:DAC_DMAEscalator.h DAC:DMA输出梯形波 12)楼层#14:DAC_DualModeDMASineWave.h DAC:双DAC通道转换% V9 k7 q* C$ U1 `7 |* \/ E* Y7 O DAC集成了3个供双DAC模式使用的寄存器:DHR8RD、DHR12RD和DHR12LD,! W5 x) x% J1 r% i4 z* o 只需要访问一个寄存器即可完成同时驱动2个DAC通道的操作。- u2 J7 L8 z) t: R1 x2 u 13)楼层#15:DAC_NoiseWave.h; k* }& A% P/ ?" ^! m0 Q7 s, N4 Z DAC:噪声生成) J" P6 @& ~2 r: m% q" E 可以利用线性反馈移位寄存器(Linear Feedback Shift Register LFSR)产生幅度变化的伪噪声。; ~6 X3 Y) ^+ k/ b 14)楼层#16:DEBUG.h) z( O5 t0 A& Y" `! F printf("..."); 15)楼层#17:DMA_ADC_TIM1.h4 o0 c3 D% c9 [! ^) t9 t; j DMA:通过DMA将ADC采样 反映为TIM1_CH1的脉冲频率(CCR1) 16)楼层#18:DMA_FlashRAM.h DMA:从ROM中拷贝数组常量到RAM中 (存在弊端,不复位的情况下可能 FAILED) 17)楼层#19:DMA_FSMC.h( v1 u) t" y2 t( `" _2 r DMA:通过2个DMA通道,2 B, Y3 U$ w9 j( z& H 将32位数据SRC_Const_Buffer[]从FLASH_ROM写入外设FSMC的SRAM,& H: n0 b, s0 M' } 然后从外设FSMC的SRAM以8位DST_Buffer[]逐个读取数据存入 (存在弊端,不复位的情况下可能 卡while)5 \7 z* T9 y& L2 P. \ 18)楼层#20:EXTI_Example.h5 S3 t5 w3 I& y# w i EXTI:按下PB10(Key4) 翻转绿灯(PF6)上的电平/ ~- w3 b' U6 ?* Q! M7 c, T 19)楼层#21:FLASH_Program.h FLASH:擦写数据到FLASH地址- K4 A3 a7 p( t- e' k 20)楼层#22:FLASH_WriteProtection.h/ _' r! ]3 S* m, v; } FLASH:写保护(写保护部分存在问题,无法设置保护)6 n4 N8 @3 u/ A j; m' `% d 21)楼层#23:FSMC_NAND.h' |3 J6 e a! B1 b FSMC:(未研究)* J0 V- q* l5 |6 O% I" h1 ` 22)楼层#24:I2C_M24C02EEPROM.h I2C:(ST的I2C问题很多,建议不用,选择IO口模拟)--测试不通过,待调整。《申明:这里只是上传老的资料,描述也是以前的。故对存在问题的代码也不进行优化!》 23)楼层#25:IWDG_Example.h IWDG:The IWDG timeout is set to 280 ms,Systick Interrupt is 250ms 黄灯闪烁,表示每250ms喂狗一次 亮绿灯,表示系统已经由IWDG复位,resumed from IWDG reset0 o5 U2 l3 M- S4 V' [ 按下Keyer4 进入EXTI中断,关闭Systick,使IWDG不能喂狗,系统复位1 N s: O+ s% [ u5 l 24)楼层#26:NVIC_CM3LPModes.h NVIC:低功耗. ~; b9 j; E* s3 F1 l# B 25)楼层#27:PWR_STANDBY.h PWR:待机模式 26)楼层#28:PWR_STOP.h; \( ?) s% a+ f/ S; r* b" E) ? PWR:停机模式8 [& L/ |$ K+ g( e q+ k6 w y# z 27)楼层#29:SPI_Example.h 无.7 c# J0 t# a& {3 m 2 R5 F q. V4 a; F$ e; ^7 | 三、结语 + Z5 P% ]# {% N8 B- ^ 为了便于大家阅读,所以将代码片段上传。5 e a ~* s( e 可以按照每个示例中的“实例应用步骤:”直接复制粘贴,一步到位的进行测试,测试结果也在“4.Watch中观察”中写明。8 r# S% v f) U4 L4 A 闲话不说,大家往下“看”吧! - @3 l! w6 Z& ]8 O, E3 ~# P; x) ` . B% g+ r) g; ~. { |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
微信公众号
手机版
9 | K5 E9 Z* c/ j0 a( ?
为了大家学习、测试的便利,在这将IAR平台的工程文件打包上传。(文字描述部分不一定正确,毕竟是早期的个人理解。希望不要产生误导信息。)