STMCU小助手
发布时间:2021-12-6 11:32
|
应用FPU + m' _$ i, F+ `1 V2 X/ V0 B7 m
4 f5 f& C! P8 ^. z7 R x . w5 V) w* ?' [2 D+ x5 L, R# { 7 B4 Z U) d; H 1、工程文件 ) O8 \% ?1 O; a: e* y. e0 C startup_stm32f40_41xxx.s ; 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 USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,- b. {" I* m# [7 j7 @. h# K1 u OBJ 则用来存放这些编译过程中产生的中间文件(包括.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 3、工程分组 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
5 W, b( `" }5 R1 u
4、设置
" e- u1 ?" \& F3 X I% q 图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比0 X' f" u" g" t( ]9 T4 z0 K1 s 如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在 MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加 进来。 图中 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 主要是用来对冗余函数的优化。通过这个选项, 可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代7 L1 P' ?8 I; \0 `$ E Z 码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。 然后在 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 编译遇到错误:% 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) + D I( V" o/ q% |% k _ 解决: 6 d0 i& h P1 n! H l: F 函数前加void,这是printf函数的相关定义 void _sys_exit(int x) . 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# { 警告,跳转到警告处,然后在后面输入多一个空行就好了。 SYSTEM文件夹 1、delay( J5 U2 O" |* Z/ w' ^% A- q 2 V: ?. E* c- ` 顾名思义:延时函数文件夹
& p! _* ? ^) G7 e/ V ***************SysTick定时器*****************着重理解 RTOS会用到, a! m6 D7 u0 e% i& c; W3 y 2 X' M5 f% N4 Z8 K2 m' |' v- t
/ {, 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
sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件3 p* h- j8 S( b3 ^8 [ % d" [" P1 y6 E6 Q" U sys.h ! `( L" N9 a r7 r4 v0 E 实现对 STM32F4 各个 IO 口的位操作,包括读入和输出4 _3 L- r" L$ y. m 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 |
************************时钟配置************************************" H0 T8 v+ V" N( d5 C1 j2 K $ W) d9 t1 J) t. M& h3 P" Y; r usart 文件夹 4 \9 o* C- \1 M! z/ A usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收 6 j! w6 R- W. K0 E% I k) G usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32 pclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使! D) ~9 Z/ r6 x6 k0 K5 g 用 K5 p5 M6 {9 b2 i6 E, ? 在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!& v9 P' J; g1 I% ?% S0 t 7 C2 O1 O* w$ o" ]
RCC->AHB1ENR|=1<<5;//使能 PORTF 时钟 I/O 输出I 输入 9 V; R: E1 E, o5 F# s A1 I* I( s& { 1、使能时钟 2、IO设置 void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD) 6 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. //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,保留. //注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!! 3、PFout(n) PFin(n) }( i: ?, v& y" S! z 串口7 S9 c, [; R9 p2 T2 ~4 N& G STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,8 S: A! X" l% o4 D& @* M uart_init(84,115200); //串口初始化为 115200( K) M3 {/ l- i2 c1 c( c% M 8 j# g6 ]# @* U. a E4 Q( ~% `& ?$ Y% `5 H |
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版