应用FPU
1、工程文件
startup_stm32f40_41xxx.s
新建一个 test.c 文件,并保存在 USER 文件夹下
2、工程文件夹
USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,
OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)
SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到
3、工程分组
Target 目录树上点击右键 Manage Project Items
我没改文件夹,还是用原来Objects,Listings
4、设置
图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比
如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在
MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加
进来。
图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果
越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代
码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。
图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,
可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代
码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件
夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后
面会经常用到)。如图 3.2.22 所示:
编译遇到错误:
SYSTEMusartusart.c(38): error: #260-D: explicit type is missing ("int" assumed)
解决:
函数前加void,这是printf函数的相关定义
void _sys_exit(int x)
warning:#1-D last line of file ends without a
newline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个
警告,跳转到警告处,然后在后面输入多一个空行就好了。
SYSTEM文件夹
1、delay
顾名思义:延时函数文件夹
***************SysTick定时器*****************着重理解
RTOS会用到
sys文件夹
sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件
sys.h
实现对 STM32F4 各个 IO 口的位操作,包括读入和输出
PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否
等于 1,则可以使用 if(PAin(14)==1)
//
u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq); //系统时钟设置
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化
void Sys_Soft_Reset(void); //系统软复位
void Sys_Standby(void); //待机模式
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset); //设置偏移地址
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group); //设置NVIC分组
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM); //外部中断配置函数(只对GPIOA~I)
void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx); //GPIO复用功能设置
void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数
//以下为汇编函数
void WFI_SET(void); //执行WFI指令
void INTX_DISABLE(void);//关闭所有中断
void INTX_ENABLE(void); //开启所有中断
void MSR_MSP(u32 addr); //设置堆栈地址
#endif
************************时钟配置************************************
usart 文件夹
usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收
usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32
pclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使
用
在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!
RCC->AHB1ENR|=1<<5;//使能 PORTF 时钟
I/O 输出I 输入
1、使能时钟
2、IO设置 void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)
//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.
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
3、PFout(n) PFin(n)
串口
STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,
uart_init(84,115200); //串口初始化为 115200
应用FPU
1、工程文件
startup_stm32f40_41xxx.s
新建一个 test.c 文件,并保存在 USER 文件夹下
2、工程文件夹
USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,
OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)
SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到
3、工程分组
Target 目录树上点击右键 Manage Project Items
我没改文件夹,还是用原来Objects,Listings
4、设置
图中 1 处设置的 STM32F40_41xxx 宏,是为了兼容低版本的 MDK(比
如 MDK4/MDK3 等)才添加的,MDK5 在你选择器件的时候,就会内部定义这个宏,因此在
MDK5 下面,这里不设置也是可以的。但是为了兼容低版本的 MDK,我们还是将这个宏添加
进来。
图中 2 处是编译器优化选项,有-O0~-O3 四种选择(default 则是-O2),值越大,优化效果
越强,但是仿真调试效果越差。这里我们选择-O0 优化,以得到最好的调试效果,方便开发代
码,在代码调试结束后,大家可以选择-O2 之类的优化,得到更好的性能和更少的代码占用量。
图中 3 处,One ELF Section per Function 主要是用来对冗余函数的优化。通过这个选项,
可以在最后生成的二进制文件中将冗余函数排除掉,以便最大程度地优化最后生成的二进制代
码,所以,我们一般勾选上这个,这样可以减少整个程序的代码量。
然后在 Include Paths 处(4 处),点击 5 处的按钮。在弹出的对话框中加入 SYSTEM 文件
夹下的 3 个文件夹名字,把这几个路径都加进去(此操作即加入编译器的头文件包含路径,后
面会经常用到)。如图 3.2.22 所示:
编译遇到错误:
SYSTEMusartusart.c(38): error: #260-D: explicit type is missing ("int" assumed)
解决:
函数前加void,这是printf函数的相关定义
void _sys_exit(int x)
warning:#1-D last line of file ends without a
newline。这个警告是在告诉我们,在某个 C 文件的最后,没有输入新行,我们只需要双击这个
警告,跳转到警告处,然后在后面输入多一个空行就好了。
SYSTEM文件夹
1、delay
顾名思义:延时函数文件夹
***************SysTick定时器*****************着重理解
RTOS会用到
sys文件夹
sys.c 和 sys.h 是由 ALIENTEK 提供,而其他 6 个文件,则都是拷贝自 STM32F4 的 CMSIS 库文件
sys.h
实现对 STM32F4 各个 IO 口的位操作,包括读入和输出
PORTA的第七个 IO 口输出 1,则可以使用 PAout(6)=1;即可实现。我要判断 PORTA 的第 15 个位是否
等于 1,则可以使用 if(PAin(14)==1)
//
u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq); //系统时钟设置
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq); //时钟初始化
void Sys_Soft_Reset(void); //系统软复位
void Sys_Standby(void); //待机模式
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset); //设置偏移地址
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group); //设置NVIC分组
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);//设置中断
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM); //外部中断配置函数(只对GPIOA~I)
void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx); //GPIO复用功能设置
void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数
//以下为汇编函数
void WFI_SET(void); //执行WFI指令
void INTX_DISABLE(void);//关闭所有中断
void INTX_ENABLE(void); //开启所有中断
void MSR_MSP(u32 addr); //设置堆栈地址
#endif
************************时钟配置************************************
usart 文件夹
usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收
usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32
pclk2,u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使
用
在配置 STM32F4 外设的时候,任何时候都要先使能该外设的时钟!
RCC->AHB1ENR|=1<<5;//使能 PORTF 时钟
I/O 输出I 输入
1、使能时钟
2、IO设置 void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)
//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.
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
3、PFout(n) PFin(n)
串口
STM32F4 的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应 IO 口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了,
uart_init(84,115200); //串口初始化为 115200
举报