stm32f407 GPIO、TIM、ADC、DAC、ETH、SPI、CAN、US(A)RT、DMA、看门狗等配置函数总结 整理了一下STM32F407单片机各个功能模块的配置函数,有时候初始化的时候会忘记该初始化哪些内容,整理一下以备以后查阅。 GPIO配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置, F" r. _1 f: ~) C0 z
- GPIO_Init //端口初始化
: x7 e/ d# P9 h! p7 d* w; D2 Y - GPIO_PinAFConfig //引脚重映射
复制代码
7 ` E/ f+ n% ^2 l0 a# \ADC配置需要用到的函数: - GPIO配置相关函数
; n4 S3 Z, w9 H9 L% ] - RCC_APB2PeriphClockCmd //时钟配置
$ n/ ~) m# J, {7 T - ADC_CommonInit //ADC公共配置# _( I' |; h4 i8 ~
- ADC_Init //ADC初始化
( \7 _6 ?% D7 o+ X) ] s0 V - ADC_RegularChannelConfig //ADC通道配置
: B; q8 _$ r! z - ADC_SoftwareStartConv //ADC转换启动
J9 |, N0 W9 i4 j - ADC_Cmd //ADC使能6 b( K: ^7 U* s: a, E, C6 o
- //如果使用DMA传输数据,需要添加以下两个函数 G9 G9 m8 ~8 E
- ADC_DMARequestAfterLastTransferCmd //使能ADC的DMA功能
/ V; r: L* s4 J- `2 o8 C( |+ G+ h( H$ k - ADC_DMACmd //使能DMA
复制代码 4 \) G2 x* c9 R
DMA配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置
) y8 a- E3 M, {9 ?/ b) i2 L - DMA_Init //DMA初始化
. i: {2 |8 T& ]- S& A: j - DMA_ClearFlag //清除DMA相关标志位
/ S! Q5 V" o, H" g. N+ l - DMA_ITConfig //DMA中断配置- F" [. n9 l/ |2 k2 H4 K# c
- DMA_Cmd //使能DMA通道
复制代码
; G ]% P* u$ ~/ q9 J- RCAN配置需要用到的函数: - GPIO相关函数4 A3 c8 k) N2 ~6 c7 w7 Z4 d. K
- RCC_APB1PeriphClockCmd //时钟配置
$ R1 D5 ]- t6 k; Y8 T - GPIO_PinAFConfig //引脚复用
3 t% Q1 e4 t: _ - CAN_Init //CAN初始化+ u4 d# p+ f: q
- CAN_FilterInit //CAN滤波器设置(can2滤波器从14开始)
9 a) l! u/ W4 `8 v - CAN_ITConfig //CAN中断配置' ]9 k" H. P8 d
- CAN_ClearITPendingBit //清除CAN中断等待信号
: q7 z% B3 P7 f - CAN_Transmit //CAN发送数据函数(发送数据前需要配置数据帧CanTxMsg)
* t1 U( S" e7 X& i3 @; A) ~ - CAN_Receive //CAN接收数据函数,一般在中断中调用
复制代码 2 U$ ]7 w& Y, Q0 v! v
US(A)RT串口通讯需要配置的函数: - GPIO相关函数
0 V+ d' S$ e$ u- m! b5 U - RCC_APB2PeriphClockCmd //USART1和6的时钟配置$ R2 M" c4 N- R! i1 n# W
- RCC_APB1PeriphClockCmd //外其它USART的时钟配置
7 b! | q; d9 @% U* e - USART_Init //串口初始化& [# O+ `8 N2 R2 a
- USART_ClearFlag //清除标志位" P( F* B, ~( I; |5 }1 F3 k
- USART_ITConfig //串口中断配置8 `5 Y" @5 s) ]% s- G3 c x7 M" ?
- USART_Cmd //使能串口* q5 v3 {! \) s: R6 G
- USART_GetFlagStatus //串口标志位查询
+ p2 i7 x& K* s - USART_SendData //串口发送数据(调用数据发送时需要先调用USART_GetFlagStatus判断USART_FLAG_TC)
2 B) f1 ?% P/ [( \* l6 r - USART_ReceiveData //串口接收数据,一般在中断
复制代码 % C4 r2 t! ^+ p& t' A4 S
systick需要配置的函数: - SysTick_CLKSourceConfig //配置系统嘀嗒的时钟' c% x) Z) _: H" _% ]# M
- SysTick_Config //配置定时时间
复制代码
: y s& I# g7 ^DAC功能需要配置的函数: - GPIO相关函数 _- K2 [! ]) F. p5 \! K
- RCC_APB1PeriphClockCmd //时钟配置& c \( m3 g# p. u8 V4 ^( m+ ~& m
- DAC_Init //DAC初始化
2 D: n7 U" w" Y - DAC_Cmd //使能DAC通道
2 N' X, i1 W6 [8 I! S - DAC_SetChannel1Data X( G8 L7 {$ O! k+ }% D2 h# @
- DAC_SetChannel2Data
' E0 V( e! u4 }+ t3 B* D - DAC_SetDualChannelData //通道写数据
复制代码 2 [+ w6 y8 L* [/ F T
TIM功能需要配置的函数: - GPIO相关函数 //有输入输出时配置,单纯的定时器不需要GPIO配置
& ^$ Z! c* K0 D5 b0 z - RCC_APB1PeriphClockCmd //时钟配置,根据定时器不同选择不同的时钟配置
) x; i4 d( {2 N9 ^/ P8 V - TIM_TimeBaseInit //定时器初始化: k# q: E0 U W
- TIM_ARRPreloadConfig //使能重装载
3 H1 z; c! k; G5 Z - TIM_ClearFlag //清除标志位
. p1 ^/ @( j. F1 }# U - TIM_ITConfig //中断配置. w& z( Q8 z: i4 y4 q
- TIM_DMACmd //使能DMA功能(根据需要选择)
' E7 \0 X' T9 ^9 ^0 X; W - TIM_Cmd //定时器使能
9 j# M. T" n( x: C1 M# ^$ e - TIM_TIxExternalClockConfig //计数器模式需要配置的函数$ ?& u6 k( }( R
- TIM_ICInit //输入捕获初始化,计数器模式,频率输入模式需要配置% d- }) z5 _) a7 O0 n
- TIM_OCxInit //输出比较初始化,PWM输出,* Z4 A# Q( c' c$ W
- TIM_CtrlPWMOutputs //PWM输出使能,定时器1和8特
复制代码 9 h/ w0 O' ? w* m. {5 \
FSMC功能需要配置的函数: - GPIO相关函数4 a3 x+ _0 S; ?9 \7 x2 X) I8 @0 E
- RCC_AHB3PeriphClockCmd //时钟配置
: G% B6 E) C" C& V) a - FSMC_NORSRAMInit //NORFlash配置函数. X6 G" Q2 f5 L( }1 E, P! Q; d
- FSMC_NANDInit //NANDFlash配置函数5 ~5 v1 H* m8 c# F
- FSMC_NORSRAMCmd //使能FSMC
0 ~ i1 c' D* X x' v0 ?% O# Y8 G - FSMC_NANDCmd //使能FSMC
复制代码 Z/ ]; v, _# x$ S
SPI功能需要配置的函数: - GPIO相关函数
, R9 I# i1 H- U+ T - RCC_APB2PeriphClockCmd //时钟配置4 f/ V& a! R9 m+ U/ ~" w1 x! J+ L
- SPI_Init //SPI功能初始化$ y+ g6 V( d% W% N
- SPI_Cmd //使能SPI功能
- u2 _9 ^6 ~( |- D# Y/ k - SPI_I2S_GetFlagStatus //查询SPI收发状态
1 N0 \6 K# z7 p4 \, g3 T8 z3 f; Y/ e - SPI_I2S_SendData //发送数据
% s1 H# U& }% c8 R H0 `- j - SPI_I2S_ReceiveData //接收数据
复制代码 * p# \1 i) u) W# c# ^
外部中断需要配置的函数:
! ^4 E7 X8 X0 ^% I- GPIO相关函数
3 x" W) u# J% q* K$ B: e0 V2 v - RCC_APB2PeriphClockCmd //时钟配置,RCC_APB2Periph_SYSCFG
/ W$ p' ]& b0 j0 U - SYSCFG_EXTILineConfig //中断源配置1 H3 s' v7 l! j. K9 m
- EXTI_ClearITPendingBit //清除中断标志位
) G: W9 l/ N. H5 ]- E - EXTI_Init //初始化外部中断- u- n" M, j# g( k
- NVIC_Init //中断配置
复制代码 独立看门狗需要配置的函数: - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //写入0x5555,用于允许狗狗寄存器写入功能1 R- C1 J: A7 N! \$ w3 T X8 V2 I
- IWDG_SetPrescaler(IWDG_Prescaler_256); //狗狗时钟分频,40K/256=156HZ(6.4ms)- `* w3 ~$ X0 H# H2 @- h# N
- IWDG_SetReload(315); //喂狗时间2s/6.4MS=313 .注意不能大于0xfff,计数器数值
0 A4 J9 T1 G! u: e" V$ a - IWDG_ReloadCounter(); //喂狗函数,重启计数器
8 u0 ~( K6 \% M2 Q( k) |" @) m1 y) ?4 M - IWDG_Enable();
复制代码
! q* L8 O! ?& N" H4 Z窗口看门狗需要配置的函数: - /* WWDG 配置函数
/ i; S' A8 ^, s8 X - * tr :递减计时器的值, 取值范围为:0x7f~0x40,超出范围会直接复位! Y& v' X" r) n) k8 e7 z
- * wr :窗口值,取值范围为:0x7f~0x40. v) J! O0 x8 g3 p$ Y/ |) g
- * prv:预分频器值,取值可以是6 v4 J0 L; i9 n: H: s3 A& L5 ~
- * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(42MHz)/4096)/1 约10253Hz 97us
* W, u' f ~- `1 H$ f9 I3 p - * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(42MHz)/4096)/2 约5126Hz 195us
9 m& M8 R' z/ w - * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(42MHz)/4096)/4 约2563Hz 390us7 D- X8 v+ b {: W+ z' @# ?
- * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(42MHz)/4096)/8 约1281Hz 780us
+ z' [5 R ^, ` - * 0 k) m2 a0 d" ^1 _: u1 }; s9 g( [
- * 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40为最小wr最小值) prv = WWDG_Prescaler_88 Q; N6 D7 E; W7 ^& ^( |6 y
- * ~780 * (127-80) = 36.6ms < 刷新窗口 < ~780 * 64 = 49.9ms
( P3 R9 f6 J3 }* b - * 也就是说调用WWDG_Config进行这样的配置,若在之后的36.6ms前喂狗,系统会复位,在49.9ms后没有喂狗,系统也会复位。
% \9 U; R7 @6 n9 q! A) i - * 需要在刷新窗口的时间内喂狗,系统才不会复位。
9 \: K b/ k9 F6 j( h. T; ` - */* l8 t0 q; x$ k0 I, B- z
- RCC_APB1PeriphClockCmd //时钟配置8 J- Y* B; x& r
- WWDG_SetPrescaler( prv ); //预分频器配置; Q# v; Q5 [% O: _5 a
- WWDG_SetWindowValue( wr ); //设置上窗口值( l; x2 _. m: K" a/ ?, u% r( {) g
- WWDG_Enable(tr); //使能看门狗
8 k# t ^1 ^' y. Z7 C) I - WWDG_ClearFlag(); //清看门狗标志
/ ]+ E4 a, N" q" d - WWDG_EnableIT(); //使能看门狗中断* D" C) q8 L& f$ U' B
- WWDG_SetCounter( tr ); //喂狗函数
复制代码
2 M8 s( P, m0 @! q5 R+ P wEthernet需要配置的函数: - GPIO相关函数
/ z- t1 e4 A+ p& t% Z - RCC_AHB1PeriphClockCmd //时钟配置 }) ?; a# l+ j3 P, [, `
- ETH_SoftwareReset //软件复位2 y" y' c( V! s
- ETH_GetSoftwareResetStatus //获取复位状态
/ v5 S! g0 K/ \" ?9 n/ j - ETH_Init //初始化
' C8 E4 P N" p7 a3 B% J0 C - ETH_DMAITConfig //DMA中断配置! V/ K5 f1 [4 L, h
- SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);//定义RMII接口
复制代码 % |$ z% s0 R0 O/ D; c2 [
可能不是特别的全面,但是大部分功能应该都包含了,根据这些函数去初始化各个模块,就可以实现相应的功能。这里记录的只是各个模块初始化用到的函数,没有细节,细节部分之前有整理,后续还会根据需要随时记录一些函数配置。 记录整理一下,不知道哪天不小心又把记事本给删了。 文章出处: 单片机学习点滴 6 p$ ]1 S/ ?2 a" G N ^
|