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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 11:32
应用FPU
0 p6 t) t0 v/ @- a1 j) A$ S
. V0 _4 p. r8 x
20190703105214160.png
' i$ E- ]$ }+ t4 e# M9 h9 j( W% J8 h

" d: M, u% Z) z( r- ]+ T! y( X8 n* ^% S+ R% e- E4 ^
7 g$ m4 i5 i% [6 J& R  r/ X
1、工程文件4 ?: {" K2 S; A& {
. y: B( E7 Z1 W0 V7 u
startup_stm32f40_41xxx.s
5 v/ p! `/ k0 c. k6 l
1 e) T9 ^: X( A/ B; C新建一个 test.c 文件,并保存在 USER 文件夹下/ O9 A1 o6 Z0 f, w9 i! G8 P% g' l0 {

. F) l) Q# V) Z* X6 R7 x6 d2、工程文件夹+ i3 l  F) y2 M6 q4 F1 W( n
5 j$ `& X' h- c. t: y
USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,+ x+ O1 h7 R0 F! u4 H
- z' T' }& ?. R6 ]
OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)
$ D. Y( p9 \9 J5 [0 w* c1 H, V
- m1 b( }- a1 A6 A' u SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到
/ A; x( F# J. G3 f  A4 u# |, H. l- K0 t. a
3、工程分组5 O1 W7 i' r, g: @! g! i
" L: q) l/ S' K: n
Target 目录树上点击右键  Manage Project Items7 @5 ]6 f9 z: h. t8 \$ P

% h" A3 @% ?! c7 p' b6 F/ c我没改文件夹,还是用原来Objects,Listings
5 Q4 J7 D( A" P$ f4 i( i( d
3 J$ i6 \9 l" ^5 W3 O
2019070311235161.png
1 J8 }, a+ ]' s1 }; _1 V( D

1 s2 T: J! h2 Q8 |" p+ @5 w) z; `
+ E( {+ W) l! L1 p6 H" Z# D
2019070311225613.png

# K: S- v. ?+ ]8 h' z7 v8 p
" K6 ^0 H  m; [2 i4 k9 Q% a
2 ~5 o/ A1 S' U$ l4、设置
& d. n, L4 h5 S8 W+ I& i: X
. L. m* [7 e& Z* N# V
20190703111442709.png

$ L- i! r% \+ P: y2 f: u
% _4 }5 T/ }' M8 f  n) {0 z图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比/ I/ T7 i# w, @% `9 n* F
如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在2 t, o2 H: Z' t7 n
MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加
! Y0 I, n2 ^% ]. n" m9 o进来。: R2 G4 H  p6 n8 a+ L3 [1 `
图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果8 K, o$ j2 Z5 i& R, A
越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代& L; n1 Z1 _1 b' t2 Z
码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。
0 w6 I9 d, S. w图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,- t( [! }- g) q& L" N+ M
可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代8 \- H( I& d- a' }
码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
6 e+ ~: Y0 }: @0 p然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件
4 F7 x+ E( ]* B% {1 w+ X夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后5 f1 D6 y/ o( B, P
面会经常用到)。如图 3.2.22 所示:4 ~& K' w; d9 K2 ]: p! S/ w
* V$ ?( n6 L$ ]6 c: P
. w$ @; r. @0 u# X
5 J9 V% |; g6 `6 }0 G" U
编译遇到错误:
) @: ?% [9 B" r' I$ K# P3 k* h" N
( a1 D0 \- b# q8 M4 wSYSTEM\usart\usart.c(38): error:  #260-D: explicit type is missing ("int" assumed)
, W5 j8 Y6 ?$ k1 R3 P0 w' ?, C5 q- J
解决:
) K6 t1 b) n9 n" O3 V3 P" V! }
5 n3 v, P, R, T: x0 l5 E* l6 F) B函数前加void,这是printf函数的相关定义5 a. L2 O& E  z1 O& ?$ u$ T

1 O: t. P# y4 mvoid _sys_exit(int x)
$ C- J9 e  D2 _/ c2 ?; L
% m; \6 s# K4 Q: ~- {% jwarning:#1-D last line of file ends without a
3 A6 Y2 x* D0 W2 D( [$ c) R! Ynewline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个
. m8 ^1 W, j" E0 H: }; b- u警告,跳转到警告处,然后在后面输入多一个空行就好了。: ]8 p# w9 G6 Y( }# Q
4 d4 ^0 d6 r0 j/ ?
SYSTEM文件夹2 t3 o6 F+ W" o1 y# a
$ P# Y: ~: L! z" ^% i$ g. H3 t, @9 X
1、delay
: M) N! O: a3 I2 |6 o' k5 Y" v
顾名思义:延时函数文件夹
# C0 ^" f* ]" d5 s8 {8 E# e0 J, z* ^! f$ l+ }
20190703112603207.png
" J. T% B8 ^% ^7 X4 F
! V- ?) r3 l& o, r" q% A" g8 u
***************SysTick定时器*****************着重理解
: r8 Y- _2 H, Q/ q
! A$ S; L, B& C3 V3 U, r* {3 X! aRTOS会用到/ N5 c. M) Z1 ^, v5 o- k7 }
; @0 K+ c4 x& V4 X3 @" e
20190703112856883.png

/ [- v! z4 y% j
. W. G0 b* |/ L; V4 m7 ]
7 G3 ~. f# ^- @# o5 d/ k' k0 S! g  n! H
sys文件夹
$ X" X$ z) F" \4 k# g1 J" E
/ p+ S; v+ A- ]' C, Y5 B  Y
20190703113106512.png

8 J+ H( v8 @+ i: y: v. k, n
7 S" k+ G4 S" b sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件& I' {& K* N: C: @7 R" V2 L- L. K

+ y  a: K3 ]  m1 \8 Q sys.h 5 l& A$ C' r( C
3 J0 n; K: \- l4 Q
实现对 STM32F4 各个 IO 口的位操作,包括读入和输出
2 R$ t8 l/ y, o# Q" e7 i, O$ a+ \# Q7 d9 N, f7 j( o% p6 F6 D
PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否
, z1 f* d( F1 q- N- c) @等于 1,则可以使用 if(PAin(14)==1): D  P5 x- u  t2 J- A" d

3 r) V- N, p# j1 B: z! `- \
  1. // 2 h7 m" |# A# `+ V0 m
  2. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq);                //系统时钟设置1 e3 P$ z1 W# N- m8 a
  3. void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化  
    3 P' E8 x2 R! V8 M# D$ X; y5 k
  4. void Sys_Soft_Reset(void);                                                              //系统软复位
    4 ~5 }8 Y1 n; C1 c0 J% q
  5. void Sys_Standby(void);                                                                 //待机模式         ( `; g( Y6 }4 t& `; W
  6. void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);        //设置偏移地址
      P) n/ Y" |! K" M, m, _$ H
  7. void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);                        //设置NVIC分组
    . K) I$ K9 n9 ?
  8. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断
    9 I, m& ]# ?& X3 i  r
  9. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM);                                //外部中断配置函数(只对GPIOA~I)
    % t3 }! K) }. h7 G( k, u
  10. void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx);                //GPIO复用功能设置2 ]+ ]9 N' p9 S  O, I5 T4 r
  11. void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数  
    ! V# P! H3 }5 q
  12. //以下为汇编函数
    . r6 T5 _8 A8 p
  13. void WFI_SET(void);                //执行WFI指令
    * D& z. P) z; x  i6 f2 D: ^
  14. void INTX_DISABLE(void);//关闭所有中断9 v( k) r# n. ~3 `
  15. void INTX_ENABLE(void);        //开启所有中断
      f1 K2 s* Z; z. u. o) k0 T3 L
  16. void MSR_MSP(u32 addr);        //设置堆栈地址 / u4 ^' c6 @6 l2 S  B9 L
  17. #endif
复制代码
: D* Z8 V) F/ @5 K  P1 U3 e; [
************************时钟配置************************************
' [- s4 A0 L5 c/ i
9 W# K5 `9 s! eusart 文件夹
# [' C" _& W: P* P) }3 f9 b- B3 `# N  q$ K) E, F# T* `; J- K5 `
usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收
" {9 y$ F) R$ `
+ Y) T) G; ]# @  tusart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32
5 l; h2 U+ E1 gpclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使
! Q2 }2 A4 B8 T# }- E& N( v& |. p9 m9 [8 Q( _$ {
, w) J7 b: k3 t9 g
在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!
7 w, ^/ R, u4 k, B0 d0 R) @$ g1 c8 l( T' i
20190703182927542.png
" q( P8 d! p1 @9 `
7 |* l" ?/ r6 T- \, q
RCC->AHB1ENR|=1<<5;//使能 PORTF 时钟
/ Z( e: B8 Z4 x( D  U3 ~0 L* j. b$ ^# K% q! T5 _

, R" x4 d( H, p6 v& N0 jI/O   输出I 输入
, d( C$ S- u' S, F) {
9 ~  j6 k$ V* P" M0 n; h1、使能时钟8 Z/ S, r0 ^6 l) L8 e. z. w

5 H: f& M1 O1 {# b1 o, q3 i2、IO设置   void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)5 |) d, f% o2 x2 ]# }& I
& o4 q' Y, P- p* A+ S$ X2 _5 U3 S" n) E
//GPIO通用设置 3 v2 s4 o4 Z- F
//GPIOx:GPIOA~GPIOI.3 C- e; m2 u" b" J
//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.
/ q" g- I) K+ R- u$ ?9 ]2 y8 S//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.* x8 o$ I  x4 F; L/ I
//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.
' g" {+ q7 c4 u9 Y7 a1 C//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh. ' X) H# A( m7 p* x$ U+ F$ }3 M& F
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.( {# b5 x. A+ t# f$ _5 `! W
//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
, y) _. X4 g, f2 e0 i0 O; t
0 `. b! O4 E- `$ ]1 I3、PFout(n)   PFin(n)
; G% [8 L. b, L) G0 V- s, b* J. k
: z: x+ T1 v# A! j- B  }  {! f) _; g+ M: s3 A' c
串口- w" ^9 \" X6 m6 ^. |+ T
& I% \6 m1 @- }2 I) t
STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,) o4 w" `4 u0 W% ]" r' m" n& `

( q9 G5 J' m1 v) T7 \: ~* _: v8 Ouart_init(84,115200);  //串口初始化为 115200" A% E) j- b4 M5 L4 n

4 e" q9 I5 P) G' N+ i/ t4 ^9 d# W" O) r7 A! l; i
收藏 评论0 发布时间:2021-12-6 11:32

举报

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