65.9K
CodeProject 正在变化。 阅读更多。
Home

STM32 Discovery: 基础 - 创建项目

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (5投票s)

2011 年 1 月 24 日

BSD

4分钟阅读

viewsIcon

94476

downloadIcon

1682

使用 Keil 创建一个 32KB 程序空间的工程

引言

在这篇文章中,我将讨论如何使用 Keil IDE 让 stm32 discovery 板工作起来。这是我第一次使用 ARM 处理器,所以我决定使用商业级的 IDE,因为它们通常更容易使用。当我切换到 GCC 时,我也会记录下整个过程。

背景

首先,你需要 STM32 Discovery 板。在 mouser 上查看
此外,你还需要 Keil IDE。你可以在这里下载一个免费的、仅限 32KB 程序空间的版本。

设置项目

首先,你需要创建一个新项目,并在 ST Micro 部分选择处理器。

接着会询问你是否要将 STM32 启动代码复制到项目文件夹。选择“是”。我建议你使用 Keil 的STM32_init文件。我在示例代码中找到了它们。在这里可以找到。下载完文件后,解压缩。将以下文件复制到项目文件所在的文件夹:STM32_Init.c STM32_Init.h STM32_Reg.h。然后将STM32_Init.c添加到你的项目中。右键单击 Source Group 1,然后点击 Add File to Group。你可以随意分组,这不会影响任何构建。

此外,为了保持整洁,我们将创建一个Bin文件夹。所以,我们在项目文件所在的文件夹中创建一个新目录。接下来,右键单击Target文件夹,然后点击 Options for Target。

然后点击 Output,再点击 Select Folder for Objects,然后找到我们创建的bin文件夹。

最后,创建一个文件(我们称之为main.c)并将其添加到项目中。在该文件中,添加一个调用 `Init` 代码的 `main` 函数,并包含 `init` 文件。你可能还需要包含 `STM32` 库文件。

#include <stm32f10x_lib.h>
#include "STM32_Init.h"

int main (void)
{
   stm32_Init();
   return 0;
} 

现在,我们需要为 STM32 Discovery 设置调试环境。首先,我们需要选择我们的调试器。所以,右键单击项目,点击 Options for Target,然后转到 Debug 选项卡。接下来,你不想运行模拟器,所以我们将点击 Use: 单选按钮到右侧。在下拉菜单中,我们将选择 ST-Link Debugger。然后你需要点击 Setting 并选择 SWD。最后,我喜欢勾选 Run to `main()`,这样它会在运行前停在 `main`。

接下来,我们需要定义烧录工具来将你的程序上传到 STM32。所以,转到 Utilities 选项卡,然后选择 "Use Target Driver for Flash programming" 单选按钮。然后,你可以在下拉菜单中选择 ST-Link Debugger。

现在你就可以开始调试了。

编码串口

本节我们将设置 STM32,使其能够回显在串口接收到的数据。第一步是配置 USART。使用配置向导打开STM32_Init.c。当我讲到 GCC 入门时,我会写关于如何在 C 语言中实现这一点。启用你的 USART1 并设置参数。同时启用 RXNE(接收)上的 USAT1 中断,这样我们就不需要轮询数据,并且在字节到达时会收到通知。

一旦一切配置完成,点击保存。现在我们将能够使用名为 USART1 的结构体。以下是一些常用成员的说明。

USART1->SR 包含关于生成的 USART1->DR 中断的信息。这包含了我们接收到的字节,或者如果你给 USART1->DR 赋值,它将发送该值。如果你从 USART1->DR 获取值,它将读取从 USART 接收到的值。

接下来,你需要打开main.c。在这个文件中,我们将为 `void USART1_IRQHandler (void)` 添加函数定义。这个函数被 `STM32F10x.s` 声明并已经映射到一个中断向量。所以我们只需要启用中断(我们已经在配置向导中完成了)并覆盖它。我的函数看起来会像这样:

void USART1_IRQHandler (void)
{
    volatile unsigned int vsr;
    int ByteSent;
    vsr= USART1->SR;
    if (vsr& USART_FLAG_RXNE)                   // did we interrupt on the read
    {
       // clear the interrupt since we are processing it
        USART1->SR &= ~(USART_FLAG_RXNE);  
        ByteSent = (USART1->DR & 0x1FF);
        SendByte(ByteSent);
     }
}

我们当然需要定义 `SendByte`。原型将是 `void SendByte(int byte);` 我的定义看起来会像这样:

void SendByte (int byte) 
{
    //Wait for the uart to finish sending the byte.
     while (!(USART1->SR & USART_FLAG_TXE));
    USART1->DR = (byte & 0xFF);
}

我还在 `main` 返回之前添加了一个无限循环。现在,你只需要将 PA10 连接到 RX,将 PA9 连接到 TX 即可。我使用了 Arduino 上的 FTDI 芯片来实现这一点。我只是将 PA10 连接到 Arduino 的 RX,将 PA9 连接到 TX,然后取出了 AVR。之后,你发送到终端的任何内容都会回显给你。如果你需要一个终端程序,我使用了Termite

关注点

我的代码是 BSD 许可,但我附带了STM32_Init.c文件,它有自己的许可。但STM32_Init.c有自己的使用条款。

历史

  • 2011年1月24日:最后更新

 

© . All rights reserved.