2.1.1keil MDK 及IAR for ARM, Evaluation version 5.50下的安装
这一个星期就在弄这个软件的安装了,还好,可以实现,自我鼓励一下,不要放弃,坚持下去,你就会成功。
言入正题,现有的硬件设备,我们的开发板,和实验室现有的JLINK for arm,即仿真器,买的话好像也不贵。一百元左右。不过我没买过。
首先 先安装J-link的驱动软件,可以去IAR公司官网上下载,但好像要输入J-link后面的S/N才可以
其次 软件与版本的选择
发现用于STM32的编译环境一般有两种,一种是Keil MDK,一种是IAR for arm
1.学单片机的时候用过Keil,于是费了好大劲把Keil MDK 4.12装上了
Keil MDK 4.12的安装文件及破解文件 下载地址http://www.cr173.com/soft/13698.html
接着 在论坛上下了一个LED程序,先试试编译及下载连接通路是否联通,
LED程序下载地址(不好意思,忘了哪位上传的啦)
http://shareupload.eepw.com.cn/201204/094215394f487614acfed72aca029c57.rar
可接下来出现了问题,缺少 agdirdi.dll
又折腾了一番,没办法,只好先安装 Keil MDK3.15b 然后把里面的ARM文件夹拷出来,然后卸载,继续装Keil MDK4.12, 然后把 agdirdi.dll拷到Keil MDK 的安装目录下的ARM文件夹中 ,然后就可以成功编译了。但连好下载器 准备下载的时候又弹出
所以 Keil MDK 下载STM32F103ZET正式宣告失败,也许是我自己没有设置好,也许是我的Jlink 仿真器不支持
于是,只好转型到IAR开发环境了
2.还是照旧,第一步安装IAR for arm 开发环境,我选择的下载地址是
http://zhidao.baidu.com/question/189652446.html?an=0&si=8
按照满意答案中说的下载第四个(安装文件)和第五个(破解文件)就可以了。
也可以去官网上下,然后去下面的地址 下载注册机。
http://www.ourdev.cn/forum.php?mod=viewthread&tid=4002630
啰嗦下安装步骤:1.先打开IAR.RAR 安装 IAR Embedded Workbench for ARM, Evaluation version 5.50,2.然后打开IAR注册机,安装完后选择PART——A。单击ITEM选择Evaluation version 5.50,之后generate就可以了,在安装IAR Embedded Workbench for ARM, Evaluation version 5.50时 把ID后放在lisence 一栏然后next,再把注册机的最后一大串数字 黏贴过来就可以安装了。也破解成功了
我现在最最想说是 百度太不给力了,还是google 好用。
呵呵 是真的好用
对于跟我一样的新手,建议大家还是用库文件,给个下载地址
http://dldx.csdn.net/fd.php?i=852137485171988&s=5b23f322e0aede6099068d114e81fc24
前面安装的Keil也不是没用,在其安装目录里也有STM32F10X的库文件 eg: keil/ARM/ INC/ST/STM32F10x.
嘻嘻 告诉大家一个小秘密。这些问题我能解决,首先是google 出的答案,另一个诀窍呢,是打开IAR提供的example, 两个IAR工程 比较、修改的,一般的example 在如下目录:
IAR/arm/ example / ST/ STM32F10x /
先说出现的第一个问题identitfier"GPIO_Pin_2" is undefined
很好解决,即程序中用到这个宏定义,但不能找到它的定义,只要添加#include "stm32f10x_gpio.h" 这个头文件即可。
需要把用到的头文件都拷贝到 建立的 工作区 目录中,这样才好设置。
第二个问题
“s32”has already been declared in the current scope
即 重复定义 在两个件都定义了 某个变量,选中此变量后
go to definition 可看到它在哪两个文件中被定义,把不用的头文件删掉即可。
第三个问题 link error
error[Li005] no definition for "GPIO_init"
最后 全部文件中查找 GPIO_init,发现其在 stm32f10x_gpio.c中使用了 GPIO_init这个函数,但把它定义的头文件,没有包含在.c文件中,所以连接错误。
在这里 有两点大家一定要注意,1.xxxx.c文件中如果包含了某个函数,一定要include 这个函数所在的头文件。
2.IAR开发环境中,头文件不需要添加,只需要放在工作区workspace文件下即可。只需要添加某些头文件涉及到的.c文件即可
第四个问题
显示:There were warnings while generating flash loader input.See the Debug Log window for details.
先说下工程设置的问题, option
首先要设置 general 里面的device
其次要设置c/c++ compiler里的preprocessor
再次要设置 defined symbols
这里的设置请参照
关于$PROJ_DIR$ 这里就是指你建立的工程所在文件夹
$PROJ_DIR$ \Hfile\就是指你工程文件夹下的Hfile 文件夹。
最后还要设置linker 下面的config
更改了这项,前面那个问题就解决了,其实这个是参照example中的LCD_DEMO工程里面的OPTION设置的。如果没有的话在浏览中把那个文件复制过来就好了。
在此 上传下 LED_DEMO程序
http://share.eepw.com.cn/share/download/id/69533
接下来开始真正进入嵌入式世界钻研
学前小序
浅谈初识-STM固件函数库
也是最近两天才接触STM32固件函数库的,这几天休息,看了些程序源代码及固件库的中文说明,觉得大致有了实质上的理解,虽然细节不太懂。
STM32固件库函数的中文说明下载地址
http://share.eepw.com.cn/share/download/id/68119
在这里说下我的简单理解,希望给大家一定认识上的帮助
我们可以认为STM32系列嵌入式IC是51单片机的复杂化,功能速度上都在单片机上有一定的提升,相应的程序也会变得多而杂,最大的变化可能就是其硬件上可以跑个系统,来管理它的一些基层程序。
在实际应用中,嵌入式系统实现的功能越多,控制的东西越多,STM32上的程序也会变的数量多而且不好记。而ST厂家技术支持还是做得不错的,于是就有了STM32固件函数库,可以让开发者不需要考虑去设置哪个寄存器,而只相应的调用哪个函数即可,也就是说,ST已经把一些声明 ,和一些基层函数,都包装成库函数让你直接来调用,你只需要调用函数并且传递函数的参数 即可,这极大方便了,一些嵌入式系统开发的研发公司。,但也由于开发环境的通用性,程序的大小和执行速度不是最优的,所以一些人也不应用固件库函数。
本人只求简单理解,请大侠们不要拍我
2.2 LCD 显示字符
忙活了三个星期,终于让TFT 的LCD显示出字符了,最后发现还是程序不对,幸亏参考了以下网址中的字库程序,修改了源程序,才得以显示。http://ishare.iask.sina.com.cn/f/23404264.html?retcode=0
先上图,再附议主要的源程序。
此程序只能显示字母、数字,关于汉字显示,还不行。
主要源程序:
void LCD_DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c,uint8_t width)
{
uint32_t index = 0, i = 0;
uint8_t Yaddress ;
Yaddress = Ypos;
LCD_SetCursor(Xpos, Ypos);
for(index = 0; index < 16; index++)
{
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
// for(i = 15; i >0; i--)
for(i = 1; i <width; i++)
{
if((c[index*(width/8)+i/8] & (0x80>>(i%8))) == 0x00)
{
LCD_WriteRAM(BackColor);
}
else
{
LCD_WriteRAM(TextColor);
}
}
Yaddress++;
LCD_SetCursor(Xpos, Yaddress);
}
}
void LCD_DisplayString(uint16_t Xpos, uint16_t Ypos, uint8_t *ptr)
{
uint32_t i = 0;
uint8_t code1;
uint8_t code2;
uint32_t address;
/* Send the string character by character on lCD */
while ((*ptr != 0) & (i < 50))
{
code1 = *ptr; /* ascii代码 或者汉字代码的高字节 */
if (code1 < 0x80)
{ /* Display one character on LCD */
LCD_DrawChar(Xpos, Ypos,&Ascii16[code1 * 16],8);
/* Decrement the column position by 16 */
Xpos += 8; /* 列地址+8 */
}
else
{
code2 = *++ptr;
if (code2 == 0)
{
break; /* Point on the next character */
}
address = ((code1-0xa1) * 94 + (code2-0xa1)) * 32 + HZK16_ADDR;
LCD_DrawChar(Xpos, Ypos, (const uint8_t *)address, 16);
Xpos += 16;
}/* 列地址+16 */
ptr++; /* Increment the character counter */
i++;
}
}
MAIN函数
void main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
| RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG
| RCC_APB2Periph_AFIO , ENABLE);
/*------------------- Resources Initialization -----------------------------*/
/* GPIO Configuration */
GPIO_Config();
/* Initialize the LCD */
STM3210E_LCD_Init();
/*------------------- Drivers Initialization -------------------------------*/
LCD_Clear(Magenta);
LCD_SetTextColor(Blue);
LCD_SetBackColor(Magenta);
while(1)
{LCD_DisplayString(50, 50, "Hello");
LCD_DisplayString(50, 80, "A R M D I Y");
LCD_DisplayString(50, 100, "Happy every day");
}
}
除了这两个程序之外,还需要字符库文件(即Ascii16为首地址的数组),可直接调用上面网址中的fonts.H文件即可,
此程序只适合驱动芯片为SS1289的LCD。
如你需要帮助,请留言
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |