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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 11:32
应用FPU
2 k: {! ?2 E6 u  O! V, e$ y' y7 E/ A  T" p5 a, z
20190703105214160.png

5 Q9 G/ y% o" E' V% l% X, O
" L6 n. @* K0 U. l: v0 v* d4 w$ c6 B, o# J
  O, o% M% M; D& F6 J% }  _
1、工程文件
  y$ B; ^3 E' s" J4 @5 y& M" I* z
startup_stm32f40_41xxx.s : J( ^+ D0 Z* X0 A: ]* g9 R& x

$ W9 y& s" N1 u) J新建一个 test.c 文件,并保存在 USER 文件夹下
( Y- x( G8 z0 r
; {. j+ Z/ Y: ^, s+ r1 J; k! o8 j$ }2、工程文件夹1 U0 }! ?* r9 s! O+ Q: s) O2 I

: l% e" s% @* ], u# {9 ^2 L8 C% B9 @USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,1 x. U3 u. z& m9 p. H* W. K

7 J: D# I' ~% N( M- D" Y8 M4 V! D/ eOBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)9 N! C4 \! a. X" a
* U" L5 E/ ?. o" m
SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到+ V/ H! P, c/ E
" Z2 X) v7 e. [  M8 k% l
3、工程分组
, F0 X" g9 N) R8 n# C8 A6 C# V' h/ X- ~# ?: I: o
Target 目录树上点击右键  Manage Project Items
, ~! i# i; r2 v8 d% B1 T
  k% H+ V9 e6 L& \6 n/ i我没改文件夹,还是用原来Objects,Listings
6 Q4 ~0 m  {3 j& v2 ^& w/ z; C: N" W
( V% I, y; [+ F8 Y0 y8 G* ~; d
2019070311235161.png

" Z3 {2 z. C; u  f: }) E
  q' E. g9 [2 j( I
' @8 p/ C1 W1 a! A, U+ ]
2019070311225613.png

3 t7 `) f  H" f1 G* a# |
% }6 e" C2 q- R/ ?) o' `; q+ X0 h& e& q, I+ Q1 s9 Q
4、设置
& O6 h0 B3 T$ |4 A. u4 _  T- q: Y, ]3 x. n1 G/ K
20190703111442709.png

. h- p. s/ k, Z) S. _% s
4 d. F6 {- G  ]  }  @图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比
6 @/ y+ |* t7 o+ j如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在  ]* K0 {; ^- A/ M
MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加
: x3 `7 d1 i0 R$ Q2 }4 V进来。
1 `8 i* X: j  q, B- s) w3 O1 @图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果$ m4 l: \4 B% V% V+ `
越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代: U0 `3 ^% q5 S8 n
码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。  i! ]$ ]* ]1 |8 J+ @
图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,
$ h/ a, {/ u9 M& H" g可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代  q7 v; F; e6 n4 o% O, s0 |
码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
' b' Y' m4 G4 Q, n! w! ]$ x然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件
$ d/ f7 V, o  W! Y. f) h6 d夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后$ ?# A1 ~* n$ A* ]1 Z
面会经常用到)。如图 3.2.22 所示:
3 s& B& w" o+ P; o3 T, E
" Y) m$ E" v( ^$ q" |' o( F' R6 `9 S8 l4 ?( j

* A  R# b/ J0 k. f2 C7 U, `' L& e编译遇到错误:* m8 E9 J# S8 A$ L

! g5 N5 S2 L* i+ `" H( hSYSTEM\usart\usart.c(38): error:  #260-D: explicit type is missing ("int" assumed)& |0 v3 \2 o; x  \# @- I

# l! L0 K( z! B9 _1 H& ~; G3 ]解决:
8 C! r* U( `9 X. w( @0 B, \: V
* L) `# K8 d; p8 h函数前加void,这是printf函数的相关定义. w9 s" b+ c: N- T/ r. O0 i! b

7 u  [( e$ f# xvoid _sys_exit(int x)0 ?8 F  Y) n: v
6 M( U$ I! i2 C! t
warning:#1-D last line of file ends without a: R- a& `$ Z1 L3 j9 s6 r, O
newline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个
( E, p0 W" d& \& v4 Z- T6 K( ?警告,跳转到警告处,然后在后面输入多一个空行就好了。
$ H# J2 j; {. t6 l3 D* H) g) `+ _8 f$ Y( Y* N- @
SYSTEM文件夹2 F$ y+ C5 J+ q. R2 V$ D; S9 I

9 W' g: @: h' ~: C+ q2 z1、delay
& |# W6 X8 Q: g! f$ z- H5 p4 n6 ?( R1 E0 r, {9 A7 a; N2 i# n
顾名思义:延时函数文件夹
2 i9 s) @  D- q; w! [2 R
* u' A% i% b" X" R: s+ [1 s
20190703112603207.png
+ r& a- |& j7 ]0 |, b  }9 H9 I. n
5 j4 v. P5 i. a9 |3 [( @8 o; x, k4 H
***************SysTick定时器*****************着重理解1 [" i7 ?* W! G7 ~

! {# j  A- [. q1 D; k5 ]% lRTOS会用到9 \/ l+ g8 a7 Q5 T5 O" Z
+ A; U% T; r6 h  h9 O' D1 I
20190703112856883.png

5 o2 M# F4 ?4 Z6 l+ h
8 l. c; C9 c$ M
' f* C* W( f* I8 V' ^+ f* s# K
" H5 k5 L3 B( nsys文件夹5 m, F* N' n' u* Q+ j  V: X

/ x  m& h# Z. H
20190703113106512.png
4 o3 z" P- A. s

7 q5 Q2 s; M* D: @1 y1 ]* g sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件0 z# y; f0 q8 K8 U% p! U
7 Z" w3 r/ p& b* H. f+ N2 Y
sys.h 9 }& P- e8 G3 f

' `/ P; o1 Z- Q7 j# C实现对 STM32F4 各个 IO 口的位操作,包括读入和输出
/ v) I3 s8 ]# I5 x
/ g& B4 e* Q& R9 E& o' T! z PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否( q8 `) R( x/ N
等于 1,则可以使用 if(PAin(14)==1)
) z7 G' z6 n$ Q  [  f* H* A' A  K& c8 r
  1. //
    $ w. ]( u- Q% z# U3 W
  2. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq);                //系统时钟设置& Q  C5 O& B5 q& [5 P
  3. void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化  7 M& Z  ^: }' Y$ A+ N5 Y. D7 k1 }) ]
  4. void Sys_Soft_Reset(void);                                                              //系统软复位
    / g5 T2 S# M4 z
  5. void Sys_Standby(void);                                                                 //待机模式         * R: C  t0 s9 b5 ]! y
  6. void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);        //设置偏移地址
    ' G/ o" t3 m# P, Y7 b, U
  7. void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);                        //设置NVIC分组
    ( p. J9 E8 N( [, d4 u
  8. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断
    : w$ O. G5 I5 r5 z) P7 s
  9. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM);                                //外部中断配置函数(只对GPIOA~I)2 m5 c- l; G" _" r  [3 P# S
  10. void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx);                //GPIO复用功能设置
    , ]/ [; @) p" G$ {* p
  11. void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数  
    % i/ R! S  @* B5 s
  12. //以下为汇编函数
    3 P- M0 F% \0 F. e# U# a
  13. void WFI_SET(void);                //执行WFI指令) p: D0 f) f4 `6 q3 D. U5 s% V
  14. void INTX_DISABLE(void);//关闭所有中断$ Z0 v! A' v5 q1 L6 b
  15. void INTX_ENABLE(void);        //开启所有中断
    # n; N: p- ?- R$ v9 [& E, d- p+ Z
  16. void MSR_MSP(u32 addr);        //设置堆栈地址
    5 ~& u4 f3 Z. n1 x: r
  17. #endif
复制代码
( Z7 X/ |7 Z# S3 e' h* ?1 p
************************时钟配置************************************
5 w4 q% u0 `4 Y/ F/ p
. B$ j/ l( {2 U8 t" h' M0 susart 文件夹
% }  \: K; }& y5 s; p+ n
3 V2 {  s' t7 ?* S usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收
1 C$ e$ d. y7 I% z2 ^& d
2 [. R# F% F  c6 eusart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u321 K/ \) _& f. @
pclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使" [- u# e1 R/ q  s" r
" @" r5 l& B$ A4 G' k
2 S, k  D6 h1 I" _9 Q
在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!+ n4 [+ v/ x) E; a2 R- G$ a

* v9 s" f! k' _; Y% e# {
20190703182927542.png
+ E3 M' c% y% F. f4 N/ S( I. O

5 S5 Y/ a) p7 a" O/ K* vRCC->AHB1ENR|=1<<5;//使能 PORTF 时钟, f5 L  c! x9 G& Q  E; Q. ]5 r
, v6 d7 o6 P4 m3 R9 A$ ?

, ~! U9 F  u' ~) FI/O   输出I 输入" D. {" e# C: C! e# r
# D$ a; E3 ~& M2 m
1、使能时钟
1 ]; F0 ?" A# @: G, B
0 h8 R6 X# `  h( Y6 ?. ~2、IO设置   void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)
; Z5 {  ~$ }1 M. d9 f
9 Q2 D- Z/ e; r//GPIO通用设置   T6 ~+ t/ m& J0 Y7 |+ y
//GPIOx:GPIOA~GPIOI.5 X7 r" u  e0 w
//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.
6 v7 d+ t* u& i  r//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.
( i0 t) m) d( _% f$ t//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.
1 t4 ?" x; `# s& S//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh. . G0 J0 m5 t% |, T' J  E
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.! \" p( R. h3 e) P1 b* D" o/ U! H
//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
! @3 R; n0 f: H! R3 r: B+ m9 J$ y8 N
1 R7 F  ~% `$ U( Y. Z; o3、PFout(n)   PFin(n)
; \) a- A; {) |- K) a( E$ V0 F
# w  S0 Y  s2 m9 @
/ m' q7 g( D& z& B' ^/ r* k串口
: n  {# v7 B" m/ k- n4 ]; `" b
) S3 {- v" _! v" P  b# I" wSTM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,
6 C0 ^/ `$ }: N, b% z: x+ H8 f+ g+ x1 o2 `+ T% K& O: g% ~6 G4 ^# [
uart_init(84,115200);  //串口初始化为 115200
$ {& a( i9 a- l5 V$ |& u" V% {; Z5 f

; [7 z& M- h& ]$ }
收藏 评论0 发布时间:2021-12-6 11:32

举报

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