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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 11:32
应用FPU
1 l: T3 e% e/ I2 I; d" B$ k- Z: r) y/ T0 \. S" y% X/ ~
20190703105214160.png
% F. p" r1 I5 r' ~* j) I+ n

8 u" \& w8 D  ]; }7 E
. Z3 C9 G) F1 l5 |5 v5 R0 D) o
: C  L, U9 D" n5 ]3 h1 {1、工程文件
$ m  D: `% h0 k! C1 i( B
- g' c5 n# T/ v$ ~* ustartup_stm32f40_41xxx.s
9 ?' I" M& Q" a  ~3 o& E
& F$ B$ f$ p6 V7 b5 y! O7 o新建一个 test.c 文件,并保存在 USER 文件夹下
% c. z5 L& @' e' @
" L# C. k$ D& i' T- q1 u9 P- Y2、工程文件夹3 n$ M2 V) N) `0 w0 M* J) n/ P
; M; q7 n3 Q; N$ |; ^7 S
USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,- a( X1 Q; v9 ?. o0 @- O. B! J
% m6 }5 E% H: r$ C/ i
OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)* u. `) A( ~* ^' |' `
8 }; f* r7 n! m( ~
SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到
, O- P/ @1 O+ z7 T' a
3 V# x: A/ m- \; C) K' B& C3、工程分组9 x1 N) ?0 ^6 `. e) u

. c5 H( O+ K3 r4 _ Target 目录树上点击右键  Manage Project Items0 K4 u* V! \. n6 y
3 I5 Z) N; Y# G6 L* e2 ^$ m
我没改文件夹,还是用原来Objects,Listings+ {) h. V5 O/ t- m

1 a2 s4 l+ W8 q2 |! b( Z. }
2019070311235161.png
4 H! d* P0 D' A4 p/ Q, X- h: g

; P  k3 X' I# k$ J1 m# c* h$ }- A" ]
2019070311225613.png
. G: Z7 J% j# w# [# {

' ~0 M" j" R+ Q
; I* S8 i  x. d. u% p, Q/ w) d4、设置+ Q4 H% A7 u& S/ R% p3 f
0 S9 {: V' \. I4 l5 t
20190703111442709.png

" b7 q  M9 q3 \/ R$ }! I
# q, n* c' C, c+ R( q图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比: D4 Q+ ]* u; a% @5 H: k  D
如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在4 ]" G: ^6 x( h" m  i2 e% Z
MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加
- a+ n6 S, `, o6 f2 ]+ x( I进来。
+ f3 C+ g. f. Y  U' A! e1 D图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果" m9 n7 O1 K  A8 _: s" E
越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代
: F3 Z- E" N+ y6 a2 H码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。
4 @$ n0 d! w$ K- u图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,
7 ]$ i* l* ^4 I, X可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代! W- o4 x" |7 @: p7 k
码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
  |# f* h' g* r, y然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件/ t3 d+ u' f! ?% g6 g7 x& t- K3 k6 }
夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后
* @/ Z# r) X+ W4 }' }# T* e( s. x* H面会经常用到)。如图 3.2.22 所示:  q8 v7 F' D  B$ i* t1 Q3 w
  t0 g0 ~* U; T5 G' r2 J

* b; A! B* G' b9 A
( r+ M2 R- D9 a# I# L% U& e  L编译遇到错误:
6 [' O5 A0 Q" N/ A+ g% K; v) E8 u( _6 q* g6 O( p
SYSTEM\usart\usart.c(38): error:  #260-D: explicit type is missing ("int" assumed)) E+ \  u6 e- J+ |: a) U) r1 h! E1 x

+ v* i/ B7 B) d解决:2 ?+ o$ p* ^+ h. ^

7 Q5 G' @% o6 K0 ?9 s6 e8 h+ R函数前加void,这是printf函数的相关定义
# n* J( o2 ]6 l
$ b6 \' {* d( F0 [7 U/ W+ q( uvoid _sys_exit(int x)7 D$ ?- z- B4 C4 P/ O" i
. J  f9 j6 T0 ~4 A1 }3 W& y! K
warning:#1-D last line of file ends without a1 X  G. ?% u3 f( s( w
newline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个9 r2 M1 t1 {% f
警告,跳转到警告处,然后在后面输入多一个空行就好了。3 {9 p" a: t* n

# j; M$ D+ l" l) PSYSTEM文件夹
  l; d. t. y7 l3 i7 I
! F) `' p4 ~8 E6 V% o4 b' B7 Z1、delay* H! \: X9 a" b- b! ^

4 k6 N+ J" g  T; q8 x3 t8 i- a顾名思义:延时函数文件夹. }+ V- J! s1 ]4 _0 Y

$ C! r2 W3 \  q& w; q1 _9 H, r- K% j
20190703112603207.png

- f: F2 |! v  B9 @# u) W/ @; _8 X
***************SysTick定时器*****************着重理解
* o# Y  U4 H4 s6 ?$ r2 e- r- |% h3 W7 c7 S( X; Z8 K
RTOS会用到5 A! E+ b( [0 ?1 H5 s
( O: h, a% H. ?& q6 Y( V
20190703112856883.png
* H7 g: i% R' Q

* z* ~# U2 Z# \4 @5 i) O3 A2 t! D) _& m3 E$ g+ P

- U. I4 u2 R* K! s1 ?+ @, Z$ n- ?sys文件夹
: m+ M- d& E( [, Y  b
# Q* O6 \9 \$ \  n+ M7 V- _
20190703113106512.png
4 O/ z5 |1 Y: Y2 }

( X, ^6 O3 W0 d7 j! W- x0 |% g sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件
/ G6 S- @. }6 _2 h
& L4 u: i6 [. l2 I sys.h 7 }+ X2 Q  j2 \4 C7 G  K

) e. d4 v9 e# m4 `3 o) m( Q实现对 STM32F4 各个 IO 口的位操作,包括读入和输出7 {8 j% ^% |7 ]

5 l3 C3 [$ F3 W+ u PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否5 L2 `! X# P) |" A% X' c
等于 1,则可以使用 if(PAin(14)==1)7 q: v$ G! Q% ~4 c* D

6 ?' Z( X: b: b( ]
  1. //
    0 W. ^( }+ m# u) q! S
  2. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq);                //系统时钟设置% b! J, I3 E8 x+ r6 h- `
  3. void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化  % c% x7 `$ k1 ]: |( {' S0 \) G
  4. void Sys_Soft_Reset(void);                                                              //系统软复位
    & x6 }# D2 B  s# ]8 d  R7 j, X. [
  5. void Sys_Standby(void);                                                                 //待机模式         
    4 x1 u4 E% S( y- A
  6. void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);        //设置偏移地址. S4 V: U/ t! ^- x# L7 r! _
  7. void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);                        //设置NVIC分组' v! d' T+ L, x' r0 v1 v: G1 W! e$ A
  8. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断
    : J7 c. l7 y: H) l# o( j, A
  9. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM);                                //外部中断配置函数(只对GPIOA~I)# T0 D- j. b& B9 N
  10. void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx);                //GPIO复用功能设置
    ( _' c* D3 U% P* B9 ?7 L! s  w  @& }
  11. void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数  
    ( A" ]$ ?. ^. h# _2 {; e* r& O
  12. //以下为汇编函数
    / Y' A/ d9 j' x; b
  13. void WFI_SET(void);                //执行WFI指令; h3 z0 I0 f, y- V& T
  14. void INTX_DISABLE(void);//关闭所有中断# |+ M8 D# X8 L
  15. void INTX_ENABLE(void);        //开启所有中断
    : Y4 a! d* u# `3 {& y- l
  16. void MSR_MSP(u32 addr);        //设置堆栈地址 " G! w6 T# {0 X4 |  f7 r4 m; d! f
  17. #endif
复制代码

- t6 t; j( B/ c4 v6 L* Y4 F# Z************************时钟配置************************************
- I9 k. T% s1 y" ^5 W; E5 D6 j
3 \- N2 t/ G* A$ N6 Ausart 文件夹2 N) g$ {! q& T: ^$ ]- N
, `) k& w" w9 q, H1 s* P7 m
usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收3 V& L9 L. ^; w9 y! F2 q+ b

3 j6 j1 q+ E" X: j6 Xusart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32
" I  `& f& Z9 _4 Epclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使( G0 b+ F( m" s5 E9 i: K
用$ d2 z4 z' k7 q- g/ Z8 R$ b0 E) V5 V) e
  E0 F. f, l# @% B( f! `3 Z2 A
在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!
7 w/ K1 ?' `. _* x3 u# U& u) E6 Q; e) l7 e% L1 ]. N& Z
20190703182927542.png
! }. e5 W4 n; o$ t0 \
7 k' o# }0 Z- q+ ?  @1 v
RCC->AHB1ENR|=1<<5;//使能 PORTF 时钟6 ~6 X( ^# \: I3 {3 [+ w4 C
2 N1 ?& U3 g  T& E1 |& u: ~% d" |

1 B' Q# U7 \9 e  O8 e0 a, }0 ?  mI/O   输出I 输入/ I5 @* M6 a0 _& @
; g" c' Y& v. ~4 V
1、使能时钟
6 m! v5 t7 u' I: s& e% m- R3 \6 s( `. D& J" O1 E
2、IO设置   void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)- j6 f- p; v  O( d- h+ D1 j

1 g3 s4 j' u" O, F: `" ?! l//GPIO通用设置
9 ]" i3 \$ W8 V* @. z; @: u//GPIOx:GPIOA~GPIOI.
+ X. R! B; U. I//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.
0 o) U1 L- T# z% s! t5 S" N//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.
* P; R. w, O. d: L1 f& G0 u5 _//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.
; M5 I1 p7 L4 i2 y. O$ f( [5 A0 A, u& p+ N//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh. + E$ E$ w; [  L- F
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
+ M) m4 M# F9 |+ A' U* \( w" Q//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
% W* o. [7 M4 }, K# u
8 R( }1 J& d6 S" `' `7 J  s3、PFout(n)   PFin(n)
7 j! L' M- x7 ]; |# F' \6 k5 h6 V  }4 r, |  l1 Z' J4 E4 f

; R) ?  J2 L8 o( s. |串口! j& Q8 c, H/ C2 [3 K% i1 H* E

: e1 W1 D+ n- J- d4 {5 [! o" t/ L" xSTM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,$ }! @' A& i6 i% _6 k! J% M
1 ~7 A1 \7 [# C9 R6 `! u; \2 D
uart_init(84,115200);  //串口初始化为 115200
: V$ l$ b" x* \. q+ n7 I
- @+ c$ {5 z# u/ U/ p
+ m: F0 o/ H* c" m* v
赞 收藏 评论0 发布时间:2021-12-6 11:32

举报

0个回答

所属标签

相似技术帖

官网相关资源

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