|
stm32f407 GPIO、TIM、ADC、DAC、ETH、SPI、CAN、US(A)RT、DMA、看门狗等配置函数总结 整理了一下STM32F407单片机各个功能模块的配置函数,有时候初始化的时候会忘记该初始化哪些内容,整理一下以备以后查阅。 GPIO配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置
# P- |) Y. u ]0 A# A; [& \( \ - GPIO_Init //端口初始化 a" g( c" i0 F/ u0 v
- GPIO_PinAFConfig //引脚重映射
复制代码
% L6 v' n7 ~6 L: k; ?ADC配置需要用到的函数: - GPIO配置相关函数: ^0 ?1 s' ^% j: A5 ^
- RCC_APB2PeriphClockCmd //时钟配置. H& U1 T$ S- `4 v! ~$ {
- ADC_CommonInit //ADC公共配置1 ]5 `6 z- J) d2 t) `6 d
- ADC_Init //ADC初始化" U2 B6 ^& q3 a+ ? R; E
- ADC_RegularChannelConfig //ADC通道配置6 k0 i/ Z! o2 \& t
- ADC_SoftwareStartConv //ADC转换启动
6 V" r0 J6 c4 a6 A, Q1 j - ADC_Cmd //ADC使能. T9 i" [5 c8 w) k
- //如果使用DMA传输数据,需要添加以下两个函数5 _' G) G+ N' n3 H
- ADC_DMARequestAfterLastTransferCmd //使能ADC的DMA功能1 x7 t) ~5 m, v% i8 [
- ADC_DMACmd //使能DMA
复制代码 0 F* A9 v: b" c% G
DMA配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置) N N7 m& |9 h5 Q0 i
- DMA_Init //DMA初始化
( }' U" U: J V. c - DMA_ClearFlag //清除DMA相关标志位6 ^6 L) H- O4 |7 F: Y
- DMA_ITConfig //DMA中断配置
) Q- l! _* @3 j1 w - DMA_Cmd //使能DMA通道
复制代码 - X+ ~7 f# {* a; Z
CAN配置需要用到的函数: - GPIO相关函数1 C- E8 Y" t; ]* I
- RCC_APB1PeriphClockCmd //时钟配置6 Q8 d$ r' E* p
- GPIO_PinAFConfig //引脚复用/ ]0 I% b: F0 E1 L7 Y+ H
- CAN_Init //CAN初始化
# |: l3 {; z0 f" P. z - CAN_FilterInit //CAN滤波器设置(can2滤波器从14开始)
3 U1 T; W- H) ?/ n6 w. V - CAN_ITConfig //CAN中断配置; e! F& J+ K2 [: m0 v
- CAN_ClearITPendingBit //清除CAN中断等待信号& j& U. X* C8 s" ?$ o/ s
- CAN_Transmit //CAN发送数据函数(发送数据前需要配置数据帧CanTxMsg)
: ^+ F T' z1 h; B- O/ b7 U - CAN_Receive //CAN接收数据函数,一般在中断中调用
复制代码
+ R9 W% Q9 O! m* m: m" wUS(A)RT串口通讯需要配置的函数: - GPIO相关函数 w4 x) i) J$ V+ ^, n
- RCC_APB2PeriphClockCmd //USART1和6的时钟配置+ ]( e% r7 ^* [0 `# q' p/ m
- RCC_APB1PeriphClockCmd //外其它USART的时钟配置
, c8 z! J0 R" O$ f6 S4 b - USART_Init //串口初始化
" t" b# M8 B/ i- K( d- b - USART_ClearFlag //清除标志位* ]) e# {, U7 i4 W
- USART_ITConfig //串口中断配置
5 N6 X& H) v8 T6 d( \ - USART_Cmd //使能串口
$ \' N' a+ m5 {9 b* l3 b8 h - USART_GetFlagStatus //串口标志位查询
: t' M9 K- y) T& k4 \9 ~ - USART_SendData //串口发送数据(调用数据发送时需要先调用USART_GetFlagStatus判断USART_FLAG_TC), G( L4 Z) L( H1 V9 A9 }- P
- USART_ReceiveData //串口接收数据,一般在中断
复制代码
0 ?& y% W! ~0 l m+ [; ~systick需要配置的函数: - SysTick_CLKSourceConfig //配置系统嘀嗒的时钟
& O6 a6 V7 l7 S" A7 u/ \* n - SysTick_Config //配置定时时间
复制代码 + E2 L6 U: w1 Y* p! {+ p! u
DAC功能需要配置的函数: - GPIO相关函数
3 T+ Y/ D$ E, Y. g+ L( h# B7 g t - RCC_APB1PeriphClockCmd //时钟配置; p* D9 c$ [; @ J" I4 B4 R
- DAC_Init //DAC初始化, x' ~3 z! k) w5 q0 R2 |, k$ L! ~( U L
- DAC_Cmd //使能DAC通道
" {0 h4 r& i' I, ~ @ - DAC_SetChannel1Data " U/ _% X8 p9 y1 V% q
- DAC_SetChannel2Data
/ B7 @; x( Q/ T/ [' v% H - DAC_SetDualChannelData //通道写数据
复制代码
3 E4 v7 J; i9 ?6 V5 XTIM功能需要配置的函数: - GPIO相关函数 //有输入输出时配置,单纯的定时器不需要GPIO配置, V2 @' f, f$ i+ H& H5 ~% Z+ ?
- RCC_APB1PeriphClockCmd //时钟配置,根据定时器不同选择不同的时钟配置4 i4 L# }- S8 e @7 g
- TIM_TimeBaseInit //定时器初始化
5 j+ @4 c* G/ A) r - TIM_ARRPreloadConfig //使能重装载5 t p* v8 u* t2 b7 h4 a4 ~7 @2 s
- TIM_ClearFlag //清除标志位4 E( E; n p& l( G* L, u9 ^
- TIM_ITConfig //中断配置4 @, ]! F4 x0 ]7 r
- TIM_DMACmd //使能DMA功能(根据需要选择)
/ V' f& o3 z. z8 w6 _, M4 _5 Q - TIM_Cmd //定时器使能1 P( `* ]9 }! q% ]0 |8 T
- TIM_TIxExternalClockConfig //计数器模式需要配置的函数
* i8 u; |! i. q% I - TIM_ICInit //输入捕获初始化,计数器模式,频率输入模式需要配置+ `. \- n/ L8 x! q# G
- TIM_OCxInit //输出比较初始化,PWM输出,
) S5 M) ~% e7 S+ r; ^( G* r - TIM_CtrlPWMOutputs //PWM输出使能,定时器1和8特
复制代码 + V" z# T6 w# Q8 `7 f& F' I% l
FSMC功能需要配置的函数: - GPIO相关函数; } d. [5 Z) t; p/ _0 Z* x) e. V
- RCC_AHB3PeriphClockCmd //时钟配置- O$ p* t0 N( T p0 ~- X5 A+ u& `
- FSMC_NORSRAMInit //NORFlash配置函数
; K2 p0 s L7 v( b" i - FSMC_NANDInit //NANDFlash配置函数
( l6 i Y4 w3 w& B8 a - FSMC_NORSRAMCmd //使能FSMC1 k$ ?6 Z. \2 P- V
- FSMC_NANDCmd //使能FSMC
复制代码 ( y9 a; G: a* U9 V3 J
SPI功能需要配置的函数: - GPIO相关函数 m/ I. y" [8 r6 T4 i( P: N
- RCC_APB2PeriphClockCmd //时钟配置
1 {# s1 Q) R/ y3 r3 s- F - SPI_Init //SPI功能初始化
: m! N2 I( J9 e& X - SPI_Cmd //使能SPI功能
; J# L% X5 f, t) S3 h/ S+ P - SPI_I2S_GetFlagStatus //查询SPI收发状态
5 J* ^( D& O3 W2 D- F6 o - SPI_I2S_SendData //发送数据, Z4 \7 U5 P5 d( o$ _/ U
- SPI_I2S_ReceiveData //接收数据
复制代码 % l) P0 _$ Y# Y- ~. f& ~
外部中断需要配置的函数:
; q8 t% K' `6 T" c- GPIO相关函数9 v6 A2 ?% q/ f) r
- RCC_APB2PeriphClockCmd //时钟配置,RCC_APB2Periph_SYSCFG* g8 \; B- C6 U5 o- R# ]$ f6 }2 p& {
- SYSCFG_EXTILineConfig //中断源配置
* n* h, B, d ^4 z - EXTI_ClearITPendingBit //清除中断标志位
1 Q' n2 i9 r% p% ]2 C - EXTI_Init //初始化外部中断6 f$ N4 N2 z0 \: S3 T9 o0 g
- NVIC_Init //中断配置
复制代码 独立看门狗需要配置的函数: - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //写入0x5555,用于允许狗狗寄存器写入功能. h8 Z# ~# \; \. g
- IWDG_SetPrescaler(IWDG_Prescaler_256); //狗狗时钟分频,40K/256=156HZ(6.4ms)
& i% z- i7 l3 i) ` - IWDG_SetReload(315); //喂狗时间2s/6.4MS=313 .注意不能大于0xfff,计数器数值/ B7 ?! x. ~2 f" x/ M( f
- IWDG_ReloadCounter(); //喂狗函数,重启计数器
/ V/ I% @# h6 A1 _ - IWDG_Enable();
复制代码
; S$ r. D: B1 Y2 L3 w, r窗口看门狗需要配置的函数: - /* WWDG 配置函数
5 Z. ?8 I* W3 a- { - * tr :递减计时器的值, 取值范围为:0x7f~0x40,超出范围会直接复位1 Z) E. J" U; i' Z" Q8 a% |
- * wr :窗口值,取值范围为:0x7f~0x406 F; H) W1 \( n) b: V
- * prv:预分频器值,取值可以是
( T) J. F4 [2 z4 V - * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(42MHz)/4096)/1 约10253Hz 97us X2 Y5 U) U: O7 F
- * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(42MHz)/4096)/2 约5126Hz 195us
% a8 ^$ p: G& v3 g - * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(42MHz)/4096)/4 约2563Hz 390us
4 S) A$ o5 N* Q; H( K - * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(42MHz)/4096)/8 约1281Hz 780us
4 _+ C1 j& E2 M; \- q& V8 j - * * T+ E* K3 n6 a1 \
- * 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40为最小wr最小值) prv = WWDG_Prescaler_80 Q' o4 @% T2 j
- * ~780 * (127-80) = 36.6ms < 刷新窗口 < ~780 * 64 = 49.9ms
1 R w! U( w' g; Y8 s9 ~ - * 也就是说调用WWDG_Config进行这样的配置,若在之后的36.6ms前喂狗,系统会复位,在49.9ms后没有喂狗,系统也会复位。3 B' [6 B# Q2 S9 g1 _
- * 需要在刷新窗口的时间内喂狗,系统才不会复位。, E Y9 C+ W$ L
- */
3 W* c: V( ~8 u6 D - RCC_APB1PeriphClockCmd //时钟配置
9 u! j# U; E' H, s3 d2 w - WWDG_SetPrescaler( prv ); //预分频器配置
2 @' u( J4 J+ J4 |& t5 E% d3 A - WWDG_SetWindowValue( wr ); //设置上窗口值
1 p) w# p6 Y( p7 c+ {) ~ - WWDG_Enable(tr); //使能看门狗
1 f% ~+ {2 i; n% X' y - WWDG_ClearFlag(); //清看门狗标志% e2 V0 ~, y+ F6 @! ^0 P
- WWDG_EnableIT(); //使能看门狗中断
* l( Q* Z( f- L/ [7 C/ o - WWDG_SetCounter( tr ); //喂狗函数
复制代码
1 M" Z% {/ |* b; bEthernet需要配置的函数: - GPIO相关函数
/ c5 Z6 S3 w; [7 `2 L1 w1 k - RCC_AHB1PeriphClockCmd //时钟配置
1 \2 n) @( Y! Q1 D! T1 b% z - ETH_SoftwareReset //软件复位, ?+ H& S3 R+ ]( g, Y
- ETH_GetSoftwareResetStatus //获取复位状态
. Y4 P1 }3 c% @' } - ETH_Init //初始化
# ^, W; |4 C2 v# G8 e - ETH_DMAITConfig //DMA中断配置
4 f8 b* I) z6 v, V - SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);//定义RMII接口
复制代码 E3 D9 H2 x# U( ~
可能不是特别的全面,但是大部分功能应该都包含了,根据这些函数去初始化各个模块,就可以实现相应的功能。这里记录的只是各个模块初始化用到的函数,没有细节,细节部分之前有整理,后续还会根据需要随时记录一些函数配置。 记录整理一下,不知道哪天不小心又把记事本给删了。 文章出处: 单片机学习点滴 " h/ I8 [1 q5 P' z7 ]
|