|
stm32f407 GPIO、TIM、ADC、DAC、ETH、SPI、CAN、US(A)RT、DMA、看门狗等配置函数总结 整理了一下STM32F407单片机各个功能模块的配置函数,有时候初始化的时候会忘记该初始化哪些内容,整理一下以备以后查阅。 GPIO配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置6 D- I b3 G3 h* g0 _" `
- GPIO_Init //端口初始化6 L, S) a* o2 H6 Y0 }+ n# P
- GPIO_PinAFConfig //引脚重映射
复制代码
0 V+ b% ]/ P0 |/ C' SADC配置需要用到的函数: - GPIO配置相关函数
6 B) c. W' o. w7 \( u$ Y" c - RCC_APB2PeriphClockCmd //时钟配置' Y9 R6 [. u+ O8 T& P, A/ ~
- ADC_CommonInit //ADC公共配置
- q/ @( W+ j) w4 u6 `2 } - ADC_Init //ADC初始化' {* e4 `( u4 {2 L A) B5 ?
- ADC_RegularChannelConfig //ADC通道配置- G, c# a3 g6 ]- O/ y
- ADC_SoftwareStartConv //ADC转换启动8 S7 n: j" }% j: O$ K
- ADC_Cmd //ADC使能/ V3 ^) A, v* _. ~2 r# m
- //如果使用DMA传输数据,需要添加以下两个函数- H* C \1 c; s0 P5 S
- ADC_DMARequestAfterLastTransferCmd //使能ADC的DMA功能9 o2 A/ L' B+ L
- ADC_DMACmd //使能DMA
复制代码 6 u# R0 o& x, u+ h- c c
DMA配置需要用到的函数: - RCC_AHB1PeriphClockCmd //时钟配置
- W7 {7 {: R1 D! o - DMA_Init //DMA初始化
& k- z8 l8 B$ |. }# G - DMA_ClearFlag //清除DMA相关标志位: L+ S* n+ a- K$ x4 T. Y' k
- DMA_ITConfig //DMA中断配置9 X& G# O$ G% |. `1 d/ Y
- DMA_Cmd //使能DMA通道
复制代码 0 j k2 d u5 E' x
CAN配置需要用到的函数: - GPIO相关函数
6 d3 z$ t! \, m* ?" x - RCC_APB1PeriphClockCmd //时钟配置3 C9 f9 O3 `9 x' `7 U. Y
- GPIO_PinAFConfig //引脚复用
+ j' K. z- x2 e- @ - CAN_Init //CAN初始化; f# u6 r0 g% d! m/ Q; ~
- CAN_FilterInit //CAN滤波器设置(can2滤波器从14开始)& N, V, h6 | J
- CAN_ITConfig //CAN中断配置
2 ~. y5 l5 U% H$ t. Q' d! C" w" q$ N - CAN_ClearITPendingBit //清除CAN中断等待信号2 b1 P$ L4 _6 |# Z9 B# D1 P: n; o+ K
- CAN_Transmit //CAN发送数据函数(发送数据前需要配置数据帧CanTxMsg)
* J# M0 M8 L6 U; P" l - CAN_Receive //CAN接收数据函数,一般在中断中调用
复制代码
) C$ l: h4 H1 F% m* X, {) {US(A)RT串口通讯需要配置的函数: - GPIO相关函数! v0 ?+ n# n* D5 P- X! Z1 V
- RCC_APB2PeriphClockCmd //USART1和6的时钟配置3 r- Z% o8 t( G
- RCC_APB1PeriphClockCmd //外其它USART的时钟配置
! C9 y) d' j! y% d4 Q4 ] - USART_Init //串口初始化1 L- F$ A9 _! F
- USART_ClearFlag //清除标志位
3 v6 s9 r. p3 C. [0 b2 s+ z% a3 O - USART_ITConfig //串口中断配置
5 `- O# e* R- }- |$ F* T - USART_Cmd //使能串口
; D* s, L1 p" {: c# B0 j# z - USART_GetFlagStatus //串口标志位查询" Z- V4 k% p* b6 v; B
- USART_SendData //串口发送数据(调用数据发送时需要先调用USART_GetFlagStatus判断USART_FLAG_TC)
6 L4 K( }0 h; D N$ v+ T( ~5 Z - USART_ReceiveData //串口接收数据,一般在中断
复制代码 ! k; C" N, Z8 @$ c- U
systick需要配置的函数: - SysTick_CLKSourceConfig //配置系统嘀嗒的时钟
+ D+ a4 k L6 t9 J+ W - SysTick_Config //配置定时时间
复制代码
0 R" b4 a* R7 m9 eDAC功能需要配置的函数: - GPIO相关函数
5 Y) w1 l) ]/ Y+ B2 w( {9 F/ ] - RCC_APB1PeriphClockCmd //时钟配置
2 A( j, O% i* A" L T% A- \1 v - DAC_Init //DAC初始化
/ s$ j) e, h: k - DAC_Cmd //使能DAC通道
5 ?! ^" ]+ q+ f8 L/ p - DAC_SetChannel1Data / O, Z4 O3 I) c- F. q( R5 H/ y
- DAC_SetChannel2Data
W2 `- V1 Q% w2 h, i7 z* w! q, B J - DAC_SetDualChannelData //通道写数据
复制代码
1 ?3 q5 x7 N+ |TIM功能需要配置的函数: - GPIO相关函数 //有输入输出时配置,单纯的定时器不需要GPIO配置
0 a) n5 R# \% Z; d5 b! ?1 _ - RCC_APB1PeriphClockCmd //时钟配置,根据定时器不同选择不同的时钟配置5 e, a/ L6 r- `
- TIM_TimeBaseInit //定时器初始化
! S* I2 K0 C+ \ e# [6 W$ r) w6 | - TIM_ARRPreloadConfig //使能重装载% S/ o! d- L; u8 i3 I
- TIM_ClearFlag //清除标志位8 G, e3 H9 D0 {, [( Y
- TIM_ITConfig //中断配置
+ [5 R% ?5 r5 i3 [3 k! P - TIM_DMACmd //使能DMA功能(根据需要选择)
R* \; e, L$ @" \4 o - TIM_Cmd //定时器使能# w$ y2 E. |0 a1 J1 E$ {& B
- TIM_TIxExternalClockConfig //计数器模式需要配置的函数
8 y" Y; H% Y m - TIM_ICInit //输入捕获初始化,计数器模式,频率输入模式需要配置
( P- o& n% S& Y7 m - TIM_OCxInit //输出比较初始化,PWM输出,4 b+ c& B2 j: a; y8 M, g a
- TIM_CtrlPWMOutputs //PWM输出使能,定时器1和8特
复制代码 ' X9 q. f# B& [: T7 F
FSMC功能需要配置的函数: - GPIO相关函数1 Z6 T1 ? k4 w) k. ?+ n
- RCC_AHB3PeriphClockCmd //时钟配置
1 \: ?3 L5 p, X; x; C3 c, ~: U - FSMC_NORSRAMInit //NORFlash配置函数
$ T) s' H8 |2 Z7 R, l1 ~; x, p - FSMC_NANDInit //NANDFlash配置函数- n( i% C$ O- S+ T* ~& ]1 q* ]0 b
- FSMC_NORSRAMCmd //使能FSMC
0 I7 D! A" e2 l% b: n" s - FSMC_NANDCmd //使能FSMC
复制代码
9 m! a* p& u9 c) M) U1 B6 ^SPI功能需要配置的函数: - GPIO相关函数
3 s5 L; z, ^. `' L( p - RCC_APB2PeriphClockCmd //时钟配置1 b3 h3 t4 ?3 H/ u' m2 `! Y
- SPI_Init //SPI功能初始化3 [; ~) W2 K+ X/ H" J5 y+ ]
- SPI_Cmd //使能SPI功能0 N. }$ b# R1 }- p
- SPI_I2S_GetFlagStatus //查询SPI收发状态$ U# s5 F4 _4 b( S
- SPI_I2S_SendData //发送数据* p7 z, Y# M0 w' ^: e, w2 [) \9 `
- SPI_I2S_ReceiveData //接收数据
复制代码
* z7 i Y$ z( [. S* B% H% d外部中断需要配置的函数:
! y7 s/ q8 t1 ]. t" k, c5 l- GPIO相关函数
5 }* M, y0 J6 R/ j1 n - RCC_APB2PeriphClockCmd //时钟配置,RCC_APB2Periph_SYSCFG7 o2 k1 T) q; d+ l) T7 J5 s; y
- SYSCFG_EXTILineConfig //中断源配置
0 X- \) P4 E' k/ a6 e" B - EXTI_ClearITPendingBit //清除中断标志位2 j, R8 }4 A( ~
- EXTI_Init //初始化外部中断
7 l5 Q, U! y' J* \2 Q( @ - NVIC_Init //中断配置
复制代码 独立看门狗需要配置的函数: - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //写入0x5555,用于允许狗狗寄存器写入功能
: o2 \- o8 \ l0 g5 E - IWDG_SetPrescaler(IWDG_Prescaler_256); //狗狗时钟分频,40K/256=156HZ(6.4ms)8 f$ D( N4 r! H, U
- IWDG_SetReload(315); //喂狗时间2s/6.4MS=313 .注意不能大于0xfff,计数器数值
% d' ~$ z( }& o# C - IWDG_ReloadCounter(); //喂狗函数,重启计数器
) V, H6 c3 i! l, I( e1 ~ W - IWDG_Enable();
复制代码
9 e: n; _2 x$ ~( g窗口看门狗需要配置的函数: - /* WWDG 配置函数
; L$ D+ ^! M, U" p% k7 x: Y _ - * tr :递减计时器的值, 取值范围为:0x7f~0x40,超出范围会直接复位
/ n5 v4 Q# @5 X6 A - * wr :窗口值,取值范围为:0x7f~0x40
9 q$ g. V! T, { - * prv:预分频器值,取值可以是
7 o: d" j$ n1 Y$ Q! k$ I; o - * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(42MHz)/4096)/1 约10253Hz 97us
1 r7 P" X* `( q: E1 o7 Z6 i7 ] - * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(42MHz)/4096)/2 约5126Hz 195us
( C; y! Q c6 r- |3 a, w3 d2 ~3 j: x - * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(42MHz)/4096)/4 约2563Hz 390us/ l9 ]/ p; d- A' [0 `
- * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(42MHz)/4096)/8 约1281Hz 780us, `" V5 n* L* A3 Q/ f B
- *
* _5 U( O( z. e& O$ W; v* ^ - * 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40为最小wr最小值) prv = WWDG_Prescaler_8* X, \1 z* k6 F2 y% k
- * ~780 * (127-80) = 36.6ms < 刷新窗口 < ~780 * 64 = 49.9ms
q/ V9 [0 U% ?" D - * 也就是说调用WWDG_Config进行这样的配置,若在之后的36.6ms前喂狗,系统会复位,在49.9ms后没有喂狗,系统也会复位。/ D$ |1 R5 ^' f) p; L
- * 需要在刷新窗口的时间内喂狗,系统才不会复位。7 P+ h: T; X0 G# { w+ ^2 b( f7 I
- */8 q( c) }' }0 V! o* X) |
- RCC_APB1PeriphClockCmd //时钟配置# i( q4 k7 G: @7 }: U! ?% W% x4 G# w
- WWDG_SetPrescaler( prv ); //预分频器配置
7 v& l i2 w R( l - WWDG_SetWindowValue( wr ); //设置上窗口值
& A( S) t4 n4 e% m! f - WWDG_Enable(tr); //使能看门狗
( A, u9 N7 ^, X5 b- c/ N - WWDG_ClearFlag(); //清看门狗标志
( |0 m& C" k# ^; q- a# P - WWDG_EnableIT(); //使能看门狗中断4 T# J% Q) a; w& o: p6 R
- WWDG_SetCounter( tr ); //喂狗函数
复制代码 1 e2 A/ b. t& e' L* J
Ethernet需要配置的函数: - GPIO相关函数
S* F5 o( P8 W7 H7 _0 B: t! x - RCC_AHB1PeriphClockCmd //时钟配置
" v/ ?+ S3 S$ Y* B+ c! i5 i - ETH_SoftwareReset //软件复位
( U$ f9 ?/ v% | |) ] - ETH_GetSoftwareResetStatus //获取复位状态% X; l, t- v( V+ S, h! g
- ETH_Init //初始化
0 Q# H) k; H' ^3 P - ETH_DMAITConfig //DMA中断配置$ T" ]( F1 r& ^5 X
- SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);//定义RMII接口
复制代码 9 l9 Q% d5 |- A0 S- p# o
可能不是特别的全面,但是大部分功能应该都包含了,根据这些函数去初始化各个模块,就可以实现相应的功能。这里记录的只是各个模块初始化用到的函数,没有细节,细节部分之前有整理,后续还会根据需要随时记录一些函数配置。 记录整理一下,不知道哪天不小心又把记事本给删了。 文章出处: 单片机学习点滴
* d2 C" F7 C4 C! P |