STM32固件库移植 - MAT

更新时间:2024-04-17 20:55:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

0814_lesson2 笔记

1:栈指针的概念

Stack_Size EQU 0x00000200

2:堆的概念

Heap_Size EQU 0x00000000

3:DCD定义4个内存地址(0~3,4~7)

4:设置进入mian.c

5:新建main.c注意事项:

0817 固件库移植

1:错误1

0817 建立STM32库函数工程模板

建立“工程模板练习”:stm32库、main空文件夹、project空文件夹、output空文件夹

新建工程分四个组注意:新建的项目名存放在“project”下,选择芯片,不加载默认启动文件。

添加组1:CM3(ARM内核访问定

义):\\STM32F10x_StdPeriph_Lib_V3.5.0\\Libraries\\CMSIS\\CM3\\CoreSupport\\core_cm3.c

添加组2:STlib(ST编写的外设

库)STM32F10x_StdPeriph_Lib_V3.5.0\\Libraries\\STM32F10x_StdPeriph_Driver\\src下的需要的部分

添加组3:system内容是ST工程模板中的“.c”文件

(\\STM32F10x_StdPeriph_Lib_V3.5.0\\Project\\STM32F10x_StdPeriph_Template)

添加组4:建立自己的main.c(放在main空文件夹下),在添加一个启动的.s文件

(\\STM32F10x_StdPeriph_Lib_V3.5.0\\Libraries\\CMSIS\\CM3\\DeviceSupport\\ST\\STM32F10x\\startup\\arm的startup_stm32f10x_md(中等容量,按照所使用的选择相应的))

在添加完组之前千万不要点击“编译”

指定输出路径:到output文件夹 ,避免主目录下的文件杂乱。

建立4组添加相应文件,并确认输出文件路径后可以编译。

移植后的错误 1:..\\STM32F10x_StdPeriph_Lib_V3.5.0\\Libraries\\STM32F10x_StdPeriph_Driver\\src\\misc.c(24): error: #5: cannot open source input file \No such file or directory 找不到\文件 解决:指定出其路径

错误2:

:..\\STM32F10x_StdPeriph_Lib_V3.5.0\\Libraries\\STM32F10x_StdPeriph_Driver\\src\\misc.c(99): warning: #223-D: function \没有发现\(参数裁决)的存在。(STM32F10X_MD USE_STDPERIPH_DRIVER)

错误3:

e:\\Program Files\\MDK_ARM\\ARM\\INC\\ST\\STM32F10x\\stm32f10x_type.h(23): error: #256: invalid redeclaration of type name \(declared at line 470 of \Files\\MDK_ARM\\ARM\\INC\\ST\\STM32F10x\\stm32f10x.h\

表示安装的MDK编译器本身的自带的ST_M3的库与当前所要使用的3.5版本的库冲突,解决要加3个制定的地址:

A:..\\STM32F10x_StdPeriph_Lib_V3.5.0\\Libraries\\CMSIS\\CM3\\CoreSupport

B:..\\STM32F10x_StdPeriph_Lib_V3.5.0\\Libraries\\CMSIS\\CM3\\DeviceSupport\\ST\\STM32F10x C:..\\STM32F10x_StdPeriph_Lib_V3.5.0\\Project\\STM32F10x_StdPeriph_Template

错误4:

..\\STM32F10x_StdPeriph_Lib_V3.5.0\\Libraries\\CMSIS\\CM3\\DeviceSupport\\ST\\STM32F10x\\stm32f10x.h(96): error: #35: #error directive: \select first the target STM32F10x device used in your application (in stm32f10x.h file)\错误指定处:

#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)

#error \file)\#endif

解决:添加STM32F10X_MD因为使用的是中等容量(ROM)的芯片

编译后直至出现0-0; compiling stm32f10x_it.c...

compiling system_stm32f10x.c... linking...

Program Size: Code=848 RO-data=268 RW-data=20 ZI-data=1636 \移植练习.axf\到此一个完整库函数应用工程的空模板建成!

在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息:

Program Size: Code=6320 RO-data=4864 RW-data=44 ZI-data=1636

代表的意思:

Code :是程序中代码所占字节大小

RO-data :程序中所定义的指令和常量大小 (个人理解 :Read Only) RW-data :程序中已初始化的变量大小 (个人理解”:Read/Write) ZI-Data :程序中未初始化的变量大小 (个人理解 :Zero Initialize) ROM(Flash) size = Code+RO-data+RW-data; RAM size = RW-data+ZI-data

可以通过.map查看占用的flash和ram大小

Program Size: Code=848 RO-data=268 RW-data=20 ZI-data=1636

Total RO Size (Code + RO Data) 1116 ( 1.09kB) Total RW Size (RW Data + ZI Data) 1656 ( 1.62kB) Total ROM Size (Code + RO Data + RW Data) 1136 ( 1.11kB)

1:LED工程

在一个基础的库函数孔模板上添加main.c的代码:

1:添加头文件#include\(打开了解)

2:初始化GPIO(和0814_lesson2讲的操作一样,不同点在与这次试用的是库函数调用的方式操作寄存器的),依照STM32固件库使用手册的中文翻译版,

void LED_init() { // // //

IO.GPIO_Pin=GPIO_Pin_8;

IO.GPIO_Speed=GPIO_Speed_50MHz; IO.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_InitTypeDef IO; //变量的形式 IO. *IO是指针的形式 IO->

4h 20h

1

1

!!!!!!!!!!!!

RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph,FunctionalState NewState); //cmd:开关 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);//开A口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD ,ENABLE);//开D口时钟

// }

GPIO_Init(GPIOA,&IO); //使用这个函数是需要初始化结构体成员

GPIO_Init(GPIOA, GPIO_InitTypeDef* GPIO_InitStruct);//A口初始化 IO.GPIO_Pin=GPIO_Pin_2;

IO.GPIO_Speed=GPIO_Speed_50MHz; IO.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOD,&IO);

3.封装LED子函数 void LED1_ON() { GPIO_ResetBits(GPIOA,GPIO_Pin_8); }

void LED1_OFF() { GPIO_SetBits(GPIOA,GPIO_Pin_8); }

void LED2_ON() { GPIO_ResetBits(GPIOD,GPIO_Pin_2); }

void LED2_OFF() { GPIO_SetBits(GPIOD,GPIO_Pin_2); }

4调用封装函数即可 void delay(u32 x) { while(x--); }

int main() { LED_init(); while(1) { LED1_ON(); LED2_ON(); delay(1000000); LED1_OFF();

LED2_OFF(); delay(1000000); } }

到此一个完整的LED库函数版本的STM32程序完成!!!!!!

接下来需要像51一样把LED的“LED.c”、“LED.h”做成文件夹的形式方便以后试用。

1:现在工程的主目录下新建“LED空文件夹”把做好的“LED.c”、“LED.h”放进去,在以组的形式添加到工程目录下(在目录下新建LED组,再把文件夹下的LED.c加进来),同时要把LED.h的路径加载到如下图所示:往后的每个使用的“.h”文件都要添加进来!!!!!!!

警告1:..\\LED\\LED.c(37): warning: #1-D: last line of file ends without a newline 需要在代码的最后一行加回车换行

警告2:..\\LED\\LED.h(10): warning: #1295-D: Deprecated declaration LED2_OFF - give arg types

需要在没有形参的函数中假如void的标志(仅在.h文件中)

2::12864的移植 BSP:板级支持包

1:添加原先51的12864.c和12864.h到主目录下的12864文件夹中 2:设置软件包含12864.h头文件的位置

编译解决出现的问题,所谓的移植就是指解决编译产生的问题 问题: 1:..\\12864\\12864.h(4): error: #5: cannot open source input file \directory

解决:#include\ //替代#include

2:..\\12864\\12864.h(9): error: #20: identifier \Sbit、P3等没有定义。

解决://sbit RS_CS=P3^5; //-- 4pin //sbit RW_SID=P3^6; //-- 5pin //sbit E_CLK=P3^7; //-- 6pin

//用stm32开发板的PA13(CS)、PA14(RW)、PA15(EN)替换

#define RS_CS_0 GPIO_ResetBits(GPIOA,GPIO_Pin_8); //从新定义管脚!!! #define RS_CS_1 GPIO_SetBits(GPIOA,GPIO_Pin_8); #define RW_SID_0 GPIO_ResetBits(GPIOA,GPIO_Pin_9); #define RW_SID_1 GPIO_SetBits(GPIOA,GPIO_Pin_9); #define E_CLK_0 GPIO_ResetBits(GPIOA,GPIO_Pin_10); #define E_CLK_1 GPIO_SetBits(GPIOA,GPIO_Pin_10);

同时也初始化相应管脚(开时钟、设置IO状态)所以要有IO口的初始化函数: 包含在12864.c中。当然下文的对应的12864操作也得改的和后来定义的一样(RS_CS_1) void LCD_prot() { GPIO_InitTypeDef IO; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );//A口时钟 ,打开

}

IO.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; IO.GPIO_Speed=GPIO_Speed_50MHz; IO.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&IO);//A口初始化

本文来源:https://www.bwwdw.com/article/zmip.html

Top