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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 11:32
应用FPU
# @9 s; _) R3 H- X, {3 Y  b
# t4 Q9 z$ ~  l3 _) A3 C1 |( F
20190703105214160.png

  r; M5 ^! b+ }# \7 H' Z  |9 T5 j

% f6 N$ \. I& }" Z+ q% e6 }( e2 a- K3 |/ ?7 E9 x
1、工程文件0 B9 _# y9 [& ]8 f

% P$ N' [0 F9 z- r* j' C7 _9 M4 kstartup_stm32f40_41xxx.s
1 [2 u2 c- p& ^. t' [! c( G( s3 F" o. J, i- o) v% ]# y& o
新建一个 test.c 文件,并保存在 USER 文件夹下
9 ^' i( P; J9 \5 x% R
$ U4 H: x3 {* P! r2、工程文件夹$ O4 A. @: l4 I% ~% ^! [( Q- I
( O! e) D- M+ K% m  f9 P
USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,& w( h6 [3 B% t. ]

% Q) a- M1 t% [OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)
, V7 ]+ x/ |: ]' n: O5 t) p8 k& o, n' b7 B. C3 F/ a! l
SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到7 y4 e+ e% H8 Z! j

2 |% |  _  u1 t9 F4 W$ J) k3、工程分组0 w0 B, V6 e  |4 K& r" Q
8 v3 H" z' \: p  Y4 [& i
Target 目录树上点击右键  Manage Project Items
/ v1 e( n: Y# H7 N% J  E# I9 @4 d* o9 r$ t; H. G# t5 z" V" {# U
我没改文件夹,还是用原来Objects,Listings/ D. p9 F! N1 P5 u5 ]
5 }; S% \/ K1 L: _* {5 j0 A
2019070311235161.png

# R  K2 @3 E0 ]6 Q4 {, Q- U
8 Z" N6 l, o) X0 P/ k$ m, {1 ~
( S% \' Y- @2 h, [
2019070311225613.png
6 ^# E' X& t+ ?
- U! E) i6 V9 j
" j8 v# k2 C$ v1 z& F
4、设置
: K9 X8 V4 V9 P1 ^' N2 C+ K
+ O* ~/ n- q! H
20190703111442709.png

: |  R2 Z+ d, P9 I8 @) U5 I
1 V3 s& V+ i& l. ?" @6 n3 O图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比
4 H9 u' V% i/ ?+ X" t如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在. |: w" @$ a6 E6 j# h
MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加3 c8 A  g( c0 z, A
进来。
, p. g* ^7 _4 z" J8 I* M' F图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果
$ A9 t! s& `9 S2 \越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代$ P% N7 u6 k8 `7 u
码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。
3 E/ r6 S  y  w0 t! q图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,
  l% L0 y: |, ]- v1 ~, T可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代3 h5 B* z* T* Z
码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
- e& E! ?& A! Z$ p/ x" _然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件- O  q* F8 t& h* ^
夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后
( Y2 l- Z) {" q  _# `5 ]3 s面会经常用到)。如图 3.2.22 所示:
  u( \. o6 A& c; K" ^- j3 N/ Q, o
6 ?* T$ O# O% Y9 C! r) H- l; c- h8 O8 S% Q5 h. M7 T

/ }/ }- r( A! J" n# Z5 V/ T: d! Z) p编译遇到错误:
* u. `4 D3 }; {+ U2 y2 G' i5 Y; q: {5 Z
SYSTEM\usart\usart.c(38): error:  #260-D: explicit type is missing ("int" assumed)/ M- x: y$ U* n" }3 J7 S& b% g6 G& h

2 o& u$ v; i9 a; p% N解决:) `1 E* T* V& P8 r/ t2 T9 E: ^
' C" {4 t& D8 R/ x) C
函数前加void,这是printf函数的相关定义9 M# ?, Q" I0 B% p) f! a
$ e; d( e8 G: [$ m& m1 F
void _sys_exit(int x); N) ^( t$ g$ u0 l0 F

& P$ d6 t8 A- ^& D0 I6 twarning:#1-D last line of file ends without a& _- x; P1 U0 Z0 h; y+ q9 \+ N6 Z& s
newline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个; y' q4 O+ b, O5 p$ C( w
警告,跳转到警告处,然后在后面输入多一个空行就好了。
# x  U/ B8 z5 _5 ~) o; ]4 f7 H* b
SYSTEM文件夹* y8 _6 u1 x7 L, f  o' f
; u. O6 O7 K2 {8 I3 b
1、delay6 q; q, o" ~) j2 \

! |( a8 X* T; j0 {8 }! e顾名思义:延时函数文件夹
& i* k; t0 R2 W) v% ~. a& H
) c1 a, u  F* y6 D; x2 B1 n/ G
20190703112603207.png

$ a" u/ K& _! n1 [+ j7 k! a" e. j4 E6 L
***************SysTick定时器*****************着重理解( h" S* u, f" e: A6 O0 C0 e
: N$ q" G  T' Z, E3 Q7 Q
RTOS会用到" w  O1 g% R. H3 g& ]* k

9 n0 r; y0 C3 L; d0 p
20190703112856883.png
/ v  V4 E, T. u2 e

. `( L8 ]  [: z0 s5 Q7 e% v
5 G# s, j* J: M7 R
: s; {, i+ [: R2 \8 dsys文件夹
8 P/ n' Z& P5 ^0 ~. G7 F4 w# V. \% Z  _) M% S/ L
20190703113106512.png
7 q( M$ G& E. b9 \% @* _
0 ]( d5 f" C( c4 P5 L
sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件
( B' v% H+ L$ m/ Z" y8 I$ u5 P) ]0 `2 e
sys.h
3 M+ P, _8 d9 }7 H/ W' n
' V; ?6 n" k* C* Q$ d9 W实现对 STM32F4 各个 IO 口的位操作,包括读入和输出  W! c! {# I5 ~4 X( f& \

6 z/ R9 C, f" I4 v% i PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否0 C  v8 c* r0 l. ^1 \
等于 1,则可以使用 if(PAin(14)==1)" H# T4 r1 F- L
" A8 t; r& i: ~+ j5 y! Q
  1. // ( J# [: i, |) N9 v( \
  2. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq);                //系统时钟设置5 ~+ x. U  ?% N4 ]5 K
  3. void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化  
    2 ?( Q/ h: M( c' I, N) s
  4. void Sys_Soft_Reset(void);                                                              //系统软复位& v! H, O9 M6 p3 Z! N
  5. void Sys_Standby(void);                                                                 //待机模式         % l; A( M1 B& I& m$ h$ E; t
  6. void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);        //设置偏移地址2 I5 @4 U+ \+ T
  7. void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);                        //设置NVIC分组. S. ]. N$ v, I- j
  8. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断
    4 f/ ?/ ?+ H! L
  9. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM);                                //外部中断配置函数(只对GPIOA~I)* }  T6 K5 @( Q2 _( R1 P
  10. void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx);                //GPIO复用功能设置
    6 A7 S' h/ u6 _
  11. void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数  3 A6 s! E, e' N8 j& R
  12. //以下为汇编函数3 \- A, k/ c+ B% i* Y- a0 D7 A; O9 E9 U  B
  13. void WFI_SET(void);                //执行WFI指令. E& d, z+ }* g7 ^
  14. void INTX_DISABLE(void);//关闭所有中断
    ( _# H0 u& l1 [- ~( ?4 N" w8 x
  15. void INTX_ENABLE(void);        //开启所有中断
    , a4 u9 Q- n. D. [
  16. void MSR_MSP(u32 addr);        //设置堆栈地址 : g! v; g, T2 K& ?5 n
  17. #endif
复制代码

7 \! D7 ?: l( |5 ^7 o) [0 D5 H************************时钟配置************************************
; ]- g6 g/ _0 r5 u, R
' x0 _5 _2 ]5 a7 t" Husart 文件夹
- Y9 T) k( ]: ~" o* T9 L3 t+ \3 d2 u, O  P/ B) V  R
usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收$ \8 @# j1 v- L1 a7 P- d: H& G* v/ `
3 A8 g3 s$ `' x
usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32* O/ i( r, A( H4 T; T* w
pclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使# M0 p6 B/ Z+ }& H7 N8 N/ n

- u9 E5 D- B/ D1 c- a) _0 N5 \+ V' h) W: L: e5 D$ r
在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!1 S$ }4 T4 ]* g3 L1 ^) B: R

7 N( b8 r7 n8 O/ d6 F% v0 z
20190703182927542.png

/ ~3 r1 P  \9 U3 a" y/ F/ G: n
/ y  k0 ]; f% o  XRCC->AHB1ENR|=1<<5;//使能 PORTF 时钟
" u/ t9 q# o. e2 S+ J! n
: e+ S' G( m; y+ z
$ o/ ]( r+ L! v  r4 A; Q8 P; m8 rI/O   输出I 输入
3 D! P8 o7 ~4 e; r. q# |+ l+ M; p/ \0 ]6 g
1、使能时钟
# e6 p+ P$ C# T* r* f; b/ G, U0 j" v7 x
2、IO设置   void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)
! u' Y5 c9 ?' J3 G2 f( e5 w% S, s. T) n' C1 d9 n3 Z' Z! D
//GPIO通用设置   G& {0 K( D4 _; q* I  C  K' j' j
//GPIOx:GPIOA~GPIOI.
$ n2 p+ n3 y+ w+ }- f//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.
: S- Y1 L; n6 V2 R' [7 i//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.8 F% D! V- M! Y
//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.' G9 P. I1 W0 T6 W* y1 N7 u
//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh. - Z$ Y$ @- Q( G3 v/ D
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
5 ?, |5 W: k  G' v7 [- y//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
9 d: @5 @; V8 @' D. y/ k/ s6 D& u& @9 D) J  H
3、PFout(n)   PFin(n)' V( [" [8 C  n1 _5 m4 o. q7 s3 ~4 p$ _
/ K. {3 k7 t( Y
$ _/ n& A. e: W. v; R# }
串口
5 ^6 H! }  Z$ e: q0 n! Z2 i# |/ u/ E% k# n$ x
STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,2 N4 A* g9 L( |2 c$ O) C

4 w: R- G3 ]- z3 C$ g5 {uart_init(84,115200);  //串口初始化为 115200" U) \2 J( }3 S. g: o

7 r1 ~; S$ D5 M. k2 }7 [/ j0 ?$ s. v# N( G" Z
收藏 评论0 发布时间:2021-12-6 11:32

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版