一,准备EWARM+JLINK+STM32软件包
1,在http://www.mcu123.com/down/view.asp?id=83
下载IAR Embedded Workbench for ARM v5.20版本
EWARM-EV-WEB-520.rar
http://esoft.mcu123.com/MCU123_temp_0080309@/arm/EWARM-EV-WEB-520.rar
(注册机自行查找,安装过程略)
2,在http://www.segger.com/download_jlink.html
下载Software and documentation pack V4.04a软件
Setup_JLinkARM_V404a.zip
http://www.segger.com/pub/jlink/Setup_JLinkARM_V404a.zip
(JLINK自行购买,安装过程略)
3,在http://www.st.com/mcu/devicedocs-STM32F103T8-110.html
下载ARM-based 32-bit MCU STM32F10xxx standard peripheral library
stm32f10x_stdperiph_lib_v3.0.0.zip
http://www.st.com/stonline/products/support/micro/files/stm32f10x_stdper...
二,建立STM32 LCCD工程
1,解压stm32f10x_stdperiph_lib_v3.0.0.zip软件包,把其中的“Libraries”和“Project”文件夹复制到“D:\works\lccd-1.0.0\”,
在“D:\works\lccd-1.0.0\”下建立“Drivers”、“Linker”、“Include”和“Source”空文件夹,在“D:\works\lccd-1.0.0\Project”
下建立“Stm32f103”空文件夹,把“Project\Template”下的C文件复制到“Source”和H文件复制到“Include”,把“Project\Template\
EWARMv5”下的所有ICF文件复制到“Linker”;
2,在EWARM菜单中“Project”->“Create New Project”打开“Create New Project”窗口,点击“OK”打开“另存为”窗口,
选择项目工程存储路径“D:\works\lccd-1.0.0\Project\Stm32f103\”填写项目文件名“lccd.ewp",在菜单中“File”->“Save All”
打开“Save Workspace As”窗口,填写工作环境文件名“lccd.eww”;
3,在EWARM的左面“Workspace”窗口下面的“Files”空白部分右击鼠标,选择“Add”->“Add Group”出现““Add Group - lccd”窗口,
在“Group name”中填上“CMSIS”,同样方法建立“USER”“BOOT”“DRV”“INC”“LIB”等文件组后点击“Save All”快捷键;
4,在EWARM的左面“Workspace”窗口下面的“CMSIS”上右击鼠标,选择“Add”->“Add Files”出现““Add Files - CMSIS”窗口,选择
打开“D:\works\lccd-1.0.0\Libraries\CMSIS\Core\CM3”文件夹下的“core_cm3.c”和“system_stm32f10x.c”文件;
5,在EWARM的左面“Workspace”窗口下面的“BOOT”上右击鼠标,选择“Add”->“Add Files”出现““Add Files - BOOT”窗口,选择
打开“D:\works\lccd-1.0.0\Libraries\CMSIS\Core\CM3\startup\iar”文件夹下的“startup_stm32f10x_md.s”文件;
6,在EWARM的左面“Workspace”窗口下面的“LIB”上右击鼠标,选择“Add”->“Add Files”出现““Add Files - LIB”窗口,选择
打开“D:\works\lccd-1.0.0\Libraries\STM32F10x_StdPeriph_Driver\src”文件夹下的“stm32f10x_gpio.c”等所有C文件;
7,在EWARM的左面“Workspace”窗口下面的“INC”上右击鼠标,选择“Add”->“Add Files”出现““Add Files - INC”窗口,选择
打开“D:\works\lccd-1.0.0\Include”文件夹下的所有H文件;
8,在EWARM的左面“Workspace”窗口下面的“USER”上右击鼠标,选择“Add”->“Add Files”出现““Add Files - USER ”窗口,选择
打开“D:\works\lccd-1.0.0\Source”文件夹下的所有C文件,点击“Save All”快捷键;
三,配置STM32 LCCD工程
在EWARM的左面“Workspace”窗口下面的“Files”的“lccd - Debug”左击鼠标,选择“Project”->“Options”出现“Options for node "lccd"”窗口;
1,在左面“Category:”中选择上“General Options”,在“Target”->“Processor Variant”->“Device”中选择“ST STM32F10xx8”,
在“Library Configuration”->“Library”中选择“FULL”;
2,在左面“Category:”中选择上“C/C++ Complier”,在“Preprocessor”->“Additional include directories:”中填上下面几行:
$PROJ_DIR$\..\..\Include
$PROJ_DIR$\..\..\Libraries\CMSIS\Core\CM3
$PROJ_DIR$\..\..\Libraries\STM32F10x_StdPeriph_Driver\inc
在“Preprocessor”->“Define symbols:”中填上下面几行:
USE_STDPERIPH_DRIVER
STM32F10X_MD
USE_STM3210B_EVAL(我暂时不用)
3,在左面“Category:”中选择上“Output Converter”,在“Output”中勾选“Generate addition output”并在“Output format:”中选择“binary”,
在“Output”->“Output file”中勾选“override default”并填写上目标码文件名:lccd-debug-1.0.0.bin;
4,在左面“Category:”中选择上“Linker”,在“Config”->“Linker configuration file”中勾选“override default”,在下面填上:
“$PROJ_DIR$\..\..\Linker\stm32f10x_flash.icf”,在“List”中勾选“Generate linker map file”;
5,在左面“Category:”中选择上“Debugger”,在“Setup”->“Driver”中选择“J-link/J-trace”,在“Download”勾选择“Use flash loader”;
6,在左面“Category:”中选择上“J-link/J-trace”,在“Setup”->“JTAG/SWD speed”中选择“Fixed”并填上“4000”,在“Connection”->“Interface”
中选择“SWD”,点击“Save All”快捷键;
7,在EWARM的左面“Workspace”窗口下选择“Release”,然后可以对“lccd - Release”左击鼠标,选择“Project”->“Options”出现“Options for
node "lccd"”窗口,做类似上面“lccd - Debug”的配置,注意不选择调试信息及目标友文件名为lccd-release-1.0.0.bin;
四,调试STM32 LCCD工程
1,在EWARM菜单中“Project”->“Make”打开编译工程命令;
2,在EWARM菜单中“Project”->“Download and Debug”打开下载调试命令;
3,在EWARM菜单中“Debug”->“Go”打开全速运行命令;
4,其它调试命令请自行尝试;
五,修改STM32 LCCD工程
1,移植USART的PRINTF应用
A,把D:\works\lccd-1.0.0\Include\stm32f10x_conf.h的第46行的注释打开;
B,把D:\works\lccd-1.0.0\Project\Examples\USART\Printf\platform_config.h 复制到D:\works\lccd-1.0.0\Include\目录;
C,把D:\works\lccd-1.0.0\Project\Examples\USART\Printf\main.c 复制到D:\works\lccd-1.0.0\Source;
D,编译调试即可以在UART1看到115200 8N1的字符“USART Printf Example: retarget the C library printf function to the USART”
2,整理USART的PRINTF应用
A,选择Workspace”窗口下的“DRV”用“Project”->“Add Files”把“D:\works\lccd-1.0.0\Drivers\uart.c”添加到工程;
D:\works\lccd-1.0.0\Drivers\uart.c的源码如下:
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stdio.h"
#include "platform_config.h"
/** @addtogroup StdPeriph_Examples
* @{
*/
/** @addtogroup USART_Printf
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void UART_Configuration(void);
/* Private functions ---------------------------------------------------------*/
/**
* @brief Configures the different GPIO ports.
* @param None
* @retval : None
*/
void UART_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
#if defined USE_USART2 && defined USE_STM3210B_EVAL
/* Enable AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
/* Enable the USART2 Pins Software Remapping */
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
#endif
/* Configure USARTx_Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOx, &GPIO_InitStructure);
/* Configure USARTx_Rx as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOx, &GPIO_InitStructure);
/* USARTx configuration ------------------------------------------------------*/
/* 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;
/* Configure the USARTx */
USART_Init(USARTx, &USART_InitStructure);
/* Enable the USARTx */
USART_Cmd(USARTx, ENABLE);
}
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval : None
*/
int fputc(int ch, FILE *f)
{
/* Write a character to the USART */
USART_SendData(USARTx, (uint8_t) ch);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)
{
}
return ch;
}
/*******************************************************************************
* Function Name : fgetc
* Description : Get a key from the HyperTerminal
* Input : None
* Output : None
* Return : The Key Pressed
*******************************************************************************/
int fgetc(FILE *f)
{
/* Waiting for user input */
while ( USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);
return (uint8_t)USARTx->DR;
}
B,修改D:\works\lccd-1.0.0\Source\main.c的int main(void)如下:
int main(void)
{
/* System Clocks Configuration */
RCC_Configuration();
/* Configure the GPIO ports */
UART_Configuration();
/* Output a message on Hyperterminal using printf function */
printf("\n\r\n\r\n\r\n\r");
printf("*** LCCD V1.0 Build by yuanxihua@21cn.com on ("__DATE__ " - " __TIME__ ")\n\r");
printf("*** LCCD V1.0 Rebooting ...\n\r");
while (1)
{
}
}
并在文件前添加:
extern void UART_Configuration(void);
六,移植STM32 LCCD工程
1,移植GPIO的IOToggle应用
A,选择Workspace”窗口下的“DRV”用“Project”->“Add Files”把“D:\works\lccd-1.0.0\Drivers\gpio.c”添加到工程;
D:\works\lccd-1.0.0\Drivers\gpio.c的源码如下:
(参考GPIO/IOToggle/main.c)
B,修改D:\works\lccd-1.0.0\Source\main.c的int main(void) 的while (1)前加上:
/* Configure the GPIO ports */
GPIO_Configuration();
while (1)里面加上:
{
printf("*** LCCD V1.0 running %d \n\r",i++);
GPIO_Test();
}
并在文件前添加:
extern void GPIO_Configuration(void);
extern void GPIO_Test(void);
2,移植SYSTICK的应用
A,在D:\works\lccd-1.0.0\Source\main.c的int main(void)添加:
/* Setup SysTick Timer for 1 msec interrupts */
if (SysTick_Config(SystemFrequency / 1000))
{
/* Capture error */
while (1);
}
B,在D:\works\lccd-1.0.0\Source\stm32f10x_it.c 的 void SysTick_Handler(void) 加上:
TimingDelay_Decrement(); 文件前加上:
extern void TimingDelay_Decrement(void);
C,选择Workspace”窗口下的“DRV”用“Project”->“Add Files”把“D:\works\lccd-1.0.0\Drivers\time.c”添加到工程;
D:\works\lccd-1.0.0\Drivers\time.c的源码如下:
(参考SysTick/main.c)
3,移植DMA的ADC1的应用
A,修改D:\works\lccd-1.0.0\Source\main.c的int main(void) 的while (1)前加上:
/* ADC1 Configuration */
ADC_Configuration();
while (1)里面加上:
printf("*** LCCD V1.0 running %d adc =%d mv \n\r",i++,(unsigned int)ADC_read());
并在文件前添加:
extern void ADC_Configuration(void);
extern unsigned int ADC_read(void);
B,在D:\works\lccd-1.0.0\Source\stm32f10x_it.c 的 void SysTick_Handler(void) 加上:
ADC_filter();
文件前加上:
extern unsigned int ADC_filter(void);
C,在D:\works\lccd-1.0.0\Include\stm32f10x_conf.h 中,打开注释:
#include "stm32f10x_adc.h"
#include "stm32f10x_dma.h"
D,选择Workspace”窗口下的“DRV”用“Project”->“Add Files”把“D:\works\lccd-1.0.0\Drivers\adc.c”添加到工程;
D:\works\lccd-1.0.0\Drivers\adc.c的源码如下:
(参考ADC/ADC1_DMA/main.c)
4,移植TIM的PWM应用
A,修改D:\works\lccd-1.0.0\Source\main.c的int main(void) 的while (1)前加上:
/* TIM1 Configuration */
TIM2_Configuration();
/* TIM1 Configuration */
TIM2_Configuration();
并在文件前添加:
extern void TIM1_Configuration(void);
extern void TIM2_Configuration(void);
B,选择Workspace”窗口下的“DRV”用“Project”->“Add Files”把“D:\works\lccd-1.0.0\Drivers\tim.c”添加到工程;
D:\works\lccd-1.0.0\Drivers\tim.c的源码如下:
(参考TIM/PWM_Output/main.c)
5,移植EXTI的外部中断应用
A,修改D:\works\lccd-1.0.0\Source\main.c的int main(void) 的while (1)前加上:
/* EXTI Configuration */
EXTI_Configuration();
并在文件前添加:
extern void EXTI_Configuration(void);
B,在D:\works\lccd-1.0.0\Source\stm32f10x_it.c 的 void SysTick_Handler(void) 后面加上:
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
EXTI_PA0_IRQHandler();
/* Clear the EXTI_Line9 pending bit */
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
在文件前加上:
extern void EXTI_PA0_IRQHandler(void);
C, 在D:\works\lccd-1.0.0\Include\stm32f10x_it.h 的 void SysTick_Handler(void) 后面加上
void EXTI0_IRQHandler(void);
D,在D:\works\lccd-1.0.0\Include\stm32f10x_conf.h 中,打开注释:
#include "stm32f10x_exti.h"
#include "misc.h"
E,选择Workspace”窗口下的“DRV”用“Project”->“Add Files”把“D:\works\lccd-1.0.0\Drivers\exti.c”添加到工程;
D:\works\lccd-1.0.0\Drivers\exti.c的源码如下:
(NVIC/Priority/main.c)
9G-STM32 EWARM开发过程简介之三--移植UCOS-II 2.86 操作系统
一,准备UCOSII+JLINK+STM32开发板
1,在http://www.mcu123.com/上联系购买支持SWD的JLINK
JLINK ARM仿真器全功能版
http://www.mcu123.com/www/prodshow.asp?ProdId=NO060
一定要购买全功能支持SWD调试的版本。
2,在http://www.manley.com.cn/web/product_1.asp?lei_big=仿真学习套件&lei_small=STM3210系列&lan=4上联系购买
EK-STM3210E系列仿真学习套件
http://www.manley.com.cn/web/product_neirong_01.asp?pro=280
把开发板上的左下角的CN8旁边的R37,R38焊掉,去掉板上ST-LINK对外加JLINK的SWD接口的干扰。
3,在http://www.micrium.com/st/STM32.html上注册下载UCOSII
uCOSII-ST-STM32F103ZE-SK.exe
http://www.micrium.com/secure/uCOSII-ST-STM32F103ZE-SK.exe
解压后得到“Software”文件包
二,建立EK-STM3210E-UCOSII工程
1,依照以下网页在D:\works\EK-STM3210E-UCOSII\建立EWARM的开发工程
EK-STM3210E-UCOSII及项目名称stm32_ucos
http://blog.163.com/yuan_xihua/blog/static/30740544200932931856676/
2,在D:\works\EK-STM3210E-UCOSII\Ucsoftware\下建立以下文件夹目录
“uCOS-II\Ports”“uCOS-II\Source”“uC-CPU”“uC-LIB”“uC-BSP”
3,在IDE工程中建立“UCSW”文件组,并在此文件夹中再建立
“UCOS-II->Ports”“UCOS-II->Source”“UCOS-CPU”“UCOS-LIB”“UCOS-BSp”
4,在左面“Category:”中选择上“C/C++ Complier”,在“Preprocessor”->“Additional include directories:”中添加以下预处理头文件路径
$PROJ_DIR$\..\..\Ucsoftware\uCOS-II\Ports
$PROJ_DIR$\..\..\Ucsoftware\uCOS-II\Source
$PROJ_DIR$\..\..\Ucsoftware\uC-CPU
$PROJ_DIR$\..\..\Ucsoftware\uC-LIB
$PROJ_DIR$\..\..\Ucsoftware\uC-BSP
5,复制源文件
A,复制Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD\app.c到
D:\works\EK-STM3210E-UCOSII\Source\app.c
把主函数改为:int os_main (void)
在文件前添加:
#include "stm32f10x.h"
#include "stdio.h"
#include "platform_config.h"
在D:\works\EK-STM3210E-UCOSII\Source\main.c中有while(1)前加上:
/* System Clocks Configuration */
RCC_Configuration();
/* Configure the GPIO ports */
GPIO_Configuration();
/* Configure the UART ports */
UART_Configuration();
/* Setup SysTick Timer for 1 msec interrupts */
if (SysTick_Config(SystemFrequency / 1000))
{
/* Capture error */
while (1);
}
/* ADC1 Configuration */
ADC_Configuration();
/* Output a message on Hyperterminal using printf function */
printf("\n\r\n\r\n\r\n\r");
printf("*** STM32_UCOS2 V2.86 Build by yuanxihua@21cn.com on ("__DATE__ " - " __TIME__ ")\n\r");
printf("*** STM32_UCOS2 V2.86 Rebooting ...\n\r");
os_main();
并在文件头前加上:
extern int os_main (void);
B,复制Software\EvalBoards\ST\STM32F103ZE-SK\IAR\BSP下的源文件到
D:\works\EK-STM3210E-UCOSII\Ucsoftware\uC-BSP
复制Software\uC-CPU\ARM-Cortex-M3\IAR 下的源文件到
D:\works\EK-STM3210E-UCOSII\Ucsoftware\uC-CPU
复制\Software\uC-LIB\文件夹到
D:\works\EK-STM3210E-UCOSII\Ucsoftware\uC-LIB\
复制Software\uCOS-II\Ports\arm-cortex-m3\Generic\IAR\下的源文件到
D:\works\EK-STM3210E-UCOSII\Ucsoftware\uCOS-II\Ports
复制Software\uCOS-II\Source\下的源文件到
D:\works\EK-STM3210E-UCOSII\Ucsoftware\uCOS-II\Source\
6,复制头文件
A,复制Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD\app_cfg.h到
D:\works\EK-STM3210E-UCOSII\Include\app_cfg.h
去掉文件中下面几行:
//#define APP_CFG_PROBE_OS_PLUGIN_EN DEF_ENABLED /* DEF_ENABLED = Present, DEF_DISABLED = Not Present */
//#define APP_CFG_PROBE_COM_EN DEF_ENABLED
//#define APP_CFG_LCD_EN DEF_ENABLED
//#define APP_CFG_KSD_EN DEF_ENABLED
B,复制Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD\os_cfg.h 到
D:\works\EK-STM3210E-UCOSII\Include\os_cfg.h
复制Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD\includes.h到
D:\works\EK-STM3210E-UCOSII\Include\includes.h
复制Software\uC-CPU\cpu_def.h到
D:\works\EK-STM3210E-UCOSII\Include\cpu_def.h
7,去掉编译中出现的找不到stm32f10x_lib.h头文件错误
注释掉所有引用到stm32f10x_lib.h的源文件的这行://#include
在D:\works\EK-STM3210E-UCOSII\Ucsoftware\uC-BSP\bsp.c中注释掉:
// FLASH_SetLatency(FLASH_Latency_2);
// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
和
// FLASH_SetLatency(FLASH_Latency_2); /* Embedded Flash Configuration */
// FLASH_HalfCycleAccessCmd(FLASH_HalfCycleAccess_Disable);
// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
8,修改中断向量
把D:\works\EK-STM3210E-UCOSII\Libraries\CMSIS\Core\CM3\startup\iar\startup_stm32f10x_md.s
中的:
PendSV_Handler 改为:OS_CPU_PendSVHandler
SysTick_Handler 改为:OS_CPU_SysTickHandler
并在文件前添加:
EXTERN OS_CPU_PendSVHandler
EXTERN OS_CPU_SysTickHandler
三,移植修改EK-STM3210E-UCOSII工程
1,在D:\works\EK-STM3210E-UCOSII\Ucsoftware\uC-BSP\bsp.c中
修改键盘宏定义,键盘初始化及键盘状态读取,使之与EK-STM3210E板硬件相一致;
2,在D:\works\EK-STM3210E-UCOSII\Source\app.c中
修改接收到按键信息做相应的处理;
四,编译调试EK-STM3210E-UCOSII工程
按常规编译下载调试即可。
==============================================================================
以上内容来源于网友:缥缈九哥 他的联系方式为:QQ,14131338 E-mail:yuanxihua@21cn.com
最新评论
25 周 5 天之前
25 周 5 天之前
39 周 2 天之前
39 周 3 天之前
1 年 1 天之前
1 年 1 天之前
1 年 2 天之前
1 年 6 周之前
1 年 6 周之前
1 年 7 周之前
新的论坛主题
在线用户
在线用户
新进用户