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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 11:32
应用FPU
7 m! w, s7 T8 F4 l+ m' _$ i, F+ `1 V2 X/ V0 B7 m
20190703105214160.png
9 C8 a2 [2 [3 S0 H0 N: V
4 f5 f& C! P8 ^. z7 R  x
. w5 V) w* ?' [2 D+ x5 L, R# {
7 B4 Z  U) d; H
1、工程文件
# c: L7 q( C2 q" V0 K' }/ g) O8 \% ?1 O; a: e* y. e0 C
startup_stm32f40_41xxx.s
7 B/ P# b" D& P8 J: [  u; r3 A  H7 S4 G, g; Z: r9 c0 G
新建一个 test.c 文件,并保存在 USER 文件夹下3 @) e6 c7 `1 y/ T3 v) ^3 x+ {& z
# @% N9 A' M% \/ ~5 a/ g( g
2、工程文件夹) c& _3 I: ~- r, ]( I5 L( E

5 q  Z) u& ^. ~" ^- F' n* hUSER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,- b. {" I* m# [7 j7 @. h# K1 u

/ h6 ?% {! @' h9 z* SOBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)8 j2 S9 k3 p3 n2 R% W' \: K
* {) f/ O& q1 b1 o3 q/ O2 i
SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到. P# P0 p* `" h2 x

& [/ {* b1 X4 w0 a* L3、工程分组
% ^# f. x, j7 {9 e! H3 h* a* q
% X* I1 o& X5 {9 Y) P$ p3 z4 k* H Target 目录树上点击右键  Manage Project Items! W4 K7 G9 `5 }# s( @2 h
6 I& X+ Y$ M. D% u
我没改文件夹,还是用原来Objects,Listings( B. _  A8 S0 F6 r& M1 i" x
4 l2 r2 w2 m: D5 C' Q- H
2019070311235161.png
+ v! P) Q1 I1 I3 L4 g

0 n( `1 B4 k0 z3 Y6 w/ H5 W, b( `" }5 R1 u
2019070311225613.png

& p( W" ]7 j9 L$ p. w& f
8 s& t' F% m, h* Q4 X
8 s% a: y' N& |) V4、设置
3 r: s, }9 g+ T0 m
$ `* Q/ R1 ]9 j1 _- b: H0 K9 Q
20190703111442709.png

; h; l5 _/ |/ G" e- u1 ?" \& F3 X  I% q
图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比0 X' f" u" g" t( ]9 T4 z0 K1 s
如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在
/ l: F; T$ T. y& A. Z/ k: B5 _0 }MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加
' y( x9 G; Z) p. y进来。
. }% L) X  u* ^' d图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果& J; ~4 A( k4 Z$ ^  G
越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代+ P3 A. W( [) V! S( x
码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。) ^: K4 [+ E& Z! B
图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,
6 A" ?/ O% h5 U  V$ i可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代7 L1 P' ?8 I; \0 `$ E  Z
码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
+ _; |5 y1 T) }' y1 B( }1 h然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件9 V' A& x, b; B* j4 C4 H
夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后! b( H( M* J5 `
面会经常用到)。如图 3.2.22 所示:. {; {( ^) M2 o4 d, h9 Q, _
! R2 d( B3 @; l, e. |) w" ^
, b. t) s7 P, q& F4 w; Y

$ s( ?' w1 S7 B1 Y+ \$ b编译遇到错误:% B- g/ c- _. L: D! f: [5 k  Z
( h" S8 Y5 j# W5 Q, i
SYSTEM\usart\usart.c(38): error:  #260-D: explicit type is missing ("int" assumed)
2 j) ^& n& q- y+ D  I( V" o/ q% |% k  _
解决:
3 p3 V* D/ b- f6 G; G7 a" Z; n6 d0 i& h  P1 n! H  l: F
函数前加void,这是printf函数的相关定义
. `& a( X3 l+ A- d1 u
. g7 F0 B7 g. \! R5 j5 lvoid _sys_exit(int x)
" I) D! m+ G! k( p* e& a5 o  Z. k( R( F( R& [2 e4 ]! \8 Q/ a
warning:#1-D last line of file ends without a; x8 J% y+ U8 r4 a
newline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个- a$ C& Z- M; f# {
警告,跳转到警告处,然后在后面输入多一个空行就好了。
3 U$ s6 p7 w0 Y
; H' M# N$ z* M2 xSYSTEM文件夹
1 e0 c& I9 ~9 N
8 Q& x* ]- S1 M% V+ X- _1、delay( J5 U2 O" |* Z/ w' ^% A- q
2 V: ?. E* c- `
顾名思义:延时函数文件夹
0 {5 Q3 p; ~6 R) k6 t( [- Z
) E& ~1 U9 [& a4 d
20190703112603207.png
9 q3 r. Y5 c; u- b0 H0 M4 Q- O& v
& p! _* ?  ^) G7 e/ V
***************SysTick定时器*****************着重理解
2 ^0 k( @; X% Z: A8 ]
7 E9 T# j0 t3 L4 _0 `, q$ xRTOS会用到, a! m6 D7 u0 e% i& c; W3 y
2 X' M5 f% N4 Z8 K2 m' |' v- t
20190703112856883.png
. o: B$ h* [; z' n- K7 }# z
/ {, m( X' d$ |
1 I# K+ w9 b$ d; z" g3 D
6 S1 Z! n% L4 ^
sys文件夹( D3 a) j: q2 ]- ?$ L
2 S! q# L$ j% N( \9 C8 l
20190703113106512.png
. C( a1 T7 D6 N' B' z2 w) F

( M& n" B! H8 E2 @ sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件3 p* h- j8 S( b3 ^8 [
% d" [" P1 y6 E6 Q" U
sys.h
; y/ e. E' z9 h6 n1 f0 ^8 k# N7 D! `( L" N9 a  r7 r4 v0 E
实现对 STM32F4 各个 IO 口的位操作,包括读入和输出4 _3 L- r" L$ y. m

. y- j( c9 N: X PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否8 Y# N- s7 h  O+ d5 d7 X( ?
等于 1,则可以使用 if(PAin(14)==1), Q  \4 c* J+ t, ^- _4 A
$ j. A! l+ @' g5 y# t$ k2 i8 |
  1. //
    7 h# f. a0 [2 d  E6 u7 [
  2. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq);                //系统时钟设置
    - g) B* h$ Z3 \3 z, T& v
  3. void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化  
    & V: U* x$ Y( G' u9 Q' H
  4. void Sys_Soft_Reset(void);                                                              //系统软复位* x" S  n. B/ y0 A! Z, [
  5. void Sys_Standby(void);                                                                 //待机模式         
    % M3 u7 Q; I! U/ |; Q
  6. void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);        //设置偏移地址& X. ^  t' a8 |8 P4 o8 U* d
  7. void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);                        //设置NVIC分组
    " l: M* }- Q" |6 s
  8. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断
    ( h8 x1 {" u( s; m1 b
  9. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM);                                //外部中断配置函数(只对GPIOA~I)  X+ ?, D3 ]6 B3 d
  10. void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx);                //GPIO复用功能设置) \! L3 p+ `( C
  11. void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数  " l! p: I2 J4 [% w& D% {' D
  12. //以下为汇编函数
    ; T! d, F2 x  }( t- C* T
  13. void WFI_SET(void);                //执行WFI指令
    4 A: P. p7 D7 s2 j4 h( Z
  14. void INTX_DISABLE(void);//关闭所有中断
    6 a) O' ~1 q& I+ v; U
  15. void INTX_ENABLE(void);        //开启所有中断
    7 z& L# v" k6 s0 p6 @2 C( e
  16. void MSR_MSP(u32 addr);        //设置堆栈地址
    8 v/ w2 X# l0 S& W. d
  17. #endif
复制代码
! `4 a) O# N' Z; f
************************时钟配置************************************" H0 T8 v+ V" N( d5 C1 j2 K
$ W) d9 t1 J) t. M& h3 P" Y; r
usart 文件夹
% q. y; W" G" E4 \9 o* C- \1 M! z/ A
usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收
: |5 _- }5 _7 m4 D9 J1 |; f6 j! w6 R- W. K0 E% I  k) G
usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32
' q& d. G' E1 t' c: V2 V- d3 zpclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使! D) ~9 Z/ r6 x6 k0 K5 g

6 j) p1 u5 X5 B/ ~6 D# `: H! @$ ^  K5 p5 M6 {9 b2 i6 E, ?
在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!& v9 P' J; g1 I% ?% S0 t
7 C2 O1 O* w$ o" ]
20190703182927542.png
' r1 S; n6 N/ v4 G2 o

) _1 |' \2 H( d# l/ J* VRCC->AHB1ENR|=1<<5;//使能 PORTF 时钟
. j( d8 w. q: r9 i1 r
9 x- d6 g, f) I5 `" h
4 l5 e6 s) K" S  w3 g# jI/O   输出I 输入
' l( [- \- G5 ?! p0 F$ w9 V; R: E1 E, o5 F# s  A1 I* I( s& {
1、使能时钟
! S# ?0 M  J% e2 H, l" _% \
* ~+ S: f* j8 p: R0 K& @2、IO设置   void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)
) j( G6 o, ]# d2 P- Q: J) t6 b3 r0 e1 Y$ D( c$ ]: B
//GPIO通用设置 * {: G. N' K5 [9 Q8 L
//GPIOx:GPIOA~GPIOI.  H% Y1 r4 E" t
//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.
! W$ {4 v6 t& y: x2 ~/ Y7 t//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入., k" Z; S' m% {; X9 [6 S& P7 V
//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.  s9 ^; E" l" O$ T$ I2 D
//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh.   a6 O  v6 X% ~. y2 H/ e- {1 H
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
# A8 |0 Z' U- _+ O8 q//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
' Q2 J8 a. I( ?8 F- }6 F
( w. J# m9 w; l/ p3、PFout(n)   PFin(n)
% w+ @. \6 `' w& S+ N0 n% e
2 s( Z- X6 _1 z( Z  Z! M0 T  }( i: ?, v& y" S! z
串口7 S9 c, [; R9 p2 T2 ~4 N& G

9 H6 D* d' b6 O; `2 w9 H0 XSTM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,8 S: A! X" l% o4 D& @* M

9 S- [3 A$ R+ q  z- E: Vuart_init(84,115200);  //串口初始化为 115200( K) M3 {/ l- i2 c1 c( c% M
8 j# g6 ]# @* U. a
  E4 Q( ~% `& ?$ Y% `5 H
收藏 评论0 发布时间:2021-12-6 11:32

举报

0个回答

所属标签

相似技术帖

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