stm32f407 GPIO、TIM、ADC、DAC、ETH、SPI、CAN、US(A)RT、DMA、看门狗等配置函数总结 整理了一下STM32F407单片机各个功能模块的配置函数,有时候初始化的时候会忘记该初始化哪些内容,整理一下以备以后查阅。 GPIO配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置
4 x* K8 w/ t& N/ d& k5 v4 r# N - GPIO_Init //端口初始化6 r, h: g d5 d4 D" r
- GPIO_PinAFConfig //引脚重映射
复制代码
E( u0 \2 c# V0 Q; L7 X5 dADC配置需要用到的函数: - GPIO配置相关函数* M6 a$ x4 @/ v) P; h# Y
- RCC_APB2PeriphClockCmd //时钟配置
9 r0 t" }! U) A' { d, Q - ADC_CommonInit //ADC公共配置' C; l# I6 Y! S2 H8 V. D/ U
- ADC_Init //ADC初始化0 ]# u' o# Y% r4 @0 b& N
- ADC_RegularChannelConfig //ADC通道配置2 ?0 d5 D6 T8 X( e1 Y0 Z
- ADC_SoftwareStartConv //ADC转换启动0 Q+ B3 z; Z7 a4 {2 T+ M
- ADC_Cmd //ADC使能: W2 v/ T, e% ]& c# Q4 T
- //如果使用DMA传输数据,需要添加以下两个函数8 |( u8 e! }, b, K. a
- ADC_DMARequestAfterLastTransferCmd //使能ADC的DMA功能1 y/ k8 I0 Y$ U* i- ^0 z2 U! e# l. h
- ADC_DMACmd //使能DMA
复制代码 6 y7 `* ]+ s& n+ ^6 _
DMA配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置 T1 w* M" g6 R: q! @
- DMA_Init //DMA初始化5 ]$ V h! d" P& n
- DMA_ClearFlag //清除DMA相关标志位9 l2 k0 Y3 x1 O$ U
- DMA_ITConfig //DMA中断配置, k& v" I6 e0 m3 h6 d4 j6 I, E
- DMA_Cmd //使能DMA通道
复制代码 ; \. x) w% [2 c% c$ v
CAN配置需要用到的函数: - GPIO相关函数
/ q0 n5 U! X& Z* {) j. `7 I - RCC_APB1PeriphClockCmd //时钟配置- r/ y! f8 M. ^
- GPIO_PinAFConfig //引脚复用$ P) M" ?/ q8 e7 |. s! Y
- CAN_Init //CAN初始化
! {. B* [; |+ k! A' d3 } - CAN_FilterInit //CAN滤波器设置(can2滤波器从14开始)
* U/ C9 E L$ J$ ^ - CAN_ITConfig //CAN中断配置$ n% P5 D, M2 G( |& i: i
- CAN_ClearITPendingBit //清除CAN中断等待信号2 d6 u+ C) p1 |. ^
- CAN_Transmit //CAN发送数据函数(发送数据前需要配置数据帧CanTxMsg)
- @3 Z/ l+ h1 a/ n) B - CAN_Receive //CAN接收数据函数,一般在中断中调用
复制代码
! I6 |- H: x. F$ i: VUS(A)RT串口通讯需要配置的函数: - GPIO相关函数. b0 Y v. E3 @7 G/ c
- RCC_APB2PeriphClockCmd //USART1和6的时钟配置
6 f& W6 `$ @4 x3 g* E' ^- K' S - RCC_APB1PeriphClockCmd //外其它USART的时钟配置
0 a! G+ T% V3 b' c - USART_Init //串口初始化) J0 `6 f6 `8 |1 @. [. R
- USART_ClearFlag //清除标志位
t @5 Y' V, X6 m+ [1 @! n: z - USART_ITConfig //串口中断配置* s4 c9 |! T9 \) h- I0 v. u" y
- USART_Cmd //使能串口
$ P8 w2 H5 a; x; [ R1 z: m( I+ @( s - USART_GetFlagStatus //串口标志位查询
+ ]# D# ?5 ?% \0 w3 @8 K: Z - USART_SendData //串口发送数据(调用数据发送时需要先调用USART_GetFlagStatus判断USART_FLAG_TC)
1 c# u; C: [7 [' ^ - USART_ReceiveData //串口接收数据,一般在中断
复制代码
; L0 F2 l& k. C9 a, T- O, K* Dsystick需要配置的函数: - SysTick_CLKSourceConfig //配置系统嘀嗒的时钟
" ?# \: V# X! j+ ]% H - SysTick_Config //配置定时时间
复制代码 . L9 p2 n1 } v7 {8 h
DAC功能需要配置的函数: - GPIO相关函数
- S! F- s- t. m. W' e - RCC_APB1PeriphClockCmd //时钟配置
3 N U4 H& ?% h - DAC_Init //DAC初始化. X; j! Y, N" o$ V
- DAC_Cmd //使能DAC通道
$ {/ U% m5 {+ X - DAC_SetChannel1Data $ k' v( n% @! K( }3 f3 n: S# y
- DAC_SetChannel2Data* C, t5 [. t# s, O) h
- DAC_SetDualChannelData //通道写数据
复制代码 ' f5 D7 t3 I+ T M5 g+ S
TIM功能需要配置的函数: - GPIO相关函数 //有输入输出时配置,单纯的定时器不需要GPIO配置2 R/ G# I; \$ t: i
- RCC_APB1PeriphClockCmd //时钟配置,根据定时器不同选择不同的时钟配置( n( P' b, V+ ~+ c7 s8 c# u
- TIM_TimeBaseInit //定时器初始化
: U, C3 x, |8 T8 v3 O+ O3 c+ s& Y - TIM_ARRPreloadConfig //使能重装载! R' O A6 x# W9 b# P2 O* _9 a' H3 }
- TIM_ClearFlag //清除标志位0 J; z: N& C+ |% h9 c" N
- TIM_ITConfig //中断配置
+ z! D, H7 i( {+ x7 s& D0 v( \ - TIM_DMACmd //使能DMA功能(根据需要选择)
9 ]( e2 Y+ D3 }! m, m6 O& @ - TIM_Cmd //定时器使能
1 N( e3 p4 @% f* j+ t - TIM_TIxExternalClockConfig //计数器模式需要配置的函数
2 o/ \& c6 A1 a - TIM_ICInit //输入捕获初始化,计数器模式,频率输入模式需要配置
. ~6 W1 _+ R( y - TIM_OCxInit //输出比较初始化,PWM输出,0 [6 H/ N. v6 V% {2 K, e( o- C
- TIM_CtrlPWMOutputs //PWM输出使能,定时器1和8特
复制代码 2 U' ^" ?. z* ? P X: ^* a$ Y
FSMC功能需要配置的函数: - GPIO相关函数
7 x1 }8 e( t- V+ u" I0 n" r - RCC_AHB3PeriphClockCmd //时钟配置, d) ]+ |1 c) y% _% U( R
- FSMC_NORSRAMInit //NORFlash配置函数4 v. c8 r. r/ x: V, L3 P( }
- FSMC_NANDInit //NANDFlash配置函数
}) ?4 g/ x. ?4 u - FSMC_NORSRAMCmd //使能FSMC
6 c/ L2 S% `! G6 F( l: A - FSMC_NANDCmd //使能FSMC
复制代码 $ ^% P+ U2 a# d1 K* ?
SPI功能需要配置的函数: - GPIO相关函数' {, n7 Q. i1 {. F# {
- RCC_APB2PeriphClockCmd //时钟配置
2 o) ?, [. @' X2 C- C4 K3 B - SPI_Init //SPI功能初始化
+ C/ {) e) b8 h: l" y - SPI_Cmd //使能SPI功能 x: N8 p$ V# Q
- SPI_I2S_GetFlagStatus //查询SPI收发状态
! x* X- D$ `9 B S; K& f! X - SPI_I2S_SendData //发送数据
9 w+ a: e. m' j8 \, |! E! E - SPI_I2S_ReceiveData //接收数据
复制代码 ) ~: r1 g8 Z- N: s, _6 j
外部中断需要配置的函数:
- B* R7 w7 j* g# m/ F- o, [* @- _- GPIO相关函数2 ^& G" s. r: D3 w
- RCC_APB2PeriphClockCmd //时钟配置,RCC_APB2Periph_SYSCFG; B# _7 S" l2 `3 Y' [
- SYSCFG_EXTILineConfig //中断源配置
; H) k' W- Y( h$ t |3 ^8 |0 q - EXTI_ClearITPendingBit //清除中断标志位$ ?+ M0 B# _: {9 k9 e: S; G* F
- EXTI_Init //初始化外部中断
) a4 \& C B# f) i. g7 N - NVIC_Init //中断配置
复制代码 独立看门狗需要配置的函数: - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //写入0x5555,用于允许狗狗寄存器写入功能
2 a& e, Q5 E4 V# g4 D' q2 U - IWDG_SetPrescaler(IWDG_Prescaler_256); //狗狗时钟分频,40K/256=156HZ(6.4ms)
/ f7 u& M) \9 Y8 y0 H$ r& s$ @ - IWDG_SetReload(315); //喂狗时间2s/6.4MS=313 .注意不能大于0xfff,计数器数值/ |1 M; \& c+ }( D7 G
- IWDG_ReloadCounter(); //喂狗函数,重启计数器 ' d8 k& s0 k3 V* F* j
- IWDG_Enable();
复制代码 F4 \$ e' x& W0 ^) i
窗口看门狗需要配置的函数: - /* WWDG 配置函数. l, [& y8 T+ {- Y# ]
- * tr :递减计时器的值, 取值范围为:0x7f~0x40,超出范围会直接复位
! J* V, g$ I) C+ j2 i. Q - * wr :窗口值,取值范围为:0x7f~0x40, R! l5 |2 M1 P9 B
- * prv:预分频器值,取值可以是1 s( x. t: A) Q
- * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(42MHz)/4096)/1 约10253Hz 97us
5 z. z$ S" J6 U$ p' B - * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(42MHz)/4096)/2 约5126Hz 195us
" [3 U8 ?7 Q* `4 q - * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(42MHz)/4096)/4 约2563Hz 390us
; n% e9 p6 b2 R6 n2 y - * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(42MHz)/4096)/8 约1281Hz 780us# q$ l+ d3 D* m$ U/ @0 b! z
- *
. D9 p) P6 k% u) M - * 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40为最小wr最小值) prv = WWDG_Prescaler_8
- ?8 b$ h* f7 |# E5 L+ x9 ]" b - * ~780 * (127-80) = 36.6ms < 刷新窗口 < ~780 * 64 = 49.9ms4 Q' E( ^% x- _3 F2 L
- * 也就是说调用WWDG_Config进行这样的配置,若在之后的36.6ms前喂狗,系统会复位,在49.9ms后没有喂狗,系统也会复位。
9 Z) |3 s' n) f; J _ - * 需要在刷新窗口的时间内喂狗,系统才不会复位。1 \3 J8 Y4 f( H! r/ Y
- */. U, a. k) o2 F i T
- RCC_APB1PeriphClockCmd //时钟配置
1 O+ W0 }) Q; A) E. e( K- ]6 z5 @ - WWDG_SetPrescaler( prv ); //预分频器配置
/ ]7 n+ o' ]0 m - WWDG_SetWindowValue( wr ); //设置上窗口值
" |2 a \( a a _% [; h - WWDG_Enable(tr); //使能看门狗
: x: z9 ^2 G! Y, j/ T - WWDG_ClearFlag(); //清看门狗标志
: V J$ T+ D6 r0 G, ?: Y. N0 H - WWDG_EnableIT(); //使能看门狗中断
; l$ O: \' Q7 d/ P2 e0 ?% T - WWDG_SetCounter( tr ); //喂狗函数
复制代码
9 U/ C) @; l$ w. iEthernet需要配置的函数: - GPIO相关函数4 I" D6 V0 l6 D; p f
- RCC_AHB1PeriphClockCmd //时钟配置0 x; I# ?4 E$ S5 S
- ETH_SoftwareReset //软件复位
/ {% G# y. |3 k) t. @ - ETH_GetSoftwareResetStatus //获取复位状态
! {9 u1 E; a1 D - ETH_Init //初始化7 Q( S4 Q8 D/ o6 \
- ETH_DMAITConfig //DMA中断配置/ J( G' E' ?& h' y
- SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);//定义RMII接口
复制代码
| c9 {1 \! Z7 b5 F" C可能不是特别的全面,但是大部分功能应该都包含了,根据这些函数去初始化各个模块,就可以实现相应的功能。这里记录的只是各个模块初始化用到的函数,没有细节,细节部分之前有整理,后续还会根据需要随时记录一些函数配置。 记录整理一下,不知道哪天不小心又把记事本给删了。 文章出处: 单片机学习点滴
0 b0 b, e' ~: K- l |