stm32f407 GPIO、TIM、ADC、DAC、ETH、SPI、CAN、US(A)RT、DMA、看门狗等配置函数总结 整理了一下STM32F407单片机各个功能模块的配置函数,有时候初始化的时候会忘记该初始化哪些内容,整理一下以备以后查阅。 GPIO配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置" Q' y3 u& ~! n' F. [9 ^8 p. K
- GPIO_Init //端口初始化
1 d3 }8 q0 ^; d - GPIO_PinAFConfig //引脚重映射
复制代码 ; h9 Q- d3 X* I7 \) p
ADC配置需要用到的函数: - GPIO配置相关函数+ a8 ^! b1 d0 P0 z0 J
- RCC_APB2PeriphClockCmd //时钟配置
, {" g3 ?6 p2 q, Y" l0 K& `) C' u - ADC_CommonInit //ADC公共配置
2 v. `& H0 _6 q4 ?( P - ADC_Init //ADC初始化
4 [% q9 ^1 }# @& Q. a! W - ADC_RegularChannelConfig //ADC通道配置
. e# }$ {& d/ t3 E B' B# K2 n - ADC_SoftwareStartConv //ADC转换启动( a" _- g; T9 y f
- ADC_Cmd //ADC使能/ x' L& W/ H8 A4 C( c6 k" Q& F! [
- //如果使用DMA传输数据,需要添加以下两个函数
% Q1 l% o2 W# o - ADC_DMARequestAfterLastTransferCmd //使能ADC的DMA功能
! j$ ]) m- s, F3 G9 ~/ | - ADC_DMACmd //使能DMA
复制代码 8 \' s* E1 j- [7 D
DMA配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置. V3 w2 P' n* a$ U8 y; K1 v
- DMA_Init //DMA初始化
3 p$ X5 A4 s1 X( a - DMA_ClearFlag //清除DMA相关标志位9 K9 i' K( G4 e* w
- DMA_ITConfig //DMA中断配置2 R7 y) ?, P. C' r6 \+ e9 w
- DMA_Cmd //使能DMA通道
复制代码
, }( C( W1 I$ |CAN配置需要用到的函数: - GPIO相关函数
. n! T9 i% b( p6 r7 K - RCC_APB1PeriphClockCmd //时钟配置
5 L2 j8 m9 _ d) v - GPIO_PinAFConfig //引脚复用: q: G) b9 N4 q$ _- j" q& O
- CAN_Init //CAN初始化5 n" u3 n' I3 v
- CAN_FilterInit //CAN滤波器设置(can2滤波器从14开始) J& W, j Q( j s* P- R+ {8 F; `
- CAN_ITConfig //CAN中断配置9 a, B: Y; N; I7 Z% Z- j
- CAN_ClearITPendingBit //清除CAN中断等待信号
d2 L- \ V8 ~# @, {# P. c - CAN_Transmit //CAN发送数据函数(发送数据前需要配置数据帧CanTxMsg)
) }" V' e6 l+ U3 T/ z3 c e - CAN_Receive //CAN接收数据函数,一般在中断中调用
复制代码 e( o4 P% u/ R3 U
US(A)RT串口通讯需要配置的函数: - GPIO相关函数, V( r1 N* M2 K1 `4 @# h5 a" S: h
- RCC_APB2PeriphClockCmd //USART1和6的时钟配置
6 L" B8 Y0 v) o5 g& } - RCC_APB1PeriphClockCmd //外其它USART的时钟配置% T3 V7 R* G9 n/ R; H9 T" Y
- USART_Init //串口初始化. F! X6 j& d" B' p o; l
- USART_ClearFlag //清除标志位, c6 Y& J7 u5 p5 U$ Z: k9 L5 x
- USART_ITConfig //串口中断配置/ @( l1 f4 I- Z2 n+ v+ L3 V; Q
- USART_Cmd //使能串口
0 o1 x8 f% m5 H2 b - USART_GetFlagStatus //串口标志位查询
+ B! a$ {; k: {' X. M: ? - USART_SendData //串口发送数据(调用数据发送时需要先调用USART_GetFlagStatus判断USART_FLAG_TC)
1 @8 B# m: `8 y1 k - USART_ReceiveData //串口接收数据,一般在中断
复制代码
: S7 s! R" f( k4 s4 M" Jsystick需要配置的函数: - SysTick_CLKSourceConfig //配置系统嘀嗒的时钟
( u6 y. V6 l) R - SysTick_Config //配置定时时间
复制代码
3 [$ W, h! \8 K: a' I ]1 E5 h( SDAC功能需要配置的函数: - GPIO相关函数! |/ R' L) q% v$ X( g" Q
- RCC_APB1PeriphClockCmd //时钟配置
- S3 g9 j: v T8 ~$ L* Q0 |4 b9 h2 @ - DAC_Init //DAC初始化, _" r: J8 H1 K/ o7 @ @9 ]9 H( R, r6 H
- DAC_Cmd //使能DAC通道
! G( ^* o: j, r* w0 @' y$ v/ f- ` - DAC_SetChannel1Data ) J3 j3 a3 E6 `* d
- DAC_SetChannel2Data
4 q3 l, Z- u9 m8 F& A - DAC_SetDualChannelData //通道写数据
复制代码
! M/ m8 F& @/ uTIM功能需要配置的函数: - GPIO相关函数 //有输入输出时配置,单纯的定时器不需要GPIO配置
/ u7 y- \ c2 F - RCC_APB1PeriphClockCmd //时钟配置,根据定时器不同选择不同的时钟配置, [4 }/ O% m1 l8 \. W7 n
- TIM_TimeBaseInit //定时器初始化6 K$ g- ~ [+ O2 ^0 ?. ^' E3 Z" ~
- TIM_ARRPreloadConfig //使能重装载; Y" w0 S& e: f7 m3 p: @+ c) d: K j
- TIM_ClearFlag //清除标志位" T. V i/ o* i# R- Y
- TIM_ITConfig //中断配置 f$ }) f4 D1 A7 J- q1 o
- TIM_DMACmd //使能DMA功能(根据需要选择)
, n3 b+ {( t4 B0 S/ q: L/ E! G - TIM_Cmd //定时器使能
# Z- h, ]6 p A1 \& O0 ]- @ - TIM_TIxExternalClockConfig //计数器模式需要配置的函数
M# {$ i% _2 u+ Q - TIM_ICInit //输入捕获初始化,计数器模式,频率输入模式需要配置
3 Q5 d! u1 l5 ~3 W% f - TIM_OCxInit //输出比较初始化,PWM输出,
# f4 p5 R1 \$ ?. ^; f& D( m - TIM_CtrlPWMOutputs //PWM输出使能,定时器1和8特
复制代码
- i, }* q' t5 {; _; E$ i, U# R# SFSMC功能需要配置的函数: - GPIO相关函数
. [6 B/ i& r" R - RCC_AHB3PeriphClockCmd //时钟配置$ z6 j& L. J+ u( a8 V& P
- FSMC_NORSRAMInit //NORFlash配置函数( K1 s- u$ s. y' {/ [) H3 Q2 m
- FSMC_NANDInit //NANDFlash配置函数
5 B* L+ b/ o/ \2 j3 n; D3 q - FSMC_NORSRAMCmd //使能FSMC' v4 M2 s, g) ^4 S( Y
- FSMC_NANDCmd //使能FSMC
复制代码 9 x+ ]8 p" V3 J7 J9 t7 q& c
SPI功能需要配置的函数: - GPIO相关函数
* n6 n; H7 Q* m q+ u @ - RCC_APB2PeriphClockCmd //时钟配置, s7 ^& x+ v* O7 ?; r/ ?
- SPI_Init //SPI功能初始化$ E5 }+ O/ o# }1 X8 _
- SPI_Cmd //使能SPI功能+ N4 G& N9 [- v8 g5 d- t0 m1 Y: T
- SPI_I2S_GetFlagStatus //查询SPI收发状态
3 Z" ^3 ~$ _% R! x+ o: O - SPI_I2S_SendData //发送数据
5 L1 ~2 k% I) Q. h3 f8 T6 |/ m, }# k - SPI_I2S_ReceiveData //接收数据
复制代码 ; [) J1 P0 `2 }& i% F
外部中断需要配置的函数: - , ^7 B/ K. E' y8 ^6 ~1 L0 Q
- GPIO相关函数
9 K/ O: f4 ^ N" M4 ~& f - RCC_APB2PeriphClockCmd //时钟配置,RCC_APB2Periph_SYSCFG# s, C4 z2 J! y8 _0 P& } e
- SYSCFG_EXTILineConfig //中断源配置# p/ f" X4 s0 P% h+ X/ U: M; U! V7 S
- EXTI_ClearITPendingBit //清除中断标志位
4 a. Z) h! ^# b6 X2 Q2 c - EXTI_Init //初始化外部中断& k: s7 u j6 u+ m4 @8 D0 P2 u+ ] D
- NVIC_Init //中断配置
复制代码 独立看门狗需要配置的函数: - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //写入0x5555,用于允许狗狗寄存器写入功能+ [+ ?6 G' S7 ?
- IWDG_SetPrescaler(IWDG_Prescaler_256); //狗狗时钟分频,40K/256=156HZ(6.4ms)
: W" r0 r) x. Q# n - IWDG_SetReload(315); //喂狗时间2s/6.4MS=313 .注意不能大于0xfff,计数器数值! e t* }& y) t6 E' m9 K( G
- IWDG_ReloadCounter(); //喂狗函数,重启计数器
0 ^# z5 G0 d. I - IWDG_Enable();
复制代码
6 L5 x0 c4 {: C窗口看门狗需要配置的函数: - /* WWDG 配置函数3 }) O* l! `% z8 e! ]& g% P6 h
- * tr :递减计时器的值, 取值范围为:0x7f~0x40,超出范围会直接复位
+ O# [) C; Q p2 a% j& W - * wr :窗口值,取值范围为:0x7f~0x40
& a; I4 U2 e3 r% F: P- s - * prv:预分频器值,取值可以是8 D" p8 P$ {$ ]% y( `
- * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(42MHz)/4096)/1 约10253Hz 97us
6 V9 l) @; f$ Z/ n - * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(42MHz)/4096)/2 约5126Hz 195us, L m$ ]9 h7 G2 T h
- * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(42MHz)/4096)/4 约2563Hz 390us
. x3 f9 B+ j. t# w; w# N8 g% m - * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(42MHz)/4096)/8 约1281Hz 780us8 t5 n$ c( d: i
- * 6 X6 I, x2 K) a0 X
- * 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40为最小wr最小值) prv = WWDG_Prescaler_8; `# _2 ~0 y; ?( g" Y$ p
- * ~780 * (127-80) = 36.6ms < 刷新窗口 < ~780 * 64 = 49.9ms% W; Q* }- l: l8 O8 I6 X
- * 也就是说调用WWDG_Config进行这样的配置,若在之后的36.6ms前喂狗,系统会复位,在49.9ms后没有喂狗,系统也会复位。5 u A3 b+ p% g: l3 D8 _2 L6 _% t
- * 需要在刷新窗口的时间内喂狗,系统才不会复位。
) Y- K" r7 ^6 A6 g3 O0 D0 F - */3 D [# {/ h5 f; }
- RCC_APB1PeriphClockCmd //时钟配置
6 n7 l* W0 [1 C7 V! W& J - WWDG_SetPrescaler( prv ); //预分频器配置 ~) z+ l# p" y1 b* {" s
- WWDG_SetWindowValue( wr ); //设置上窗口值9 j$ t6 z7 ]- k: g4 ?) X
- WWDG_Enable(tr); //使能看门狗/ F: y" b$ w, L7 e+ E0 O
- WWDG_ClearFlag(); //清看门狗标志( F4 w, G" s+ H/ ~: v
- WWDG_EnableIT(); //使能看门狗中断 E" }2 Z5 b; o4 g8 B
- WWDG_SetCounter( tr ); //喂狗函数
复制代码 , Z$ E! o# p0 x* m
Ethernet需要配置的函数: - GPIO相关函数
F6 s% Z9 y F: O8 N* \ - RCC_AHB1PeriphClockCmd //时钟配置0 s5 r* o9 O9 M) B
- ETH_SoftwareReset //软件复位5 K* }0 n( |; k, q" ^( ~# A7 O
- ETH_GetSoftwareResetStatus //获取复位状态
( K- H; v3 U% w8 w - ETH_Init //初始化
6 r& m- }2 K7 u - ETH_DMAITConfig //DMA中断配置8 n9 t* \1 u( q
- SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);//定义RMII接口
复制代码
# n2 X- m: h! @5 ?9 J" y9 d可能不是特别的全面,但是大部分功能应该都包含了,根据这些函数去初始化各个模块,就可以实现相应的功能。这里记录的只是各个模块初始化用到的函数,没有细节,细节部分之前有整理,后续还会根据需要随时记录一些函数配置。 记录整理一下,不知道哪天不小心又把记事本给删了。 文章出处: 单片机学习点滴 7 f; _3 C/ c6 w2 O
|