|
stm32f407 GPIO、TIM、ADC、DAC、ETH、SPI、CAN、US(A)RT、DMA、看门狗等配置函数总结 整理了一下STM32F407单片机各个功能模块的配置函数,有时候初始化的时候会忘记该初始化哪些内容,整理一下以备以后查阅。 GPIO配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置
6 a( a/ M: s! i/ w - GPIO_Init //端口初始化8 ^2 e$ L* g7 F& J O0 [3 X$ P
- GPIO_PinAFConfig //引脚重映射
复制代码
( h3 {9 L% \: g" QADC配置需要用到的函数: - GPIO配置相关函数
$ G) X- \4 y6 v) M" P, Y; ]0 h# Z - RCC_APB2PeriphClockCmd //时钟配置
( V+ ]( R/ D Y. U! i8 ~0 _ - ADC_CommonInit //ADC公共配置
0 ? s* `- T) Q; q - ADC_Init //ADC初始化8 e: p8 k% y# Y2 J) U. i: Z4 r
- ADC_RegularChannelConfig //ADC通道配置2 H4 B) r! }$ n6 E: |3 S
- ADC_SoftwareStartConv //ADC转换启动
& x( X8 |; Y8 ]2 h, r+ q9 t - ADC_Cmd //ADC使能
0 |% `0 `8 S2 m- |. U( a4 S! ~2 S - //如果使用DMA传输数据,需要添加以下两个函数% F6 P: Q$ [% ]1 j: M$ q5 I/ N
- ADC_DMARequestAfterLastTransferCmd //使能ADC的DMA功能
+ o9 [5 V! v' C9 ~- H - ADC_DMACmd //使能DMA
复制代码
2 ]4 Y) e' s( V' QDMA配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置: L8 H$ ^2 D4 Z4 H: A+ [$ R
- DMA_Init //DMA初始化( }# M W. F, h% I4 L
- DMA_ClearFlag //清除DMA相关标志位
. f! k& L3 M+ _& V; h7 T - DMA_ITConfig //DMA中断配置
1 m2 B$ ?5 y0 O) j - DMA_Cmd //使能DMA通道
复制代码
1 n0 b5 L+ f5 a: [CAN配置需要用到的函数: - GPIO相关函数, Z! g2 J# n: x
- RCC_APB1PeriphClockCmd //时钟配置
" S6 t' a# h* Q - GPIO_PinAFConfig //引脚复用
: b9 e, n$ t x; ~7 E# o8 s8 P6 J - CAN_Init //CAN初始化
' R5 `2 N/ n1 K: Z - CAN_FilterInit //CAN滤波器设置(can2滤波器从14开始)% F4 y4 o% {, Q0 B( ?
- CAN_ITConfig //CAN中断配置
* d X: j5 I/ e' J- J% S - CAN_ClearITPendingBit //清除CAN中断等待信号
5 M6 ~: a9 a, B7 q' \$ R( p - CAN_Transmit //CAN发送数据函数(发送数据前需要配置数据帧CanTxMsg)
$ O3 f; n7 A; J* U2 J( s7 O; l - CAN_Receive //CAN接收数据函数,一般在中断中调用
复制代码 # N7 w0 I, B; f/ M1 k8 v! ?0 C
US(A)RT串口通讯需要配置的函数: - GPIO相关函数+ h9 f6 A- m% X, f* m f# ^
- RCC_APB2PeriphClockCmd //USART1和6的时钟配置
& ]; s$ Q. p+ J( |( J - RCC_APB1PeriphClockCmd //外其它USART的时钟配置, f! w* t5 F/ ~
- USART_Init //串口初始化
r2 g0 W/ q6 E - USART_ClearFlag //清除标志位
5 Q4 E+ j. ^2 g1 S4 y# F - USART_ITConfig //串口中断配置
. _1 B/ F1 x- k' x& N, [7 @* ?- g - USART_Cmd //使能串口- Z, w5 u. n0 f! T& K5 z4 G4 ^% T# S
- USART_GetFlagStatus //串口标志位查询" m ~ J+ h9 `( e
- USART_SendData //串口发送数据(调用数据发送时需要先调用USART_GetFlagStatus判断USART_FLAG_TC)
. I% a3 m/ y* I3 B7 Y - USART_ReceiveData //串口接收数据,一般在中断
复制代码 7 b+ n8 E2 k7 ~) _: Y
systick需要配置的函数: - SysTick_CLKSourceConfig //配置系统嘀嗒的时钟
9 Z7 \; J" n) |$ E# S" _8 d& X' D - SysTick_Config //配置定时时间
复制代码 : ~7 L) I8 O" v% G: ?9 y6 x
DAC功能需要配置的函数: - GPIO相关函数; I0 A6 H C; ?' {" F
- RCC_APB1PeriphClockCmd //时钟配置
) f1 ]( C3 @, I/ i - DAC_Init //DAC初始化: d( F5 N& g' R8 |5 D
- DAC_Cmd //使能DAC通道
8 C/ d' \# [5 w# X - DAC_SetChannel1Data 0 {2 ?* I/ p% g5 F8 i) Z! K/ w
- DAC_SetChannel2Data4 u, O' Z t4 H Z0 E9 Q4 a
- DAC_SetDualChannelData //通道写数据
复制代码
( z% Q* Q6 [+ E$ v% B Z' cTIM功能需要配置的函数: - GPIO相关函数 //有输入输出时配置,单纯的定时器不需要GPIO配置) j- Y7 W4 ~8 m7 j4 j0 n( G
- RCC_APB1PeriphClockCmd //时钟配置,根据定时器不同选择不同的时钟配置. S& c/ k1 L7 A& U
- TIM_TimeBaseInit //定时器初始化
$ Z" o& v) C# N) U2 F/ ?6 J - TIM_ARRPreloadConfig //使能重装载
# C9 G, g; I8 A T- _5 i6 o - TIM_ClearFlag //清除标志位
1 k7 N) l& q2 f5 F$ C - TIM_ITConfig //中断配置. {1 d" N; }+ [( U4 m
- TIM_DMACmd //使能DMA功能(根据需要选择)
' G, \. L0 [. k0 _& b4 e - TIM_Cmd //定时器使能$ f" U3 C) W% a# Y& l; ?
- TIM_TIxExternalClockConfig //计数器模式需要配置的函数% j' i- E- }7 b# a9 F' D
- TIM_ICInit //输入捕获初始化,计数器模式,频率输入模式需要配置7 X) h1 v! F7 V. E1 V
- TIM_OCxInit //输出比较初始化,PWM输出,
6 C1 S; A2 b' \2 g - TIM_CtrlPWMOutputs //PWM输出使能,定时器1和8特
复制代码 $ L3 W7 f- Q1 T( u
FSMC功能需要配置的函数: - GPIO相关函数
* K7 [* P4 f* Q5 b7 w7 B( D - RCC_AHB3PeriphClockCmd //时钟配置: E+ Y% [; q" ]( W4 `+ n
- FSMC_NORSRAMInit //NORFlash配置函数) F/ L) |2 i1 K" g; a u0 C
- FSMC_NANDInit //NANDFlash配置函数/ g& _2 C) t! c8 g7 {
- FSMC_NORSRAMCmd //使能FSMC) g6 F. e2 r6 @. S
- FSMC_NANDCmd //使能FSMC
复制代码
, T3 d% G) `+ u" X* jSPI功能需要配置的函数: - GPIO相关函数; d& F5 D) \) Z+ q; B8 N1 _
- RCC_APB2PeriphClockCmd //时钟配置
+ r% K) \, R& @: M' c( M - SPI_Init //SPI功能初始化
3 l0 o" a+ \) q4 X - SPI_Cmd //使能SPI功能% F2 t/ I+ A9 c4 _3 B( u
- SPI_I2S_GetFlagStatus //查询SPI收发状态
1 u1 P1 W- I% H @! n2 ?7 l - SPI_I2S_SendData //发送数据
; X B# o' o1 V o* [( Y5 T - SPI_I2S_ReceiveData //接收数据
复制代码 3 J( h0 C) b& ]! ^& F
外部中断需要配置的函数: - % K: C3 ?. H: b4 r
- GPIO相关函数
" o7 Y# J$ G9 z* Y+ Q' X! | - RCC_APB2PeriphClockCmd //时钟配置,RCC_APB2Periph_SYSCFG8 ^5 C9 t- j1 s5 N0 ^
- SYSCFG_EXTILineConfig //中断源配置
1 r, a: @! s" G) {) S) c - EXTI_ClearITPendingBit //清除中断标志位
0 ^4 e! m9 x' g8 i0 P% { - EXTI_Init //初始化外部中断
. r: H6 g$ w. O( t - NVIC_Init //中断配置
复制代码 独立看门狗需要配置的函数: - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //写入0x5555,用于允许狗狗寄存器写入功能; v: N5 K3 x7 c# h$ V4 @6 B, U
- IWDG_SetPrescaler(IWDG_Prescaler_256); //狗狗时钟分频,40K/256=156HZ(6.4ms)
# q; k( ~+ e& H M0 D - IWDG_SetReload(315); //喂狗时间2s/6.4MS=313 .注意不能大于0xfff,计数器数值
% ~+ W7 M O x - IWDG_ReloadCounter(); //喂狗函数,重启计数器
$ C! N5 A9 ^( M - IWDG_Enable();
复制代码 ! q" {$ o4 u3 c; y3 s8 p4 m
窗口看门狗需要配置的函数: - /* WWDG 配置函数
% k4 ^4 C l# p4 b7 B5 q% M9 U - * tr :递减计时器的值, 取值范围为:0x7f~0x40,超出范围会直接复位1 b2 h6 H4 x4 ~% |/ _
- * wr :窗口值,取值范围为:0x7f~0x40
0 i) |* O% a8 r/ b- a - * prv:预分频器值,取值可以是! p& `4 x1 G& K$ ]+ X
- * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(42MHz)/4096)/1 约10253Hz 97us$ L0 Q1 s; y8 R2 [) I
- * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(42MHz)/4096)/2 约5126Hz 195us
3 S; a+ U- `% }& m - * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(42MHz)/4096)/4 约2563Hz 390us
" Q8 I8 m( m, Y1 b0 A4 d8 _) T+ T& h& J - * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(42MHz)/4096)/8 约1281Hz 780us6 e ^. g/ I: ?, k. M3 S( {+ j# M1 D
- *
' O! x9 s/ z/ v D& s - * 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40为最小wr最小值) prv = WWDG_Prescaler_8
3 E1 u& r+ e% e" r - * ~780 * (127-80) = 36.6ms < 刷新窗口 < ~780 * 64 = 49.9ms
4 o/ P' l; e3 b3 |( r: w( z - * 也就是说调用WWDG_Config进行这样的配置,若在之后的36.6ms前喂狗,系统会复位,在49.9ms后没有喂狗,系统也会复位。
6 l' X5 n7 ^) s$ w - * 需要在刷新窗口的时间内喂狗,系统才不会复位。
1 C* N& g3 d6 |0 B" J - */
3 @( y! Z4 o: M! N - RCC_APB1PeriphClockCmd //时钟配置
% d# x% \, c8 C" R: h - WWDG_SetPrescaler( prv ); //预分频器配置1 q3 l% H3 R* z' ~5 ^
- WWDG_SetWindowValue( wr ); //设置上窗口值4 I- `# T" N' G8 @: F' I
- WWDG_Enable(tr); //使能看门狗
) L( c e+ H8 u* @2 G) U9 r# O - WWDG_ClearFlag(); //清看门狗标志
( n9 c7 n$ W$ F - WWDG_EnableIT(); //使能看门狗中断
* f! G! I5 d0 Q) G - WWDG_SetCounter( tr ); //喂狗函数
复制代码
4 y5 u2 B, g$ A+ v: ^ O; nEthernet需要配置的函数: - GPIO相关函数, ?9 U* Q6 o3 g( r u2 X- F7 B. |
- RCC_AHB1PeriphClockCmd //时钟配置 b2 b! _ x; Z$ w7 r) z' u
- ETH_SoftwareReset //软件复位
9 i" |- g4 o* v6 V - ETH_GetSoftwareResetStatus //获取复位状态
0 X N' A' g# H0 z - ETH_Init //初始化
6 N# m3 _7 g6 W S/ l, E& T - ETH_DMAITConfig //DMA中断配置, ^, k8 C( Y4 m$ n
- SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);//定义RMII接口
复制代码
7 Z6 c; M! [6 G5 S! \& d$ K可能不是特别的全面,但是大部分功能应该都包含了,根据这些函数去初始化各个模块,就可以实现相应的功能。这里记录的只是各个模块初始化用到的函数,没有细节,细节部分之前有整理,后续还会根据需要随时记录一些函数配置。 记录整理一下,不知道哪天不小心又把记事本给删了。 文章出处: 单片机学习点滴 % Q* ?; {% Q. y* ~1 N A! I6 F2 P" b
|