stm32f407 GPIO、TIM、ADC、DAC、ETH、SPI、CAN、US(A)RT、DMA、看门狗等配置函数总结 整理了一下STM32F407单片机各个功能模块的配置函数,有时候初始化的时候会忘记该初始化哪些内容,整理一下以备以后查阅。 GPIO配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置: O8 a3 }1 k! `7 F/ e4 R
- GPIO_Init //端口初始化
4 R$ B. ]; ^0 S3 e6 O - GPIO_PinAFConfig //引脚重映射
复制代码
1 J1 j- O' \! A m* hADC配置需要用到的函数: - GPIO配置相关函数
. a1 b! m" g/ [; \3 ] - RCC_APB2PeriphClockCmd //时钟配置/ q0 \$ h9 u) x4 u
- ADC_CommonInit //ADC公共配置
4 e' n1 `, E, S5 x8 \) N/ X! y - ADC_Init //ADC初始化; T) L) _! v" I* J
- ADC_RegularChannelConfig //ADC通道配置& _ D: X6 p$ d
- ADC_SoftwareStartConv //ADC转换启动
( O9 V& Y) ?" x - ADC_Cmd //ADC使能
0 }8 X; O6 n1 g" n% C1 s) ` - //如果使用DMA传输数据,需要添加以下两个函数, T. h0 L1 K- X9 l
- ADC_DMARequestAfterLastTransferCmd //使能ADC的DMA功能
8 S9 D; x0 E- x/ r - ADC_DMACmd //使能DMA
复制代码 $ J/ s: k! N( d
DMA配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置
0 U( K9 n) o! W. X" w0 O - DMA_Init //DMA初始化
' X K" S" |0 G2 D - DMA_ClearFlag //清除DMA相关标志位
+ Y. u( s! [0 O( a - DMA_ITConfig //DMA中断配置
( p1 l. ~/ Y. C: _( h3 t% D7 ~: n* O - DMA_Cmd //使能DMA通道
复制代码 4 q4 s0 }) v" {# y( U* q- P1 ?
CAN配置需要用到的函数: - GPIO相关函数' i$ m5 d! R, D7 m. z
- RCC_APB1PeriphClockCmd //时钟配置; Z9 F) T; @, U9 @0 m4 m/ I
- GPIO_PinAFConfig //引脚复用. X+ U' p. `" f
- CAN_Init //CAN初始化
+ o8 g3 Z2 q6 d8 i5 I d - CAN_FilterInit //CAN滤波器设置(can2滤波器从14开始)
+ e0 t! V- ?* X - CAN_ITConfig //CAN中断配置
, n' ~4 l, t3 @/ [& w) n - CAN_ClearITPendingBit //清除CAN中断等待信号
+ S+ i9 g3 Z" ?7 y3 B# e; J - CAN_Transmit //CAN发送数据函数(发送数据前需要配置数据帧CanTxMsg)
3 `% Q1 I0 ]- T1 K0 t, c - CAN_Receive //CAN接收数据函数,一般在中断中调用
复制代码
- N, I- s/ X; E7 [. M5 t$ @, `US(A)RT串口通讯需要配置的函数: - GPIO相关函数- T* W- S/ x) Y4 P+ B) g7 J, b* V2 o8 z
- RCC_APB2PeriphClockCmd //USART1和6的时钟配置& x v* I# Z3 w( I* P. X+ H5 w
- RCC_APB1PeriphClockCmd //外其它USART的时钟配置
0 v2 m) G1 A+ J" X - USART_Init //串口初始化2 _" w! f+ I. }, z! X3 g. |4 V
- USART_ClearFlag //清除标志位- a+ L# } E) ~$ I9 d3 h
- USART_ITConfig //串口中断配置
. ~4 [3 N7 y4 Q4 N4 Y - USART_Cmd //使能串口
1 [" n8 i2 B+ a! v4 d! M - USART_GetFlagStatus //串口标志位查询, F7 R% z& K+ H
- USART_SendData //串口发送数据(调用数据发送时需要先调用USART_GetFlagStatus判断USART_FLAG_TC)
$ u& e0 c' U5 M3 Q" i& w$ @9 ?3 u - USART_ReceiveData //串口接收数据,一般在中断
复制代码 . v3 @8 o" l( s+ h2 k
systick需要配置的函数: - SysTick_CLKSourceConfig //配置系统嘀嗒的时钟
+ k5 H! H) M1 J - SysTick_Config //配置定时时间
复制代码
4 Z+ g5 e# J, X! ?: F" M' \DAC功能需要配置的函数: - GPIO相关函数
1 `- C0 |$ \, K' K |' i+ O1 [/ F5 J - RCC_APB1PeriphClockCmd //时钟配置# W' }6 u0 J( m, g0 F% i5 f" t) ~7 c
- DAC_Init //DAC初始化0 c4 v9 h, m! G' p! f4 Z0 }2 h
- DAC_Cmd //使能DAC通道
& C0 {% ^6 x; Y9 S4 E1 }$ L. W - DAC_SetChannel1Data
: Z; h: m" Q, c2 G! Q - DAC_SetChannel2Data) \3 W0 s0 }0 f+ s. C5 o+ z! g: n
- DAC_SetDualChannelData //通道写数据
复制代码 : w. @ X) X5 \
TIM功能需要配置的函数: - GPIO相关函数 //有输入输出时配置,单纯的定时器不需要GPIO配置
& r8 h& i9 T9 Z' h - RCC_APB1PeriphClockCmd //时钟配置,根据定时器不同选择不同的时钟配置 D( |4 V- i. p$ R
- TIM_TimeBaseInit //定时器初始化
/ ~: Z3 y/ C% _ - TIM_ARRPreloadConfig //使能重装载3 Y; E" w5 @) c& I/ p$ ~+ y7 y
- TIM_ClearFlag //清除标志位: u7 d. U: P/ R& {, u9 j& V6 W$ L
- TIM_ITConfig //中断配置
( j0 ?6 T I: Q) _ - TIM_DMACmd //使能DMA功能(根据需要选择)0 w x6 ?" ^- z5 |1 D# ]1 ^
- TIM_Cmd //定时器使能
6 H& o2 |; H- U - TIM_TIxExternalClockConfig //计数器模式需要配置的函数+ n, W$ S h) K
- TIM_ICInit //输入捕获初始化,计数器模式,频率输入模式需要配置' W, }. [% ?" F5 ?! m2 y
- TIM_OCxInit //输出比较初始化,PWM输出,1 l b, b0 e+ u. T
- TIM_CtrlPWMOutputs //PWM输出使能,定时器1和8特
复制代码
) C0 P$ m4 Z% l2 A2 aFSMC功能需要配置的函数: - GPIO相关函数
6 j6 a% h5 [8 ?! s - RCC_AHB3PeriphClockCmd //时钟配置
! O$ V9 b8 f, c# p - FSMC_NORSRAMInit //NORFlash配置函数) x) j& ?% B+ U1 }
- FSMC_NANDInit //NANDFlash配置函数
7 o7 ^8 W8 b5 O& U. s4 U! q5 L - FSMC_NORSRAMCmd //使能FSMC
( h! }8 _( Y" X* U, s/ R: t - FSMC_NANDCmd //使能FSMC
复制代码 4 P7 O& T+ `: h$ ~) F: \* a7 B2 ?
SPI功能需要配置的函数: - GPIO相关函数1 x6 F. p, x7 P% ]% k- K) n& Z/ k
- RCC_APB2PeriphClockCmd //时钟配置
' M5 s* T5 ?2 ] - SPI_Init //SPI功能初始化# Y, w4 o0 Q1 B" S5 y( X
- SPI_Cmd //使能SPI功能! @" R0 _- q: I4 X" V
- SPI_I2S_GetFlagStatus //查询SPI收发状态
) D- |- [3 d! ]9 o6 o: m - SPI_I2S_SendData //发送数据8 L" ^3 A* c- `! j+ M. m
- SPI_I2S_ReceiveData //接收数据
复制代码
: I* G l* S& B/ H0 f外部中断需要配置的函数:
3 b9 }* W# c6 f# D, ^: I- GPIO相关函数
0 C( S. m N' v% C/ `1 o5 @& {, S4 r - RCC_APB2PeriphClockCmd //时钟配置,RCC_APB2Periph_SYSCFG
& a! L5 N& D! Q8 d$ C - SYSCFG_EXTILineConfig //中断源配置
: m" }4 [# {- d& o0 t7 {$ X2 N ~ - EXTI_ClearITPendingBit //清除中断标志位. G' R e0 i. e4 A; O4 ?# f
- EXTI_Init //初始化外部中断
. ^. e0 h9 O# M* Z6 ]) [ - NVIC_Init //中断配置
复制代码 独立看门狗需要配置的函数: - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //写入0x5555,用于允许狗狗寄存器写入功能
2 {4 a2 [! ?( N7 {5 j - IWDG_SetPrescaler(IWDG_Prescaler_256); //狗狗时钟分频,40K/256=156HZ(6.4ms)
/ [8 {4 f" T5 m! J( |/ v" V - IWDG_SetReload(315); //喂狗时间2s/6.4MS=313 .注意不能大于0xfff,计数器数值4 Y# t* X# D$ g1 ^
- IWDG_ReloadCounter(); //喂狗函数,重启计数器 " V# D7 Z% L! N5 O/ N
- IWDG_Enable();
复制代码
& M. x' W+ Q- J% q$ u7 P8 I; M窗口看门狗需要配置的函数: - /* WWDG 配置函数
- g4 S I1 l4 ~6 K+ p4 c+ a - * tr :递减计时器的值, 取值范围为:0x7f~0x40,超出范围会直接复位
9 j R5 u3 d1 \+ z% Q' W1 D6 \ - * wr :窗口值,取值范围为:0x7f~0x40
# `# y9 V# n7 D" _ - * prv:预分频器值,取值可以是
/ X( w6 h# ~5 I" M# P - * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(42MHz)/4096)/1 约10253Hz 97us
+ @3 H( R$ D* n3 F7 S - * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(42MHz)/4096)/2 约5126Hz 195us
2 n. Y8 o+ _5 }. [0 a - * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(42MHz)/4096)/4 约2563Hz 390us/ Q! l7 ~' x- F. N5 u* w
- * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(42MHz)/4096)/8 约1281Hz 780us
, i3 a3 K: ]" L; U - * ' m6 t1 @, ?9 m( F* S( ]
- * 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40为最小wr最小值) prv = WWDG_Prescaler_8
9 t, C% x s2 ~$ Y1 U - * ~780 * (127-80) = 36.6ms < 刷新窗口 < ~780 * 64 = 49.9ms
9 B' P( ?7 }& H" D) z* o - * 也就是说调用WWDG_Config进行这样的配置,若在之后的36.6ms前喂狗,系统会复位,在49.9ms后没有喂狗,系统也会复位。) s6 t* y# ^1 t }; f
- * 需要在刷新窗口的时间内喂狗,系统才不会复位。
5 h; b+ x% ~' u& \) L1 o* z - */
8 G9 V, m P0 n' ]: N - RCC_APB1PeriphClockCmd //时钟配置
- h* `+ t: l: ^: Z - WWDG_SetPrescaler( prv ); //预分频器配置7 I; N& p! g3 d
- WWDG_SetWindowValue( wr ); //设置上窗口值
# m* Q; i# T! N9 r - WWDG_Enable(tr); //使能看门狗
7 J- ~8 O0 `) s* m) U - WWDG_ClearFlag(); //清看门狗标志
" k% Z- `: @+ L9 f - WWDG_EnableIT(); //使能看门狗中断
4 j# G! u2 v/ U- E7 O7 i - WWDG_SetCounter( tr ); //喂狗函数
复制代码
5 l- ^8 t% g' B' i. Y' |Ethernet需要配置的函数: - GPIO相关函数
- z/ q, j# `3 P& c' z4 [6 h0 _6 a - RCC_AHB1PeriphClockCmd //时钟配置$ ~: }3 {: D; b, m4 h
- ETH_SoftwareReset //软件复位! }5 d. }+ e: n5 ]. z5 ?/ ?7 j
- ETH_GetSoftwareResetStatus //获取复位状态" i! a4 M; a# o' ^) F
- ETH_Init //初始化2 S- g- f" `( M% \
- ETH_DMAITConfig //DMA中断配置4 V8 }# N; M: @& ?3 m
- SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);//定义RMII接口
复制代码 0 F/ O c* ^. U. C- y% I$ N, ~" ~
可能不是特别的全面,但是大部分功能应该都包含了,根据这些函数去初始化各个模块,就可以实现相应的功能。这里记录的只是各个模块初始化用到的函数,没有细节,细节部分之前有整理,后续还会根据需要随时记录一些函数配置。 记录整理一下,不知道哪天不小心又把记事本给删了。 文章出处: 单片机学习点滴
/ l' m6 a' d/ D |