So Tired !_! 逆水行舟, 不进则退!

14Feb/13

Eclipse和单片机开发环境Keil的集成编译工具KeilMake源码

Posted by Nick Xu

Eclipse和单片机开发环境Keil的集成编译工具KeilMake

通过KeilMake可以在Eclipse上进行单片机开发且编译

这个东东是为了通用而到网上抄一些需要用到的代码做出来的东东,估计很多代码是可以换成一两句话可以解决问题的. 最近经常有人找我问这个工具的问题,但是我已经不搞单片机好多年,所以把源码放出来,让有心人来维护吧:)

代码已经更新到github上,有需要的请自行下载和修改吧,为了能造福更多人群,希望改进后的代码能继续更新到github上,让更多人一起学习和研究

https://github.com/qdog2012/keilmake

25May/10

Eclipse和单片机开发环境Keil的集成编译工具KeilMake 使用详细教程

Posted by Nick Xu

Eclipse和单片机开发环境Keil的集成编译工具KeilMake
通过KeilMake可以在Eclipse上进行单片机开发且编译
使用方法:
配置Eclipse中项目Builder Settings的编译命令为
D:MyWorkSCMKeilMakeReleaseKeilMake D:MyWorkDevToolscommandkeilAT89S52.Uv2 ${ProjName} ${ProjDirPath} C:KeilUV2uv2.exe

红色部份修改为程序相应的路径即可,在Eclipse中写完程序后按Ctrl+B即可编译

AT89S52.Uv2 是Keil项目的模板文件,可根据个人需要进行修改,自带的模板配置是
AT89S52芯片,晶振为24Mhz,自动生成Hex文件

近期本人使用Keil进行单片机程序开发,感觉超不爽,在微软长期毒害下,我相信大部分跟着VS做开发的人们都对微软IDE的智能过于依赖。所以最 终我选择了Eclipse,虽然和微软的IDE相比还是有很大差距,不过对于我要做单片机开发的工作应该也可以满足了。在网上并没有找到Eclipse和 Keil可以很好集成在一起的插件,无而之下只好自己动手,搞搞科研了。

KeilMake就是这次的科研成果了,现与大家共同分享。

如果你的芯片和我现在用的一样是AT89S52,24Mhz,那么直接按照上面的方法即可使用,下面的内容可以略过。

如果是其它芯片,又和我一样想用Eclipse来进行单片机开发,那么请跟着我一步一步的操作。

环境安装,安装好Keil和Eclipse下面是我安装两个软件的版本

最新片Eclipse可以到这个地址 www.eclipse.org/downloads/ 下载C/C++版本的即可。

两个软件都安装好后我们就可以开始建立Keil模板了。

首先我们要知道自己的芯片的型号等信息,这里以举个AT89S52的例子,首先在Keil创建一个新项目

我们把项目文件保存为 stc89c52.Uv2 等会需要用到这个文件

CPU类型选择Atmel下面的AT89S52

新增加一个TEST.C的文件,内容空白就行了,因为我们不是在写代码,我们只是创建模板。

点击上面框框中的按钮对项目进行设置。

输入晶振的频率,我这块芯片是24MHz的。

设置生成时创建16进制文件,格式选择HEX-80

接下来用记事本打开刚才我们创建的项目文件 stc89c52.Uv2 留意红色框框的地方,这两个地方是我们需要修改的

File 1,1,<.test.c><test.c> 0x0  修改为 {CodeList}

stc89c52 修改为 {FileName}

完成上面步骤后,模板就创建完成了,我们把 stc89c52.Uv2 复制到别的地方,我放到D:MyWorkDevToolscommandkeil下

我把KeilMake.exe也放到这里了,这个不是必要的,我只是为了方便而已。

好了,现在到Eclipse了,如果在Eclipse上创建Keil项目呢?这里需要更正一个问题,我们不需要在Eclipse上创建Keil项 目,只要创建C项目就可以了,因为 KeilMake.exe 的工作就是把Eclipse上创建的C项目拿到Keil下去编译生成。

创建一个C项目

项目名称:testKeilProject

这里项目类型我选择Empty Project是因为我不需要用到MinGW GCC的类库,所以我选择空项目,然后Toolchains选择Other Toolchain,这一步我们可以直接点击Finish了。

现在到了最关键的设置时刻了,打开项目属性设置窗口。

Build command的值:D:MyWorkDevToolscommandkeilKeilMake.exe D:MyWorkDevToolscommandkeilstc89c52.Uv2 ${ProjName} ${ProjDirPath} C:KeilUV2uv2.exe

下面我们解释一下这行命令的意思

D:MyWorkDevToolscommandkeilKeilMake.exe KeilMake的路径。

D:MyWorkDevToolscommandkeilstc89c52.Uv2 我们刚才创建的Keil模板,以后只要是使用相同芯片做开发就可以使用这个模板。

${ProjName} 是Eclipse中的生成变量,是Eclipse里的项目名称,生成的HEX就是以这个值来命名。

${ProjDirPath} 是Eclipse中的项目目录

C:KeilUV2uv2.exe 是Keil的主程序路径

还有这里红色框框要留空,原值是all

点击File system按钮选择Keil目录下的c51inc目录

完成这一步后,基本上都完成了,我们来写一个程序测试一下。

Eclipse的自动完成功能

很简单的代码,来测试一下编译功能CTRL+B,记得要先保存再按CTRL+B,我刚开始时经常范这个错,所以代码没有编译到。

红色框框是编译生成输出的信息,看到

0 Error

creating hex file from "stc89c52"

这两行就是程序已经编译完成,在项目目录下会看到 stc89c52.hex 文件,把这个文件刷到单片机上试试看?

KeilMake是我学C语言的第一个程序,可能会存在一些BUG,如果使用过程中遇到什么问题,请随时和我联系,可发邮件到我的邮 箱:nick#workao.org 把#换为@

完。

附 KeilMake 下载地址:

KeilMake

22May/10

[原创]STM32基于FWLIB 3.12学习笔记一 搭舒适快捷的开发环境(MDK+FWLIB+ECLIPSE+JLINK+KEILMAKE)

Posted by Nick Xu

由于本人深习惯于微软的VS开发环境,首次接触KEIL给我的感觉就是难用,没有智能提示功能,我完全无法接受。在经过N个IDE的试用对比下,我 最终选择了ECLIPSE作为KEIL的代替,但还是需要KEIL的存在,因为需要它来编译。所以我又写了一个在ECLIPSE下用来集成KEIL编译的 小程序KEILMAKE,有了KEILMAKE,就可以在ECLIPSE下直接编译生成HEX,还可以调用KEIL进行程序DEBUG,呵呵,是不是觉得 很爽呢?下面先把需要准备的软件都下载好。

1.MDK 3.5下载地址:
评估版 www.mystm32.com/bbs/viewthread.php
破解 www.mystm32.com/bbs/viewthread.php

2.FWLIB下载地址:
官方下载 www.st.com/stonline/products/support/micro/files/stm32f10x_stdperiph_lib.zip
里面已经包含帮助文档

3.ECLIPSE下载地址:
C/C++版本 www.eclipse.org/downloads/download.php

4.JLINK驱动下载地址:
4.08A版本 www.mystm32.com/bbs/viewthread.php

5.KEILMAKE下载地址:
www.1983111.com/download/show_40342.aspx

关于KEILMAKE的更详细信息请关注这里:showvi.com/Blog/ViewAirticle/188

把MDK,ECLIPSE,JLINK都安装好后,解压FWLIB,我是解压到C盘目录下,然后把Template目录复制一份,命名为 FirstProject,以后的项目就基于此模板进行开发。Template是FWLIB自带的模板,以后的项目只要在这个项目上作修改就可以了。

接下是打开项目,双击FirstProjectRVMDKProject.Uv2,系统会自动用KEIL打开。

由于模板默认会启用PLL2,在105和107系列才有,而我用的芯片是103FRB,所以还需要进行一下设置才能正常运行此模板的代码。
点击下图中红色框框的按钮进行设置

DEVICE请根据自己的芯片型号选择

Define的原值 USE_STDPERIPH_DRIVER, STM32F10X_CL, USE_STM3210C_EVAL 修改为 USE_STDPERIPH_DRIVER, STM32F10X_MD

设置使用JLINK进行调试

JLINK的一些设置

接下来把所有STM_EVAL相关的东西都删掉,对于初学者来说,越简单越好

#include "stm32_eval.h"
#include <stdio.h>

#ifdef USE_STM3210B_EVAL
#include "stm3210b_eval_lcd.h"
#elif defined USE_STM3210E_EVAL
#include "stm3210e_eval_lcd.h"
#elif defined USE_STM3210C_EVAL
#include "stm3210c_eval_lcd.h"
#endif

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#ifdef USE_STM3210B_EVAL
#define MESSAGE1   "STM32 Medium Density"
#define MESSAGE2   " Device running on  "
#define MESSAGE3   "   STM3210B-EVAL    "
#elif defined USE_STM3210E_EVAL
#define MESSAGE1   " STM32 High Density "
#define MESSAGE2   " Device running on  "
#define MESSAGE3   "   STM3210E-EVAL    "
#elif defined USE_STM3210C_EVAL
#define MESSAGE1   " STM32 Connectivity "
#define MESSAGE2   " Line Device running"
#define MESSAGE3   " on STM3210C-EVAL   "
#endif

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
USART_InitTypeDef USART_InitStructure;

/* Private function prototypes -----------------------------------------------*/
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/* Initialize LEDs, Key Button, LCD and COM port(USART) available on
STM3210X-EVAL board ******************************************************/
STM_EVAL_LEDInit(LED1);
STM_EVAL_LEDInit(LED2);
STM_EVAL_LEDInit(LED3);
STM_EVAL_LEDInit(LED4);

/* USARTx configured as follow:
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

STM_EVAL_COMInit(COM1, &USART_InitStructure);

/* Initialize the LCD */
#ifdef USE_STM3210B_EVAL
STM3210B_LCD_Init();
#elif defined USE_STM3210E_EVAL
STM3210E_LCD_Init();
#elif defined USE_STM3210C_EVAL
STM3210C_LCD_Init();
#endif

/* Display message on STM3210X-EVAL LCD *************************************/
/* Clear the LCD */
LCD_Clear(White);

/* Set the LCD Back Color */
LCD_SetBackColor(Blue);
/* Set the LCD Text Color */
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line0, MESSAGE1);
LCD_DisplayStringLine(Line1, MESSAGE2);
LCD_DisplayStringLine(Line2, MESSAGE3);

/* Retarget the C library printf function to the USARTx, can be USART1 or USART2
depending on the EVAL board you are using ********************************/
printf("nr %s", MESSAGE1);
printf(" %s", MESSAGE2);
printf(" %snr", MESSAGE3);

/* Turn on leds available on STM3210X-EVAL **********************************/
STM_EVAL_LEDOn(LED1);
STM_EVAL_LEDOn(LED2);
STM_EVAL_LEDOn(LED3);
STM_EVAL_LEDOn(LED4);
/**
* @brief  Retargets the C library printf function to the USART.
* @param  None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(EVAL_COM1, (uint8_t) ch);

/* Loop until the end of transmission */
while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
{}

return ch;
}

#ifdef  USE_FULL_ASSERT

/**
* @brief  Reports the name of the source file and the source line number
*   where the assert_param error has occurred.
* @param  file: pointer to the source file name
* @param  line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %drn", file, line) */

/* Infinite loop */
while (1)
{
}
}
#endif

/**
* @}
*/
上面这些代码都是要删除掉的,删除代码后进行最后一步设置

完成后回到KEIL主界面,我们看到剩下的代码只有很少,如果你不确定到底要删除哪些代码,可以把剩下的代码复制到MAIN.C文件中,下面是文件 剩下的代码:

/**
******************************************************************************
* @file    Project/Template/main.c
* @author  MCD Application Team
* @version V3.1.2
* @date    09/28/2009
* @brief   Main program body
******************************************************************************
* @copy
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2>
*/

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

/** @addtogroup Template_Project
* @{
*/

/* Private functions ---------------------------------------------------------*/

/**
* @brief  Main program.
* @param  None
* @retval None
*/
int main(void)
{
/* Setup STM32 system (clock, PLL and Flash configuration) */
SystemInit();

/* Add your application code here
*/

/* Infinite loop */
while (1)
{
}
}

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/

好了,最关键的时刻了,编译一下看是否成功?

0个错误,0个警告,MDK的设置基本就完成了,下一步设置ECLIPSE

打开ECLIPSE,打开后会提示选择工作目录,我们设置为C:STM32F10x_StdPeriph_Lib_V3.1.2 Project,如图:

第一次运行ECLIPSE会显示欢迎界面,关闭它,创建一个C项目

直接点击Finish,然后对项目进行一些设置

首先设置系统的环境变量,在 ”我的电脑“ 右键 ”属性“ 》“高级” 》 “环境变量” 》 新建名为:FWLIB_PATH
值为:..;C:STM32F10x_StdPeriph_Lib_V3.1.2LibrariesCMSISCoreCM3;C: STM32F10x_StdPeriph_Lib_V3.1.2LibrariesSTM32F10x_StdPeriph_Driverinc;C:STM32F10x_StdPeriph_Lib_V3.1.2UtilitiesSTM32_EVAL;C:STM32F10x_StdPeriph_Lib_V3.1.2UtilitiesSTM32_EVALSTM3210C_EVAL;C:KeilARMINC;C:KeilARMINCSTSTM32F10x;C:KeilARMRV31inc

添加完环境变量,我们需要重启一下ECLIPSE,不然他会找不到新增加的环境变量,重启后进行下列操作:

点击完成后会提示是否重新编译,点击“否”

最后一步就是用KEILMAKE来配置ECLIPSE的编译环境了。

首先建立项目模板,用记事本打开C:STM32F10x_StdPeriph_Lib_V3.1.2ProjectFirstProject RVMDKProject.Uv2

只需要把File 1,1开头的那些,在前面加个# 号,然后加上{CodeList},最后就是另存为一个模 板,这里保存为stm32.uv2

打开ECLIPSE项目属性对话框

Build command输入:[KEILMAKE所在路径] [uv3.exe所在路径] [模板所在路径]
如:D:MyWorkSCMKeilMakeReleaseKeilMake C:KeilUV3Uv3.exe C:STM32F10x_StdPeriph_Lib_V3.1.2ProjectFirstProjectRVMDKstm32.Uv2

Build(Incremental build)内容留空,这样编译环境就设置好了,我们试一下编译。

我们可以看到编译结果和在MDK上编译的结果是一致的,呵呵,开发环境到此结束。

   
site
site