应用FPU 1、工程文件 & O! A* P& H+ j# Z5 a4 w, `' `: @ startup_stm32f40_41xxx.s 5 K6 I& l' B: o' K; ^1 Y' p! \ \ 新建一个 test.c 文件,并保存在 USER 文件夹下 0 K" Y' h& L! L- g 2、工程文件夹 USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,* A( z0 f, J; |/ ?3 u/ i OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面) . y8 a8 S9 }& K2 V3 ~* T# z6 j SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到 ' t7 G5 l5 J; k B" m/ @ 3、工程分组( \' X; w+ P: f1 ~! V4 W Target 目录树上点击右键 Manage Project Items ; `. J5 L7 C) p- X; M- `2 L 我没改文件夹,还是用原来Objects,Listings* q1 E' j/ u7 I; d4 G, i # n. K. a2 E l. R, p5 J- I9 r$ k 7 F( {& k/ ~/ V$ r 4、设置 $ u4 [+ g; q9 p% K5 B: m 图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比2 k/ J* x9 T- b) Y) D* S1 p 如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在* k- ^$ n. I/ e& ^ MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加 进来。) V% p1 s, E$ j# x9 ~ p 图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果" z2 S) q. c5 O* Z" ?+ \ 越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代 码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。 图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项, 可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代& I1 U! ]: j* z0 `: S# J 码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。 然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件. Q3 J6 {1 Y% g: {2 D. B 夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后 i7 a, l) Q0 a$ c% h$ R+ f 面会经常用到)。如图 3.2.22 所示:% M4 f+ m9 N7 u+ X1 q 3 p( ~4 \8 W# X/ T# G0 K' S# @ 编译遇到错误:' K& u, D( d5 Z7 @ r% J SYSTEM\usart\usart.c(38): error: #260-D: explicit type is missing ("int" assumed) 解决: 函数前加void,这是printf函数的相关定义 7 k- _/ U8 X- P/ C4 A' G: ^$ _ void _sys_exit(int x) warning:#1-D last line of file ends without a9 D7 E' Y- P* t: V' O ]) K6 O1 T. \! U newline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个 警告,跳转到警告处,然后在后面输入多一个空行就好了。 " N; l: h- d' n; X SYSTEM文件夹 1、delay% ~) e4 j5 N" y" v * v( T8 O3 S5 v9 e( f% B. E 顾名思义:延时函数文件夹: r* W4 J, B! E. U: ] ***************SysTick定时器*****************着重理解; ?( B% m5 p) W: ] * ^% B' g9 b% D7 P RTOS会用到 * r* R1 l5 I+ x sys文件夹 sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件 " t V9 q9 p, q4 H8 I9 C sys.h , D! I; G; e$ E- F0 j 6 C. c8 E- K. g/ Q1 B 实现对 STM32F4 各个 IO 口的位操作,包括读入和输出 / t7 p" v0 _- O* g8 x9 j4 n/ d0 M PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否8 ]7 ~' X) S; t$ { 等于 1,则可以使用 if(PAin(14)==1), A5 [! L9 d9 J2 X) ` 5 Q. R9 A+ p) F# Z
************************时钟配置************************************ usart 文件夹 $ l4 L! V; i0 |( F usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收 : S# F1 [- V4 c5 w, N; ? usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32. O, N3 A J' k& G, ~ pclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使 用4 A, c$ n( `: ~2 I2 x8 {" _0 e4 x 在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟! ( l$ d6 i# h8 {, i RCC->AHB1ENR|=1<<5;//使能 PORTF 时钟 L. t' N* ?5 J" }2 ~ ; T; M3 o, z& @5 z$ v 9 `' j- u1 N7 }% }- ?( J' m I/O 输出I 输入 1、使能时钟% k1 ~ E! D' d' Y) a 2、IO设置 void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)9 `& p: z% O% L3 L * G& I: `5 }& X# R4 U8 G' M/ l- Q //GPIO通用设置 1 S# X/ z* y! E. F //GPIOx:GPIOA~GPIOI. //BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.4 E; o0 H" s! L) B$ \ //MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入. O- F. z* s7 c //OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出. //OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh. # e' }, V; w! } //PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留. //注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!! / P" \- W& x$ j, w2 s 3、PFout(n) PFin(n) & {. ]5 Z" n3 S 串口 ! C: b3 D. g6 k' {- U- \ STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了, 4 M! M, w1 o* u* q, |8 ~ uart_init(84,115200); //串口初始化为 1152000 S- b2 M4 E- g0 |$ d! [ F: ?6 l8 k1 z5 a6 l( W- s$ B2 l |
STM32固件库分享,超全系列整理
【中文文档】AN3965_STM32F40x和STM32F41x基于串口的IAP
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32F4中文用户手册
基于STM32F407的FreeRTOS阶段性的总结(13)
STM32F400、STM32F402 Cortex-M4超值单片机
基于STM32F407的FreeRTOS获取各任务运行时间及占用情况(4)
基于STM32F407的FreeRTOS任务的挂起与恢复(3)
基于STM32F407的FreeRTOS任务的创建与删除经验分享(2)
基于STM32F407的FreeRTOS环境搭建经验分享(1)