|
STM32单片机应用笔记(一) 一直以来用的最多的单片机就是stm32f103和stm32f407,可以满足大部分的需求,性价比比较高。另外,资料多,上手快,简单易学,官网给出的例程中基本上把各个功能都涵盖了,按照例程裁剪一下,修修补补就可以完成自己的需求。当然,说是这么说,其实一个功能初始接触的时候最头疼的就是那个修修补补的过程,好在网上也提供了很多例程,可以参考(以前觉得百度一下就能找到自己想要的例程之类的,现在发现有时候很难找到自己需要的,比如我就想找一下定时器的配置代码,找到的都是一些分析定时器功能的文章,关键是各论坛之间互相复制粘贴,基本都一样,很是郁闷)。这段时间空闲一些,整理一下各个功能模块的基本配置函数,以后就不要到处找了。 GPIO配置函数: stm32f103: - void bsp_GPIO_Conf(void)
; R+ U% F, `6 y& t. j6 M" e - 7 L1 U3 Y* d' C ~( o
- {0 H1 L$ n( f( U- F9 m9 \! }
1 b. N, A3 o# {- GPIO_InitTypeDef GPIO_InitStructure;
! C$ P1 d& b J
/ A0 Z3 ]: `0 T$ V- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);. w* G# h$ ~+ V. V% z
- ; {' w& N. y8 @4 n3 {& ?
- : V6 w/ @1 R3 K& B& x! Q6 U
- % @3 g: o: ^* e# W' x& S$ K
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;! F' p, d" j, s4 v
- 8 Y* r* l- R/ u
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
Q" ]( H% |1 h1 y
, z0 ^2 b0 p# @6 a5 T- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;) O0 x; y2 N0 A. ]1 P. d4 M5 R
- 7 @- a, d- B: m2 H# i
- GPIO_Init(GPIOA, &GPIO_InitStructure);
" }, R# l" F( C/ E
, b/ \7 Y0 q0 Q( O7 o* _- }
复制代码 ) ^6 M1 I0 l) s5 S7 P
说明:关于引脚和速度不做过多的介绍,主要说下模式 输入模式:可配置为上拉、下拉、浮空以及模拟量输入,根据电路需求选择上拉或者下拉(目的是为了把初始电平置位到一种状态可以认为是一种保护措施,例如外部电路是高电平有效,这时我们就需要将引脚下拉才能保证上电时电平为低不会使能外部电路功能);浮空输入主要是通讯引脚Rx配置,另外定时器的输入捕获也会配置成浮空输入;模拟量输入主要用于ADC采样 输出模式:模拟量输出、开漏输出以及推挽输出。模拟量输入主要用于DAC输出,多数情况下输出功能都配置成推挽输出,开漏输出主要用于电流型驱动,需要外接上拉(没有电源需要外接电源) stm32f407: - void bsp_GPIO_Init(void)
- d8 Z! I6 w: Q9 N- F
5 ~ [$ Z6 t2 M& P- {
0 m7 Y2 \- n; c
" n1 [: ]% d$ y7 e- ~7 F- _& |- GPIO_InitTypeDef GPIO_InitStructure;
0 _! W3 G# k+ |
, ?1 l/ P3 X, L% G-
1 O. _: t- C% F9 ]5 c( B - ! j: W5 V- `. Y$ |4 M8 U
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);2 _9 R2 H* E) O7 J* |
. L; a9 A7 s7 y: D; f2 f- h- " C; o& {6 W$ @3 Z% O( `$ B
2 m3 ?) j6 I: B& D6 R- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
1 y4 Y9 c( s8 b* T
% } v7 K% K& \) M2 q% k- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
8 ^& \! J+ V# U6 n, F3 u
! C: @& R9 j* E# k- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;! C2 R. D! h! A& m
- 9 V& l. w# T, a- O
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;2 M6 L8 T4 F* X+ c) z$ H, |5 T2 x
& r! n1 e n: K& O/ v b- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;: G8 a& Q# z% |- g: u
; T6 I A6 {1 r4 H- GPIO_Init(GPIOA, &GPIO_InitStructure);9 j% ?. o6 c( b1 b
- + A" A2 r! V( e
- }
复制代码
3 w$ `* u5 T4 `( W说明:407与103的的IO口功能一样,只是将输入输出区分开配置,可根据需要进行配置。 以上是我曾用到的一些功能的总结,可能理解上有偏差,后期补充修正吧。以后整理各个功能模块时都会把GPIO的配置贴上(有些地方自己都没注意到,一般配置都是直接从以前的工程中复制粘贴过来的,需要好好了解,研究一下)。 GPIO的配置是各功能实现的基础,同时也是最容易忽略的地方,通常都是复制粘贴过来就可以使用,但是有些时候就会因为操作不当导致出现问题。比如:上下拉配置不当导致上电时输出模块上电,导致发热过载现象;输入配置不正确导致检测不到外部信号变化等。因此,最好是吃透GPIO各个模式适用的场合,避免问题的发生(尤其使用一个新的功能的时候,你会反复的查找是不是新功能配置有问题,往往忽略GPIO的配置,很麻烦的一件事)。 简单的整理一下,算是一个开题吧,以后会陆续的把各模块的配置函数,甚至一些感觉好一些的应用函数贴出来,记录在案,方便查找使用。 文章出处: wenzhihua , P7 O) n3 Y3 Q1 ~/ d. c& \
|