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

22May/10

STM32 入门教程 基于 MDK 的 SWD 两线串行仿真

Posted by Nick Xu

(1) SWD 仿真模式概念简述
先所说 SWD 和传统的调试方式有什么不一样:

首先给大家介绍下经验之谈:
(一): SWD 模式比 JTAG 在高速模式下面更加可靠. 在大数据量的情况下面 JTAG 下载程序会 失败, 但是 SWD 发生的几率会小很多. 基本使用 JTAG 仿真模式的情况下是可以直接使用 SWD 模式的, 只要你的仿真器支 持. 所以推荐大家使用这个模式.
(二): 在大家 GPIO 刚好缺一个的时候, 可以使用 SWD 仿真, 这种模式支持更少的引脚.
(三): 在大家板子的体积有限的时候推荐使用 SWD 模式, 他需要的引脚少, 当然需要的 PCB 空间就小啦. 比如: 你可以选择一个很小的 2.54 间距的 5 芯端子做仿真接口.

(2) 仿真器对 SWD 模式支持情况
再说说市面上的常用仿真器对 SWD 仿真的支持情况.

(1)  JLINKV6 支持 SWD 仿真模式. 速度较慢.
(2)  JLINKV7 比较好的支持 SWD 仿真模式, 速度有了明显的提高. 速度是 JLINKV6 的 6 倍.
(3)  JLINKV8 非常好的支持 SWD 仿真模式, 速度可以到 10M.
(4)  ULINK1  不支持 SWD 模式
(5)  盗版 ULINK2  非常好的支持 SWD 模式. 速度可以达到 10M.
(6)  正版 ULINK2  非常好的支持 SWD 模式. 速度可以达到 10M.

再所说硬件上的不同:
(1)  JLINKV6 需要的硬件接口为: GND, RST, SWDIO, SWDCLK
(2)  JLINKV7 需要的硬件接口为: GND, RST, SWDIO, SWDCLK
(3)  JLINKV8 需要的硬件接口为: VCC, GND, RST, SWDIO, SWDCLK
(4)  ULINK1  不支持 SWD 模式
(5)  盗版 ULINK2  需要的硬件接口为: GND, RST, SWDIO, SWDCLK
(6)  正版 ULINK2  需要的硬件接口为: GND, RST, SWDIO, SWDCLK
由此可以看到只有 JLINKV8 需要 5 个引脚. 那么给大家介绍下为什么有了 VCC 这个引脚时候有好处, 我的个人理解: 我认为有这个引脚是最合适的, 仿真器对目标板子的仿真需要用到 RST 引脚, 其实使用仿真器内部的 VCC 做这个功能其实并不是非常美妙. 因此 JLINKV8 选择了只和目标板共 GND, 但是不共 VCC. 因此我觉得这种模式最合理, 当然通常情况下仿真器和目标板共 GND 和 VCC 是没有错的.

下面两张演示就是我使用 JLINKV8 进行下载程序到 Mini-STM32 开发板上仿真的图片. 程序代码中使用 了 uCGUI , 一共程序代码 120K 左右. 使用 JLINKV8 下载到芯片中只需要 5 秒左右.

SWD1.jpg

下 载 (61.11 KB)

2009-9-5 20:32

SWD2.jpg

下 载 (62.06 KB)

2009-9-5 20:32

SWD3.jpg

下 载 (49.7 KB)

2009-9-5 20:32

(3) 在 MDK 中SWD 模式设置

接下来告诉大家怎么使用 SWD 设置:

打开工程 Option 设置:

SWD4.jpg

下 载 (54.8 KB)

2009-9-5 21:16

SWD5.jpg

下 载 (64.5 KB)

2009-9-5 21:16

在设置中按照上图设置成 SWD 模式, 速度你可以按照你的实际需求来设置, 如果你的板子供电系统不是特别稳定, 纹波比较大或者仿真线比较长可以设置成 500K 或者 1M , 如果环境很好当然可以选择 10M , 当然速度会飞起来.

记得不要忽略了左下方的那个

USB

还是 TCP 模式, 当然我们是 USB 模式, 因为有的时候默认是 TCP 模式, 这个时候我们忽略这个设置后会仿真常常连接不上的.

注意: 上面这个界面是在仿真器插在电脑上才会出现的界面, 就是说没有实际插入仿真器的话不会出现这个界面的.
当然虽然上面是 JLINKV8, ULINK2 下的设置也是一样的.

22May/10

STM32 入门教程 开发环境建立及其应用

Posted by Nick Xu

入门准备:

我们常用的

STM32

开发编译环境为 Keil 公司的

MDK

(Microcontroller Development Kit) 和 IAR 公司的 EWARM.

在这里我们提供了比较稳定的新版本编译

软件下载

:

MDK3.50        点击此处下载

EWARM 5.40   点击此处下载

限于篇幅, 在我们的

教程

里面将先以 MDK 下的一个例子来介绍如何使用 MDK 进行嵌入式应用开发.

MDK 安装与配置:

基于 MDK 下的开发中基本的过程:

(1) 创建工程;

(2) 配置工程;

(3) 用 C/C++ 或者 汇编语言编写源文件;

(4) 编译目标应用程序

(5) 修改源程序中的错误

(6) 测试

链接

应用程序

----------------------------------------------------------------
(1) 创建一个工程:

在 uVision 3 主界面中选择 "Project" -> "New uVision Project" 菜单项, 打开一个标准对话框选择好你电脑中的保存目录后, 输入一个你的工程名字后点确认.我们的工程中建了一个名字叫 "NewProject" 的工程.

从设备库中选择目标芯片, 我们的 MINI-STM32 开发板使用的是 STM32F103V8T6, 因此选中 STMicrocontroller 下对应的芯片:

ARM 32-bit Cortex-M3 Microcontroller, 72MHz, 64kB Flash, 20kB SRAM,

PLL, Embedded Internal RC 8MHz and 32kHz, Real-Time Clock,

Nested Interrupt Controller, Power Saving Modes, JTAG and SWD,

3 Synch. 16-bit Timers with Input Capture, Output Compare and PWM,

16-bit 6-ch Advanced Timer, 2 16-bit Watchdog Timers, SysTick Timer,

2 SPI, 2 I2C, 3 USART,

USB

2.0 Full Speed Interface,

CAN

2.0B Active,

2 12-bit 16-ch A/D Converter, Fast I/O Ports

1.GIF

下载 (15.73 KB)

2009-7-28 21:44

2.GIF

下载 (20.45 KB)

2009-7-28 23:12

选择完芯片型号后会提示是否在目标工程中加入 CPU  的相关的启动

代码

, 如下图所示. 启动代码是用来初始化目标设备的配置, 完成运行的系统初始化工作, 因此我们选择 "是" , 这会使系统的启动代码编写工作量大大减少.

3.GIF

下载 (6.49 KB)

2009-7-28 21:35

----------------------------------------------------------------
(2) 配置工程:

选择菜单中 "Project" -> "Option for Target" 或者 选择快捷菜单中的图标:

4.GIF

下载 (7.83 KB)

2009-7-28 21:52

因为 MINI-STM32 开发板上使用的就是 8M 的晶振且是使用的片内的 RAM 和 ROM 因此 "taget" 下我们都可以使用默认的配置;

在"Output"菜单下我们需要选中 "Creat Hex File" 来生成编译好的工程代码, 此工程可以通过

仿真器

或者串口 ISP 烧录进开发板中.

注: ISP 烧录过程我们将在入门教程二中给大家介绍.

"Listing" "User" 菜单中我们保持默认即可.

"C/C++" 菜单为我们常用的菜单, 这里简单的介绍下他们的具体功能:

PreProcesser Symbols 中的 Define, Undefine  菜单表示是工程的宏定义中的变量, 我们将在今后的教程中详细介绍这个功能.

Optimization 为优化选项, Level0 为不优化, 这种模式最适合调试, 因为不会优化掉代码, 基本每个用到的变量都可以打断点. Level3 为优化等级最高, 最适合生产过程中下载到芯片中的代码.

Include Path 为工程中的包含路径, 一般需将 .h 文件或者库文件的

地址

配置进去.

6.GIF

下载 (15.43 KB)

2009-7-28 22:23

"Asm" 和 "Link" 将在今后的高级教程中介绍.

"Debug" 为我们调试使用的配置选项, "Use Simulator" 为使用软件仿真.  这里根据大家手里的仿真器来选择配置环境.

如果你使用的是 Ulink, 那么就选择 "Ulink Cotex Debug", 如果你选择的是 JLINK, 那么就选择 " Cotex M3

Jlink

", 如果你使用的是 ST 公司出的简易仿真器 ST-Link , 那么你就选择 "ST-Link Debug".

注意: 右边当中的选项 "Run to main{}" 选项如果勾上就表示仿真时进入了就会进入到 main 函数, 如果没有选上就会进入初始地址, 你需要自己打断点运行到你的主程序 main 处.

7.GIF

下载 (16.47 KB)

2009-7-28 22:35

当插上仿真器后选择上面右图中的 Setting 后会跳出一个仿真器的配置菜单. 左边会

自动

识别出你的仿真器的信息.

如下图为 ULINK2 的信息:

8.GIF

下载 (16.64 KB)

2009-7-28 22:40

对于 SWJ 选项为三线制调试, 将在后面的高级教程中介绍.

右下方有两个选项:

"Verify Code Download" : 表示下载后校验数据

"Download to

flash

": 表示当仿真的时候先将目标代码下载到 Flash 中.

Trace 菜单为跟踪配置, 可以实时的将一些变量使用曲线的形式实时表示出来, 我们将在今后的高级教程中介绍这一项功能.

注意: 市面上目前的盗版 Ulink2 不支持这项功能, 正版的支持, Jlink 也不支持这项功能.

"Flash Download" 菜单用来配置使用仿真器程序下载的配置选项,  大家务必选择好和你芯片配套的选项. 如果你是使用的别人模板下修改为你的工程, 这个选项请注意一下, 如果不正确将不能将你的代码下载到芯片中.

配置好 "Debug" 后, 那么 "Utilities" 可以不用配置.

如果你使用的是仿真器仿真, 在你已经正确得将目标板和仿真器建立了物理连接后, 请选择正确的仿真器进行配置.

Tagged as: , No Comments
22May/10

MDK 下使用 Serial Windows 调试串口教程

Posted by Nick Xu

第一步: 确定目标
1: 有的时候我们会有这样的想法: 我们学习 STM32 的时候难道一定需要有硬件开发板才 能调试和学习程序么?
这里告诉大家一个好消息, 学习 STM32 可以完整的在软件上仿 真, 那就是强大的 RealView MDK.
在这个教程中我们教大家怎么使用串口模拟窗口来 调试我们的程序.

2: 目标确定:
调试发送程序: 输出字符串到 Serial Windows
调试接收程序: 敲击键盘上的按键, 窗口接收到数据后通过串口输出到 Serial Windows

第二步: 创建一个工程
你可以下载我给大 家调试好的工程代码.

STM32_USART_Pol.rar (220.95 KB)

下载次数: 127

2009-8-19 19:53

打开工程, 我们可以看到我们的工程包括4个文件:

STM3210x.S    启动代码

STM32_Init.C  初始化代码

Retarget.C      接口函数

Usart.C           主函数

下面给大家介绍下我们的代码:

printf 函数:  将字符串通过串口输出

getchar 函数:  串口接收一个字符

和这两个函数有关的函数移植就是下面三个函数

int fputc(int ch, FILE *f) {

return (SendChar(ch));

}

int fgetc(FILE *f) {

return (SendChar(GetKey()));

}

void _ttywrch(int ch) {

SendChar (ch);

}

最后移植两个底层函数

int SendChar (int ch)  {

while (!(USART1->SR & USART_FLAG_TXE));

USART1->DR = (ch & 0x1FF);

return (ch);

}

int GetKey (void)  {

while (!(USART1->SR & USART_FLAG_RXNE));

return ((int)(USART1->DR & 0x1FF));

}

这几个函数移植好之后我们就可以做我们的调试试验了.

第三步: MDK 仿真调试

编译完成, 进入软件仿真调试.

打开 View -> Serial Window -> USART #1 对话框

全速运行程序, 按下键盘上的按键后我们会看到下面的界面.

1.jpg

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