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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 11:32
应用FPU
5 x3 \; h$ ?2 A; T/ o: Z" Y3 e$ r, c( g5 L  O
20190703105214160.png
' G3 _1 p$ K" z

' v* S" ^. o- Z% o) E
' U% T3 O0 F3 k( k( L8 z' v- ?3 w
$ P8 F+ P) l& L1 s1、工程文件5 G9 o& H2 `& R* C9 Z+ ]- l3 S

9 |+ m9 \2 h, g2 t% K: Y! W* ystartup_stm32f40_41xxx.s ! R; A0 c( ?* v
: k% t4 e1 ?% }' e
新建一个 test.c 文件,并保存在 USER 文件夹下
4 `3 q6 q! T8 y/ H: G" q( q, Z9 m6 d/ W6 |8 ]: R
2、工程文件夹
. v/ L! H) H4 l# v+ \! H/ R( H" g9 C' J- l' Q
USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,& A% @; j0 B: F: I; n0 D
9 t- c; H/ [+ i) m9 o$ L
OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)3 _- ]/ o2 u( o0 r3 D8 N! i

! }' f( x. t5 E5 p' s SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到
4 J4 {+ n& u" y6 a; b6 t- Y: {! F1 Q$ d7 v' X+ c+ d
3、工程分组& o; [4 J: F6 B8 j7 w0 e# p0 E# P( @
8 t4 q  \- F/ m* p, _
Target 目录树上点击右键  Manage Project Items4 i3 P" i0 y1 w3 r4 d& W. v& j

/ g" P9 L* e0 c我没改文件夹,还是用原来Objects,Listings; i& o3 c8 a5 Z( E1 j1 ~; Q: y
# C( ~( m& \% P, L& w# A
2019070311235161.png

) Y1 \9 c, }+ [- R: J' k0 o
2 O7 d/ I4 g8 l4 Y  |
5 T, E4 ?# S" |. H
2019070311225613.png
' j' o2 j8 W) U
; M/ L% [4 U% _1 x$ H! @
/ }) a  P! p* x# S/ [9 _7 d
4、设置5 w$ B6 O% y+ C5 h6 z6 H4 _  D

9 s9 J3 T) F" _  }! n& S2 C
20190703111442709.png
, t' b1 C7 n3 c5 D
& ?5 C- B; ^% q( R# q! [
图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比
0 N1 N! E6 T% _: m如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在
( |4 D; O& ~' c6 v; j5 }1 dMDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加
+ Y7 @& x% [/ X9 n8 I1 D进来。9 i' R# u3 f- g8 p' A8 x
图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果2 I" V8 |- a) X- z, q4 @4 E
越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代) [2 T4 Z) ?+ v: v
码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。& ^) }" j/ E3 q+ j6 Z5 j& k2 ~9 J5 N
图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,
: {' F" k3 p1 ~% F可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代+ I' a8 f% U' Q# y
码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。0 ?0 }+ {2 m2 s$ O$ G6 s; q& o3 B* ]
然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件! P9 O) H) X1 P) k: p  c, G
夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后
7 A1 p1 e) u; l- n: }面会经常用到)。如图 3.2.22 所示:5 B# W4 O! T4 m2 ^' W
3 H2 T* t: b! x& F/ y

7 {! S1 T$ i6 v, p9 w  [4 ]
. u& X/ M  G( K' b编译遇到错误:
, U( i" q" P" Y( P9 U, ]2 h$ e# l  V0 v+ e& h; F
SYSTEM\usart\usart.c(38): error:  #260-D: explicit type is missing ("int" assumed)  C7 }7 {7 B( X

, F& m) @$ x4 d( K' g6 b; n解决:, a4 J$ I" }9 H* |2 P
+ T+ M7 L$ O( |
函数前加void,这是printf函数的相关定义
% H+ V2 J$ i  e) Z) R* O/ w( Z# S! f4 A0 n
void _sys_exit(int x)9 r3 r# s/ z  I1 a. m/ Y$ S
6 P$ h  u& D6 j
warning:#1-D last line of file ends without a
7 w7 |# k2 A0 v8 z4 Knewline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个/ s5 _6 |+ q6 l( t- p
警告,跳转到警告处,然后在后面输入多一个空行就好了。
7 \0 a+ b/ o: U( U
5 p( g, z3 n( t: @% |/ n' r) Z. \0 eSYSTEM文件夹. w4 s/ I) y% u
2 Q$ k: A; t$ b8 [3 z% j
1、delay
3 x% _8 C: T  E. S5 ]# z% l" I+ r
6 y  y+ A: T8 ]; ]# _8 }  d  v顾名思义:延时函数文件夹( r/ F  F4 |# C! d4 h* {7 t

4 q) j6 [! y- S
20190703112603207.png
& J& Y6 `3 B& ^

8 p" Q; F; U, Y% [! b***************SysTick定时器*****************着重理解
; c% N( O: R  [+ `( g- @( h5 D5 O* L' A" L2 O
RTOS会用到
; k5 ^+ U% m1 B0 j' B; O+ y$ V+ ?4 s# {( @) j
20190703112856883.png

9 [- Q. I7 d6 d' n; q* p
& ^7 ]( |5 M) [  l/ O5 \6 g8 I/ i. t( l1 a0 W- r

; P" ]  O% m# L$ Esys文件夹9 B1 l: s; S  P6 Z

% K) \) I7 Y/ v  Y, I
20190703113106512.png

0 [2 o/ H8 F' ?( d8 p1 z
+ g2 g4 U! z4 A) w7 h sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件7 w. z: y3 C. f9 v6 }6 c
( \2 D0 ~! E1 o" y, R, K# S
sys.h
' ~. A5 G4 A7 Z: K7 u2 D
! O, y# j* Z' v+ s实现对 STM32F4 各个 IO 口的位操作,包括读入和输出6 Q9 u) h2 Q  S" V: a! f  I

) i0 C* N: t- `* D; b PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否
& g4 y; Z* l% [) a' V  q1 e7 R等于 1,则可以使用 if(PAin(14)==1)9 i/ `: M4 N# i% V* f  R4 @2 |' e( ~

, u" c, e! Q/ u: z/ }( u+ Y8 `3 R
  1. // 6 U& D2 r- w$ g
  2. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq);                //系统时钟设置5 q  k" w' X" B& h4 ?
  3. void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化  
    ( S4 S4 R* s& F  f
  4. void Sys_Soft_Reset(void);                                                              //系统软复位
    9 E; [5 g& }5 q7 U! f: j- v
  5. void Sys_Standby(void);                                                                 //待机模式         
    # N! N! p" }+ \7 s
  6. void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);        //设置偏移地址0 j" p( j* }  d2 x- x9 T5 b
  7. void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);                        //设置NVIC分组8 O$ T1 I6 c( Z4 W) f
  8. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断
    - i3 R4 e( Z0 u% \
  9. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM);                                //外部中断配置函数(只对GPIOA~I)% B0 \& n; c$ ]" M4 Q6 d+ G
  10. void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx);                //GPIO复用功能设置  f- ~5 U% p+ Y" l# B
  11. void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数  1 i; C$ [3 l/ ?0 s2 Q
  12. //以下为汇编函数
    7 k" [) N  e1 l9 H
  13. void WFI_SET(void);                //执行WFI指令
    ! h( s* a6 o9 n
  14. void INTX_DISABLE(void);//关闭所有中断
    - {3 s. D' v# R- L3 Y0 {; T
  15. void INTX_ENABLE(void);        //开启所有中断
    2 @2 N6 Q0 _3 W6 a
  16. void MSR_MSP(u32 addr);        //设置堆栈地址
    ( o/ a" H% U0 u/ W6 J, Q: Q1 M! ^
  17. #endif
复制代码
5 V9 ?9 S) p# s! H  G5 P$ O8 b' B, A! _6 g
************************时钟配置************************************
/ N6 O- F! q9 M, K+ D" D, W
$ J6 H7 r- y8 f; Susart 文件夹
/ t- _7 \- J  |" v5 \& S& g* f+ ]9 `! f# L) f% n
usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收! D. l9 g8 n4 y- S% u2 A
3 g1 W" g1 Q! |- ^& h
usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32
' E, J: w. q& b* U( w1 ~pclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使( ]) e5 m1 m7 S

! i) _4 K, o3 e+ f6 o4 f' r' @6 R# T
在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!! Y$ W% f- R! i, E& W6 E

: O; f/ p1 S3 w8 t. D/ {3 Y! a( r
20190703182927542.png

1 X8 A. z5 Q3 o1 p7 s' I7 U5 [! ]* Y. [9 v
RCC->AHB1ENR|=1<<5;//使能 PORTF 时钟
- m$ ^# y! p! E1 y) c' b; I
* Z4 b" g! {4 G1 A. ]5 d# m
4 _; o9 t4 T  ZI/O   输出I 输入" ~5 V1 f5 n1 U

  Q: G3 m0 ~2 C9 S( h! m9 [1、使能时钟9 n' t" p' m; f% t  }8 Y3 Z0 @
. \% ^/ L% j3 ~+ r+ u$ y
2、IO设置   void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)
& E9 X) H! L- [3 @. ~
" _. K# n8 \0 _! A//GPIO通用设置 1 q* x' Q% E8 h7 G) v( D. p$ e) \
//GPIOx:GPIOA~GPIOI.$ w! H7 C; f" Q4 w% {1 F* X5 [
//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.  L* H, g* I6 U' K; n% u  r
//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.% i+ b8 G) @$ q! Z9 J' k2 I
//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.
% Y3 n' y' A) L% p, H4 X- H//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh. + L. |: O, n& ^2 N5 o
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
* b2 M( ]9 G$ B" I//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!8 r% C9 `+ Z1 b- D3 L  ^+ w

) [6 m& A8 H9 `9 X3、PFout(n)   PFin(n)1 l4 o$ `! \6 Q2 ^+ T! y/ K

6 p- [/ a; ]& ?) U( w& K( A' p" e' X) z, c; L' u7 I- |1 n
串口) F8 ~1 n. S3 z! A* U8 W
" u" ~, ^* U) H! F3 Q
STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,1 g% B7 }. @* @* H
6 V$ u" t# S7 Z1 V* u* m7 A6 S5 V
uart_init(84,115200);  //串口初始化为 115200& Q* J8 ?; m3 @; T5 H, z
" d( w  M- I* `# X5 k1 u; s. D
4 u/ y& m* R; F( q
收藏 评论0 发布时间:2021-12-6 11:32

举报

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