你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】正点原子STM32F4笔记

[复制链接]
STMCU小助手 发布时间:2021-12-6 11:32
应用FPU
+ b! x" L$ G3 {- W$ g, j5 r. Y  I! l. w; L+ [
20190703105214160.png
2 M& Z5 s! a3 t  u( f
- C0 L, q7 c4 P) Q* i# P" E

6 s2 J  l* \" d6 q. R# P# s; k( e; s$ G
1、工程文件- R6 ^& p9 l3 G( k0 h: G9 }, j: }4 j

- J0 X$ `" D" F2 R& z1 z0 B% H) @startup_stm32f40_41xxx.s . p( x8 q7 x" }7 \, |" y

" B1 D6 k3 b9 u  k" `. I新建一个 test.c 文件,并保存在 USER 文件夹下
  b1 i" `1 p* u" O& U% l# S& B9 c. \) ?6 o
2、工程文件夹- ^/ ^5 V+ U$ Y1 N, u1 I% z9 \& e: W5 H2 o
. ~  q( ]" k5 h- ^
USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,
* N& d& w( e/ ^9 ~
1 b7 n3 h( P) Q9 r2 z/ jOBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)$ I) L, c2 \! n+ p' u$ G  B
) G+ e9 l( V/ l* _3 v9 C! y
SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到4 i1 i: v5 E: ?# D3 y- ~, m; ^4 E+ x

- b8 A* {& @6 F8 D. ~3、工程分组4 i; E9 N7 D0 W  S, z0 n

0 g; H% F2 w/ C+ O9 w Target 目录树上点击右键  Manage Project Items0 e5 X2 x& Q0 \* ~9 y* H& A
+ J# e/ `9 U7 F
我没改文件夹,还是用原来Objects,Listings
+ \9 T: R9 z8 I1 ]* K  @
0 K1 s2 D' ]2 T$ c* g
2019070311235161.png
' K4 h6 i, E4 f/ l
5 G. @5 U1 I" \5 e
$ n% R! _- K: H3 z3 z
2019070311225613.png
3 B, w7 Z/ R+ {

2 e% n7 z5 f3 ?+ l
( E4 I5 z0 h! s9 B8 T2 P4、设置: \. W% O3 d2 l9 X7 @( S4 k

  g% N- Q" L/ R4 ]
20190703111442709.png
( a$ o8 l- s) R6 L3 c7 M# |
2 k0 U2 a+ R5 [7 k7 `' u7 X$ @
图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比" P8 F" y- t+ \  m/ M# i3 E, y5 h( L
如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在
; m+ _- S/ z' w) H) u+ uMDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加
" H: n4 J. N. b# A5 {9 S/ V" x进来。+ e: P/ _) v; ^- s- z- T
图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果( e1 _/ z8 V) {! z0 H4 ^
越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代+ @4 [% s" T, l7 ~* Z
码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。
0 A) U$ u. K! f3 A4 w图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,
# o7 R" E/ y( E- t+ M& A可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代
) m+ [6 E! _) a5 z6 g, J* ?码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
" q$ V- o4 K2 J1 C; X; i. P然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件0 N  [% ?/ t- e% N7 H# G; e
夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后
6 m6 b/ S+ b9 ?3 [2 T7 {- A4 T面会经常用到)。如图 3.2.22 所示:0 Q( K- F( m0 F& i
: r. s; D  s) O7 g' j9 N% N* @  T
- q  D% [4 x5 Z( W

4 y& }8 ]" _' n6 b$ E3 ]编译遇到错误:
/ u* `8 f, x4 X/ P
$ y. p2 A0 I4 ~' t! Z! \; @SYSTEM\usart\usart.c(38): error:  #260-D: explicit type is missing ("int" assumed)8 G- u1 }; a7 {+ T

7 [  S2 x" {# n0 ?解决:
) C: }3 ^9 D, |* F; `5 z* H8 Z3 l$ I3 A% p9 X
函数前加void,这是printf函数的相关定义  q  i9 b- L6 m1 \; l4 J) D* u
8 V8 x9 t, A) V
void _sys_exit(int x)5 I& M; @3 D9 b3 H5 v- W5 Q- Q

; e! a5 C! ], o$ L( R. x' }/ Fwarning:#1-D last line of file ends without a
5 e1 s$ {5 p; K. Hnewline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个
# E/ J9 h! z5 h* T) }$ `0 }( h警告,跳转到警告处,然后在后面输入多一个空行就好了。
. L! K  K$ z0 ?: A, S1 j/ f' t% t; z: ]: |& I7 ~( }4 x
SYSTEM文件夹
: I6 H8 }$ a: ^# ]5 R: d% b0 u* ^
1、delay' e4 m7 T) a( j& C

' ]) T: ~7 v5 ?6 y) [% w# L顾名思义:延时函数文件夹/ G- g/ X- }; A& U

, @. \9 g: v! C1 i0 I, o% x
20190703112603207.png

' P  s+ }  K7 M# b
& L& ]: y2 r# ]2 h- T/ p***************SysTick定时器*****************着重理解
9 c$ f- s; h1 n$ U+ X; Z& m: D+ U1 Q; _& U
RTOS会用到
% R* O* C. K5 ?; ]( r/ U; l
, {' C8 s; z; |2 f1 I% M4 D
20190703112856883.png
1 x3 o7 C# T$ W$ P7 w& P: i3 S# o

7 I- ~5 ?  Z6 S( o5 p% k9 z& ^  }! g6 n& G2 m3 [  w% `7 {
+ F9 Z4 g$ X7 ^
sys文件夹
+ T( D* v, J7 {# f8 l
; [" ]+ u9 p3 p" _/ p
20190703113106512.png
* H. B* f4 f  K% i" \
4 s4 j# q- S, m4 p; Q
sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件; J' b1 ~+ G3 q
; l+ W) m4 X6 Q5 s/ K2 U6 A
sys.h
$ H1 _+ Z4 q$ g% g4 u$ T2 g" k) t& L4 {; T
实现对 STM32F4 各个 IO 口的位操作,包括读入和输出3 Q8 ?4 h+ S* H) m0 M9 x  `, L
5 X* G: B3 |4 t2 a) r, X! m
PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否
1 q' P) @$ G4 h# Z0 d等于 1,则可以使用 if(PAin(14)==1)
* M  v, X7 w* [5 d$ q: f
/ @' T- p) V4 d  A% m% g
  1. // # V  R% t( J" C& O! t. @; C
  2. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq);                //系统时钟设置& p  M4 j3 x! @- ]2 b3 V* A
  3. void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化  
    * n- d# K% e4 u2 ?8 E6 f4 E! O% T/ @
  4. void Sys_Soft_Reset(void);                                                              //系统软复位! \- B) d* r3 t# G
  5. void Sys_Standby(void);                                                                 //待机模式         # G0 w+ X5 Y5 T, ^6 i& J5 W
  6. void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);        //设置偏移地址
    2 I. |, @( i. d0 c/ C7 c
  7. void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);                        //设置NVIC分组
    ' T) D1 q- a* l1 `- B) X1 C& U
  8. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断; n8 |& h2 u( w& z9 }/ _
  9. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM);                                //外部中断配置函数(只对GPIOA~I)
    1 ?' j+ x% S0 Q
  10. void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx);                //GPIO复用功能设置7 F$ h& n  [  j( f- V0 a: F
  11. void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数  
    # ~2 M& V( X# b
  12. //以下为汇编函数
    ) ?; h! L4 s0 J9 t0 Y$ Q
  13. void WFI_SET(void);                //执行WFI指令
    # N4 g( Q8 V# ?* D8 e; ?
  14. void INTX_DISABLE(void);//关闭所有中断
    $ e; h  r. A/ _- a3 q0 b5 C
  15. void INTX_ENABLE(void);        //开启所有中断  s4 p* Q4 o0 L# Z8 N" t9 x  @2 E. x
  16. void MSR_MSP(u32 addr);        //设置堆栈地址
    % o, p) V) Z2 K# R
  17. #endif
复制代码

1 u# A. _1 F5 p  I$ D* I9 B4 a! V************************时钟配置************************************+ ~7 N" J6 g6 |' c$ S& g
. m! ]% L. ^7 \$ m) _
usart 文件夹5 X0 K9 l; R1 m- m# S
( Y( ~1 h; D! {) x7 ^! g$ H+ G
usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收
, S3 ?/ m3 `, m4 i
1 l9 a8 I3 D* O' \+ _% v1 E7 _usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32$ R0 e- s% w: N7 W/ u$ c  F0 I
pclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使, S- U) \. _1 x  g8 Q9 o, W

9 S5 @; j) N6 l2 p! z! f6 P& u( r9 w- i$ C0 X! J& N
在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!8 d; l/ X5 j5 |, c4 y
4 G* Y' x& p6 N3 l8 B' z$ {
20190703182927542.png
1 @1 j, O7 ~+ p3 Q% n2 e: I
4 f3 R2 A4 X- v4 h
RCC->AHB1ENR|=1<<5;//使能 PORTF 时钟0 ]+ M$ k( d% s! L4 b: X, A

% s9 s7 e7 b" X$ a6 ]+ p1 f
/ V, k5 @/ {" ]& }1 VI/O   输出I 输入) M$ @" W: \0 F0 C6 D" a& j
# o/ E: n, ~0 |+ p0 T+ M- p
1、使能时钟3 T; J/ l  `' m. {
9 K% A9 w6 Z7 [: x# j8 _
2、IO设置   void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)
2 i2 F9 C% S. U& w: \$ `" N" ^& y
$ E* [2 e! _, `  C6 T5 x//GPIO通用设置
" k9 F8 x# c! W- p//GPIOx:GPIOA~GPIOI.
( v3 @2 g" K8 m//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.
3 j; _/ B4 a8 C0 {7 _, g//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.
7 n2 }* {# o, d2 W' G//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.0 N- V4 X; A0 e9 b" |. C
//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh. 2 e5 a) p: ~: D' U% ^* `
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
) ^* [" C1 g$ ]: P/ \! ~: Q//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!; Y% D) V9 N% `$ S- j, `

: k1 c) F; I  M5 U. k0 w3、PFout(n)   PFin(n)
# J, P3 Z: Q% |; @/ D6 K/ P( A0 g% @4 ~1 ]/ z2 ^5 X  C
! u( Q# |6 ?$ h) o. I2 c
串口  y% d# e# _8 v
3 R6 e# T" ?2 A1 }. t) K6 p
STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,. k2 d# P, n: q. q* n" ]1 I* M
, P& S; |! ^3 v5 S
uart_init(84,115200);  //串口初始化为 115200! p3 r6 r& c2 ~' C% {& R
; h" x) v$ Y( I$ Y( ]! `3 r, G

( K. ^- D0 h9 y% D
收藏 评论0 发布时间:2021-12-6 11:32

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版