请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 11:32
应用FPU
. c/ n) _6 n# [/ i8 C8 w8 D
  K8 P+ t* D3 D
20190703105214160.png

: R& a  [' f! c$ u: u" o$ Y
' c. t1 ~% Y4 D. d! t& W. c  n
0 J; ^: y9 Q/ Q( C+ `$ h; U+ W( z) D0 y" Z
1、工程文件
0 T. v4 v5 M$ S& D/ G/ t# }
& ?1 ~* H! e& u3 s5 ]4 \+ estartup_stm32f40_41xxx.s
6 Q( G2 `) l# T1 r8 N7 o
4 g; b7 |! }, ~2 P% x/ `2 h% p新建一个 test.c 文件,并保存在 USER 文件夹下
! L) y3 ?0 c  x" p
* A5 h2 {; Y  Y" e# X. O3 i! B1 k2、工程文件夹
7 L2 y) ]# @1 S  s& w0 |+ ?5 D0 t" C
USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,9 x& k; x5 }$ ^8 {: i! w  A& v. v
9 \9 q( {6 a" f; }* c; ?# [+ [' `
OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)3 e3 q! a, S4 T7 |6 {6 p7 x2 C
" t: C. p5 R% s
SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到
4 D, N, n6 I3 A# w1 l  M5 k1 l" M" ]9 F& C6 X$ C
3、工程分组
% c5 S6 C6 q$ c" x# I9 U7 |1 V7 d) p$ U/ r! z; `0 s% [5 x" ^7 {
Target 目录树上点击右键  Manage Project Items
  C' l# M" O, g: x
! ?2 d) x4 t, {+ u: H我没改文件夹,还是用原来Objects,Listings
- i( Q" u' _; H6 [$ F. f! H: O
" I  ~& d1 }/ x( j' u. v; X
2019070311235161.png
6 M: \- \# l1 j1 N

+ r# ^, t; N5 |: v
7 S! ?  w5 N6 ^3 K. ?
2019070311225613.png

8 y2 s# o% ]; w
# D8 F4 ^; L9 U6 t7 |; R) \( L& ]! q  n" \
4、设置
, _# n% G: e9 O- \4 d
% w% N* e8 F4 }& T
20190703111442709.png
7 e/ z0 d* y8 B' o+ b$ X

1 o1 w4 o5 G2 A2 I/ b) Y图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比- `+ v3 O' G, y/ _
如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在: u" I) w+ W3 Y. |, _6 W3 v* ~
MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加
8 o: A# \# J8 f# v' S" {3 Y进来。) S9 B$ b) j0 `) U2 E0 a$ n. D
图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果
$ @' K" [. c: c# d1 x越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代0 B6 Q3 I5 P: o- ]) d' F0 v
码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。# ^* \1 e& H4 r* f6 Q5 r$ `, y
图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,
8 [6 H6 _# f2 w+ T" L. Z可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代  |0 V# c+ i5 K9 B/ e
码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
' Q; ^8 S6 ]" ]- x' K; l$ D+ B然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件* o1 P. }1 l1 _2 \
夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后" Z- L/ @8 d% E6 g1 c0 I. k" }/ ]
面会经常用到)。如图 3.2.22 所示:
$ Y. d. g9 R% f/ X" U: X( t3 R1 J4 ~2 ?4 _
3 Z7 f9 E0 z1 u& Y9 L

7 m# P- k* t* `1 D编译遇到错误:
% {9 t; q: T% ?% R/ A0 j) ~& P
4 n3 \6 ~/ i1 ?/ \6 Q" ASYSTEM\usart\usart.c(38): error:  #260-D: explicit type is missing ("int" assumed)1 ?% T  |2 \7 I" z/ s, j' l' s" c
0 W5 `# G# e9 i7 s; `
解决:7 R! R1 I+ h5 v8 z7 A3 P+ |
( }( \: e0 D2 K& ^5 d8 N
函数前加void,这是printf函数的相关定义7 V: m2 P/ `' f6 q( \: ]

  _* z' q7 e& |. p$ _9 u" cvoid _sys_exit(int x)
+ T9 t; m* w% U8 I: U5 h7 a6 G
- `0 {6 k% _1 m' Z7 P5 G7 T0 hwarning:#1-D last line of file ends without a( Y/ D: C8 L: k0 s' Y/ q( Y1 T0 V
newline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个
3 m4 y( i$ b: D8 H; o* T2 Y警告,跳转到警告处,然后在后面输入多一个空行就好了。8 ]- a# T; g4 X5 [6 Q6 ^
- {5 B- Q0 R$ r4 w, s( j0 ~3 I
SYSTEM文件夹
* U" C5 W5 _9 J7 i7 @& j8 i3 V7 P* |# i+ P
1、delay3 |: T8 o8 b# _; |3 \' E0 Z
- f1 `/ F2 [" z1 j
顾名思义:延时函数文件夹
, b; B, R7 F5 U* j
) ~) t$ ]! }: h3 y. ^
20190703112603207.png

0 B/ l8 O& {8 E1 n( x5 j/ D$ O
***************SysTick定时器*****************着重理解
" b4 \- p+ o; d2 j% v! ]3 y- s) ^5 e$ g: h+ T7 ^) t
RTOS会用到9 p! ]7 f' |* B0 w# r7 L

1 ?3 G8 H3 g8 D2 V0 z' ]* D% c2 k
20190703112856883.png
( F8 D  r% ~5 V% I- x' s4 i2 x5 R, W

3 E7 u& q" w2 j+ ^, I9 W! w" g  c2 E5 X' W0 \! r

# A6 I" ^8 p8 W1 {% w& e5 k) Fsys文件夹5 V3 ^: S: K/ t# b1 I

+ d! C  `% A9 W
20190703113106512.png
% r" K$ ?3 t: q; G  ^7 V1 O, ^

9 B; B, K/ a, `5 @! L! i2 R! @2 T sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件
# ~8 p+ P4 _' b2 t6 w  i3 j& C2 ?/ U6 Q$ d. B% X; a
sys.h
3 Z4 k4 e; J' e/ F6 ?9 i
6 V) q- W5 z. t( n$ x1 p实现对 STM32F4 各个 IO 口的位操作,包括读入和输出
. B9 t+ Z" k2 j9 N
4 Y: l$ _5 v& Y& P3 i2 F PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否
. |) K4 `% _" Q+ R等于 1,则可以使用 if(PAin(14)==1)7 o7 z1 X8 `4 |4 x7 T/ r% j+ S
6 y: m; R  K) }( Q) g; ~
  1. // 9 I4 k3 i- j- L; q
  2. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq);                //系统时钟设置( k% r6 H: d3 B$ t$ x; v. |, f  @: g) `
  3. void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化  ' g) F9 Q$ M6 p' ]5 x
  4. void Sys_Soft_Reset(void);                                                              //系统软复位
    & ^  {3 U3 t. S* s8 E5 O
  5. void Sys_Standby(void);                                                                 //待机模式         " j, ?: t& t' `" L* O# `! _# x& V2 m' e
  6. void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);        //设置偏移地址
    3 B3 |3 |/ G/ W3 B8 y: Y
  7. void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);                        //设置NVIC分组
    # T! A3 |9 T4 ^0 U- g) q
  8. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断" @. o3 w4 f6 r' d! w+ L3 C
  9. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM);                                //外部中断配置函数(只对GPIOA~I)
    + T' H+ x1 K9 K: `: |2 |
  10. void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx);                //GPIO复用功能设置% a) f1 D. M% F
  11. void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数  7 v; s4 _( W2 Z. ]
  12. //以下为汇编函数& Q8 t2 @! d) E+ j) k# H) E3 e7 D5 O
  13. void WFI_SET(void);                //执行WFI指令# A( h9 g. G, s& \% `
  14. void INTX_DISABLE(void);//关闭所有中断
    8 q" D6 s1 h. i: P' ^$ N9 @, t
  15. void INTX_ENABLE(void);        //开启所有中断3 U& D# V, h* T7 w5 [
  16. void MSR_MSP(u32 addr);        //设置堆栈地址 5 x( `, O$ n2 q
  17. #endif
复制代码
5 |' l1 l, r" {" k  x$ j5 m/ X
************************时钟配置************************************9 e# m4 A5 x2 ~$ y/ i  r, R

& m. \+ _7 O$ D  V' }4 A* Yusart 文件夹
2 C) \0 ?, d( ^( ]2 X) W7 P& d8 `6 K  _6 B  G  I
usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收
. h9 F  `* }' h1 ], J2 }
, K1 U& E/ `, a) p7 Y8 ?- {: B$ |# gusart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32/ L; @: I# ]3 g, b1 f
pclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使
3 U$ _8 a4 I2 L! g
1 S) N' v" r' q- Q' V+ M( ^) _* V) W
在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!
, _' j5 ?6 U! [1 w. z8 Q" z2 K" W6 U  W3 n$ s3 @* L3 R- C
20190703182927542.png

2 a5 c4 a, W+ b) o& b4 _# p' m9 Q6 b
RCC->AHB1ENR|=1<<5;//使能 PORTF 时钟
8 K' i8 G  K/ v* p9 @" N/ ^* I$ ?+ X* C# i

/ z9 t! Z5 z4 |, W" z4 xI/O   输出I 输入2 V$ X5 e$ q- K, n) s8 e' ~; `
4 P6 G) }5 V5 g$ m5 m
1、使能时钟5 U7 `# k+ f- f
% Y  z; S" r* S* W
2、IO设置   void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)' [7 [" ]9 J( q* B! J- R0 u

6 |& q' }! p) ?, ?: ]4 `/ d8 e//GPIO通用设置 # Q5 _7 t& T0 v; S
//GPIOx:GPIOA~GPIOI." n7 Y% R7 g3 g: ~' w* ?" R! W
//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.( Z2 b4 H  U% g( y% D& O% O
//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.
* v; P: b. K8 j' D4 {9 o/ B% l//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.
4 Y/ o8 ]' A# M; V( ]//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh.
7 p3 `8 m7 Z8 }# L7 U* O: L; B, f//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
& G: {/ K  X! h. D5 y( N' z//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!5 `  x) a6 H, u; E. f& C+ A

6 L1 d9 W/ J, m% S9 U3、PFout(n)   PFin(n)  r% d  C2 G  C7 f( @3 d+ }
! f: n6 C" {$ F# q; A
3 C* g& D, h- G/ m5 a' @
串口' |0 o9 ^. X1 u
; u! ]  R" @/ Z" L4 O
STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,
5 D) T- @, S6 G9 @  L& V! ]' l& [5 {: j& P
uart_init(84,115200);  //串口初始化为 115200
. Y0 p3 W# @7 K: U6 T! ^  g1 F* x( P5 @" F  ?- N$ G+ [, G

4 h+ {* X; }: M2 T. q0 T# Y# ?
收藏 评论0 发布时间:2021-12-6 11:32

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版