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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 11:32
应用FPU
$ M* b& ]% w) B0 Z
* w* f% ]  {3 E* h8 ~* G. w/ Y
20190703105214160.png

! p1 c& G& Q! X* N4 \4 m/ t, C) C. C  a5 o" F' v

0 k2 H- y+ P) d/ \, P  x' c9 ?9 c& B$ M4 V3 G5 c; W$ b+ G
1、工程文件/ v6 Q$ K3 P, O5 o; T4 q/ [
. J' o7 M6 `: |/ p& T
startup_stm32f40_41xxx.s ! o" K  p% C) i' D4 h

& Q% U+ H0 V& I& R新建一个 test.c 文件,并保存在 USER 文件夹下
0 Q1 l5 \$ v7 l$ }: ]7 P2 U* R0 X+ ?3 |  f- {
2、工程文件夹# x# a7 o1 ]* F8 g) R( T$ [; [' P( V$ d

6 h) S2 N  E: ?7 BUSER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,8 I5 @# I/ _) t3 g
# r" F. L+ z7 E# y
OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)3 H* O* j+ R; m; J- x1 Y3 s+ x1 }1 H
/ Q5 v5 L1 |: U7 h
SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到
) w( Y2 t* n( G/ Y3 @7 @6 \( H! d6 g2 T
3、工程分组
- x( p) ~4 \/ g& F6 V4 T7 t% J+ P  u5 @2 E2 H
Target 目录树上点击右键  Manage Project Items
! F& h  H6 r; U/ F+ s* v: b4 Q- d4 {5 h' \/ D* i* \1 P$ _
我没改文件夹,还是用原来Objects,Listings
9 g9 q/ J0 a) ?, \, s
$ G% M% ~- `; q# z3 Y
2019070311235161.png
7 D0 o" m; D6 H. |
. X1 i; {3 R8 @

8 i# F7 y5 @1 u
2019070311225613.png

$ T8 I& T: e$ V% Q( E( b0 N, G. B% e* ~) ]; s" F. t2 s
; l( Y0 E' ^& q% ^0 y1 s: x
4、设置
1 I' [! U& y$ L1 r% {
1 e! I7 ]5 r  Q9 A" Y+ f4 x+ h
20190703111442709.png
9 Z# k2 c# ^. l  Q. `5 {% `1 n

! w$ g2 K( S' v! f3 h3 h图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比
# S/ Q" v3 m- r( q! Z如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在# Z* [1 l+ m6 Q- X6 m6 x
MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加, R, g5 ]$ z) C2 V  L: i. N6 S
进来。) J; H0 b3 p1 g5 `1 {! L* h* @' ~8 L
图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果
. D4 o: L  {, @/ G越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代: A+ z' T- `- y, |
码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。  p& X- V; Q. f& Z( V6 ^
图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,: ^' w' a, s3 }# v
可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代
% P3 w/ i( }4 i7 U/ K& d$ S码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
# y: y, M- {; o0 c然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件
2 T% ^8 k0 p6 [) f8 t( l- Y: e8 I夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后' W: ?  F0 p' e9 }5 @8 ]; c+ A
面会经常用到)。如图 3.2.22 所示:, m7 T) C  C8 V2 f
  A! I) i; Q1 X% t  I; s- F/ a& ?

( R7 o  O" W$ m9 u7 @" ~$ ^( d$ g
7 T6 W0 x' k1 L/ X9 t. w# H6 j" ~编译遇到错误:# M# t0 i1 D# @: [# }. y$ y$ y

- G) t. C) V5 x9 N2 E$ SSYSTEM\usart\usart.c(38): error:  #260-D: explicit type is missing ("int" assumed)8 w* }& e6 k" \7 n0 l0 {1 a/ P, g

; ?7 S, P# ~( p- D) I解决:
5 k% C) Z  y# h- \+ W9 p! F, q7 B2 h% v
. |  N, @! }  n3 N: |% v- k函数前加void,这是printf函数的相关定义3 U5 R3 n  K: {4 z2 C) H

$ P0 Q  p! m: g6 n! Z6 Yvoid _sys_exit(int x)' h4 C! t, M& b4 p+ F/ e1 s

2 y; D0 j  r9 {$ y6 R, U2 kwarning:#1-D last line of file ends without a: \+ Y& d/ c; Z" M4 s; H
newline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个
2 |7 h  W5 |3 G6 h; }( O$ E% `警告,跳转到警告处,然后在后面输入多一个空行就好了。
0 Q1 t1 B5 q$ l9 l% j: r% d; X% b( G; I  Z
SYSTEM文件夹% t9 U$ {' s6 x/ v$ [
3 Q: G* k" X1 W. q! G1 s! l
1、delay9 _. h) Z9 s* [/ X

  u8 D9 h/ E% ], Z; v顾名思义:延时函数文件夹
4 V# D* o8 Z) x  ~  H  e
% p5 L+ @" R4 x. o  c
20190703112603207.png

: U  Z% F, O, h2 L
/ `. e/ ^" ?' j***************SysTick定时器*****************着重理解
% N. P% ^% y* m/ f/ s8 J
" M) u3 S$ y9 j8 r% e4 z! cRTOS会用到
. B. [9 U$ v' l/ n8 k$ |
/ A7 E2 G9 s, ?+ K+ v
20190703112856883.png
( J- J; {! L6 c8 |" k+ l
2 }# d% a$ U8 t2 j* U8 g
: F& _3 u8 {$ Y
: W8 m1 A& J4 H/ v$ M' D
sys文件夹1 P; U4 Q/ y: l5 }% `

; D6 j9 Q" v# a3 c' U7 |
20190703113106512.png

) g. f( n& Y* u+ R6 b0 ?; T0 R8 m
sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件/ Y; J. e6 P% L1 z
1 ]% |! c* k/ U6 P- K
sys.h 8 c: {, O! t/ J# v

( R# t1 v7 ~7 v7 O% C实现对 STM32F4 各个 IO 口的位操作,包括读入和输出3 K4 u+ g$ z! m- C
+ m0 [7 v4 v/ c. r
PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否1 \( _1 y2 `2 c: e: y2 ~& P
等于 1,则可以使用 if(PAin(14)==1)
0 w7 N' [" k9 x) o6 J. D; e
4 }7 d0 y- a8 z5 F
  1. // ! p9 Z$ W6 d. E" ]7 e% r
  2. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq);                //系统时钟设置
    * t% [3 ]# O3 E9 z) _) U  v2 W
  3. void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化  * g" H, O3 p  Q8 z4 S
  4. void Sys_Soft_Reset(void);                                                              //系统软复位
    9 }* j4 H4 d! f" L7 [
  5. void Sys_Standby(void);                                                                 //待机模式         
    + X$ \' k+ G: Q/ g
  6. void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);        //设置偏移地址# O" N1 v% ^3 L) g2 ]7 h
  7. void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);                        //设置NVIC分组: r, m/ d8 k3 R& U( L. `: q
  8. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断5 x5 `. }2 E8 q, t  }9 B
  9. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM);                                //外部中断配置函数(只对GPIOA~I)
    3 {' ^2 p8 {+ m" p8 r
  10. void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx);                //GPIO复用功能设置
    , y4 @" }- U3 e; A" b8 t" v3 O6 Q
  11. void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数  
      d$ U5 G/ h0 x- \; s7 q/ D# Q8 x
  12. //以下为汇编函数( o0 s3 z2 g/ j7 k6 O0 \- x4 C
  13. void WFI_SET(void);                //执行WFI指令
    $ N% y; p7 E/ I3 B8 [
  14. void INTX_DISABLE(void);//关闭所有中断4 z8 n  g8 @: V( p- |6 B% |
  15. void INTX_ENABLE(void);        //开启所有中断% s4 Q. G; a( Z
  16. void MSR_MSP(u32 addr);        //设置堆栈地址 - m/ W6 e5 T6 C/ n8 R6 }
  17. #endif
复制代码
. }$ h2 @0 V: q; k
************************时钟配置************************************
  W3 h; `& |/ A0 ]
* V2 }2 Z$ r; U- \5 a5 }) wusart 文件夹0 L* C! C0 B/ O% ]( [" z

; u  M: _+ ]: x usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收! F: s: H1 T9 w2 [8 V7 s# G- y% h6 ~
6 Y5 {8 H: a! f/ m4 E
usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u323 I8 F8 ]9 l4 M& @- w# X/ z6 y
pclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使& A" |6 |; L; `& y. T6 [- ?7 x

9 Z- a, Y- J+ d: j; M$ m# ^
/ o' d, }& i- r在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!" [$ a9 R; h2 y; x) a/ f# u
1 V: s5 \! b( W8 ?# P2 \
20190703182927542.png
3 z+ G% G- a- ?. W

8 d4 j, p( t" s( LRCC->AHB1ENR|=1<<5;//使能 PORTF 时钟7 ?9 c" c# j* `* ?
9 C$ z, `1 D4 ]- ]
5 o& P% Q. }6 T9 e4 U# R' D/ Y% t
I/O   输出I 输入( V& X2 y2 L. X7 ^$ T
4 r4 P7 N# U8 B" p4 M! {! N; P
1、使能时钟6 z& K- c$ e7 p- @1 \: g

5 [8 ?5 c5 }8 ?) w2、IO设置   void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)) O, a5 H: p6 h% K7 G7 I% D4 F
( n' A* ]' H2 I4 `3 }: c
//GPIO通用设置
6 g& V2 I1 R; I% n//GPIOx:GPIOA~GPIOI.2 @7 [; H1 E; C2 S
//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.
; Y# G7 j/ ^' L% \8 R! W//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.! R8 p1 u% k0 @1 A. i8 X, u7 Q% e& X/ j" c
//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.
6 F' m! i. u' o9 M: A8 R" f0 Z0 m//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh.
% y  e5 j8 m/ {$ o& ~9 R; N2 o5 Q* q//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.: O% ~( @# @: a, R2 R
//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!* P9 C9 {5 [$ ]$ _7 S# ^

7 u2 w% {1 a7 D+ x3、PFout(n)   PFin(n)0 s8 w( q8 o, J; Q: L

  I6 F( I! j. e/ W( \
1 N- C. _1 p& \$ E& v9 `5 K串口8 t" R3 T; j4 d4 K  o( j/ K
5 j7 M' G1 j$ m
STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,; G% g1 f' U' Y1 K
" ~5 u" b9 L6 k1 J. N
uart_init(84,115200);  //串口初始化为 1152003 f% X* r9 u5 W: s9 |) K

% I2 a7 ~" ~7 k/ M; t! l. M
! b. ], P; R) q& F2 e7 `) n2 ~! p
收藏 评论0 发布时间:2021-12-6 11:32

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版