STMCU小助手
发布时间:2021-12-6 11:32
|
应用FPU - Z: r) y/ T0 \. S" y% X/ ~
1、工程文件 startup_stm32f40_41xxx.s 新建一个 test.c 文件,并保存在 USER 文件夹下 2、工程文件夹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 提供,可以在光盘任何一个实例的工程目录下找到 3、工程分组9 x1 N) ?0 ^6 `. e) u 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
$ J1 m# c* h$ }- A" ]
4、设置+ Q4 H% A7 u& S/ R% p3 f 0 S9 {: V' \. I4 l5 t
图中 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,我们还是将这个宏添加 进来。 图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果" m9 n7 O1 K A8 _: s" E 越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代 码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。 图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项, 可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代! W- o4 x" |7 @: p7 k 码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。 然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件/ t3 d+ u' f! ?% g6 g7 x& t- K3 k6 } 夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后 面会经常用到)。如图 3.2.22 所示: q8 v7 F' D B$ i* t1 Q3 w t0 g0 ~* U; T5 G' r2 J 编译遇到错误: ) 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 解决:2 ?+ o$ p* ^+ h. ^ 函数前加void,这是printf函数的相关定义 void _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 SYSTEM文件夹 1、delay* H! \: X9 a" b- b! ^ 顾名思义:延时函数文件夹. }+ V- J! s1 ]4 _0 Y
9 @# u) W/ @; _8 X ***************SysTick定时器*****************着重理解 - r- |% h3 W7 c7 S( X; Z8 K RTOS会用到5 A! E+ b( [0 ?1 H5 s ( O: h, a% H. ?& q6 Y( V
2 t! D) _& m3 E$ g+ P sys文件夹
sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件 sys.h 7 }+ X2 Q j2 \4 C7 G K 实现对 STM32F4 各个 IO 口的位操作,包括读入和输出7 {8 j% ^% |7 ] 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
************************时钟配置************************************ usart 文件夹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 usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32 pclk2,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 外设的时候,任何时候都要先使能该外设的时钟! & u) E6 Q; e) l7 e% L1 ]. N& Z
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" | I/O 输出I 输入/ I5 @* M6 a0 _& @ ; g" c' Y& v. ~4 V 1、使能时钟 - 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 //GPIO通用设置 //GPIOx:GPIOA~GPIOI. //BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8. //MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入. //OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出. //OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh. + E$ E$ w; [ L- F //PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留. //注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!! 3、PFout(n) PFin(n) 6 V }4 r, | l1 Z' J4 E4 f 串口! j& Q8 c, H/ C2 [3 K% i1 H* E STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,$ }! @' A& i6 i% _6 k! J% M 1 ~7 A1 \7 [# C9 R6 `! u; \2 D uart_init(84,115200); //串口初始化为 115200 |
【福利三:雨露均沾·逢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 官方根治方案
微信公众号
手机版