说了这么久的环境,一开始自己摸索的时候觉得配环境很麻烦,而且也装了很多不必要的东西,后来发现其实只要装上述的就够了,非常简单。希望能帮助大家少走点弯路。下面就用一个简单的示例程序来说一下怎么编译、下载、调试。在原来的windows环境中,我是用Keil uVision5进行开发的,也留了一些代码,所以就直接拿了个串口的发送程序作为这一次的示例,代码如下。
/*=====================================
Include headers
=====================================*/
#include "stm32f10x.h"
/*=====================================
Functions definition
=====================================*/
void UART_DefaultConfiguration( void );
/*=====================================
Implementation of functions
=====================================*/
/**
* @brief
* Main program.
* @parameter
* None
* @returnvalue
* None
*/
int main(void)
{
UART_DefaultConfiguration();
while(1)
{
if( USART_GetFlagStatus( USART1, USART_FLAG_TC ) == SET )
{
USART_SendData( USART1, 'A' );
}
}
}
/**
* @brief
* Initialize the UART with the default configuration.
* @parameter
* None
* @returnvalue
* None
*/
void UART_DefaultConfiguration( void )
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
/* Turn on the Clock for the UART and GPIO. */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA
| RCC_APB2Periph_AFIO
| RCC_APB2Periph_USART1, ENABLE );
/* Configure the UART1. */
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; /* TX */
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init( GPIOA, &GPIO_InitStruct );
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; /* RX */
GPIO_Init( GPIOA, &GPIO_InitStruct );
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init( USART1, &USART_InitStruct );
USART_Cmd( USART1, ENABLE );
}
由于我的CPU是STM32F103C8T6,所以Chip family是选STM32f10x Medium Density,Flash大小是64KB,RAM大小是20KB。可以根据自己的硬件实际情况进行填写。其它的可以按图配置。点击下一步:
其实之后两页都可以按下一步,直到最后这一页,一定要选好工具链是GN Tools for ARM Embedded Processors ( arm-none-eabi-gcc ),并且填好工具链位置。最后点击完成。
工程建立后,可以看到Eclipse已经将工程建好在Project Explorer中了。
然后把工程中的src、system、include三个文件夹去掉,只剩下ldscripts文件夹。把我们示例程序的代码复制过来。如下图所示:
然后,在Cross ARM GNU Assembler、Cross ARM C Compiler和Cross ARM C++ Compiler中的Preprocessor中定义两个宏:STM32F10X_MD和USE_STDPERIPH_DRIVER。其它的全部删去,这一个很重要,关系到后面的编译问题。一开始Eclipse会帮你定义好多宏,但都不需要,只留这两个就行了。
然后,还是在Cross ARM GNU Assembler、Cross ARM C Compiler和Cross ARM C++ Compiler中的Includes修改为你包含有头文件的路径。如下图所示。
接下来,是在Cross ARM C++ Linker和General中,把原本工程里的链接脚本路径补全。如下图所示:
好,现在编译可以编译了。
在调试按钮旁边有个下拉箭头,点击箭头后点击Debug Configurations。然后双击Zylin Embedded debug( Native )。这样就会生成一个名称和工程名字相同的调试配置界面。如下图所示。
在界面中点击Debugger标签。找到GDB debugger的文本框,通过浏览定位到上面提到要安装的arm-linux-gdb,然后点击应用。如下图所示。
接着点击Commands标签。在'Initalize' commands里输入对JLink的初始化命令。点击应用。如下图所示。
接下来,在刚才Eclipse的Debug Configurations页面里,点击Debug。开始调试。这样就会跳到Eclipse的调试视图里,并且调试停留在启动文件的第一行汇编指令里。这样就说明调试已经成功了,之后怎么样调试程序就和在eclipse里调试其它pc程序一样。这里就不多说了。
好了,在Linux环境里开发STM32的整个流程就已经介绍完了。写这一篇文章的目的只是为了记录一下过程,方便日后忘了步骤的时候进行查看,也希望能够帮助其他想在linux环境下开发stm32的人少走些弯路。