这一步为 USB 配置 RTOS 的资源。
打开 startup_stm32f405xx.s 并进入 Configuration Wizard,把 Stack Size 改成 0x600。
打开 RTX_Conf_CM.c 并进入 Configuration Wizard:
将 RTOS Kernel Timer input clock frequency [Hz] 改为 168000000,
将 Number of concurrent running threads 改为 4,
将 Number of threads with user-provided stack size 改为 3,
将 Total stack size [bytes] for threads with user-provided stack size 改为 1536,
将 Timer Thread stack size [bytes] 改为 512,
其他设置参考下图。
注:在 Run-Time Environment 设置的地方把 USB 对应的链接打开,是 USB Middleware 的文档,可以查看到以上设置的详细说明。
添加主函数并测试
右键点击 Project 栏的 Source Group 1,选择 Add New Item to Group ‘Source Group 1’…。
选择 User Code Template 里面的 ‘main’ module for STM32Cube。
会出现一个 main.c 模板。
这个 main.c 模板是针对 8MHz 晶振的,我们在 SystemClock_Config 函数里把 RCC_OscInitStruct.PLL.PLLM 改成 24,这样就可以用在 24MHz 晶振环境下。
直接编译并下载到板子上。
这中间还需要在 Target 设置的地方配置下载器,就不详述了。
进入 Debug 模式,在 Watch 窗口手动添加一个 SystemCoreClock。
在 main.c 的 SystemClock_Config(); 这一行添加断点,并 Step Over,应该可以看到 SystemCoreClock 从 16M 变化到 168M,这说明时钟配置是正确的。
上面做的这些其实就是在 CMSIS 框架下,利用 MDK Middleware 从头建立 USB 工程的前半部分过程。
如果是一般的 USB 工程,后面步骤是继续利用 User Code Template 添加 USB 线程的文件(就像刚才添加 main.c 一样),就可以直接得到能运行的程序了。
但这次我们会从外部复制 CMSIS-DAP 的代码进来,其中包含 USB 线程部分。
添加 CMSIS-DAP 源码
CMSIS-DAP 源码在 CMSIS 那个 Software Pack 中,一般是放在 Keil 安装目录ARMPackARMCMSIS4.5.0CMSISDAPFirmware。
这里面有 5 个文件夹:Config 、 Examples 、 Include 、 Source 和 Template。
复制 Config 里面的 DAP_config.h 到工程目录下,
复制 TemplateMDK5 里面的 osObjects.h 和 USBD_User_HID_0.c 到工程目录下,前一个可能要覆盖已存在的文件。注意不要复制 main.c,因为我们需要用到刚才的时钟配置函数。
将复制进来的 USBD_User_HID_0.c 和 DAP_config.h 添加到工程中的 Source Group 1 中。
在工程源文件中另外建一个 Group 叫 CMSIS DAP,将源码 Source 文件夹中的 DAP.c 、 JTAG_DP.c 、 SW_DP.c 和 SWO.c 四个文件添加进来。
Target 设置的 C/C++ 选项卡里添加两个 Include Paths:. 和 Keil 安装目录ARMPackARMCMSIS4.5.0CMSISDAPFirmwareInclude。
最后直接在 Keil MDK 里修改 main.c:
增加四个 include:
#include "osObjects.h"#include "rl_usb.h"#include "DAP_config.h"#include "DAP.h"
把 main 函数按如下修改:
int main(void)
{
HAL_Init(); // STM32F4xx HAL Library Initialization
SystemClock_Config(); // Configure the system clock to 168 MHz
DAP_Setup(); // DAP Setup
Delayms(100U); // Wait for 100ms
USBD_Initialize(0U); // USB Device Initialization
USBD_Connect(0U); // USB Device Connectwhile (!USBD_Configured(0U)); // Wait for USB Device to configure// Create HID Thread
HID0_ThreadId = osThreadCreate(osThread(HID0_Thread), NULL);
osThreadSetPriority(osThreadGetId(), osPriorityIdle);
// Infinite loopwhile (1)
{
}
}
CMSIS-DAP 说明文档见 http://www.keil.com/pack/doc/CMSIS/DAP/html/index.html。
修改代码以适配硬件
DAPLink 基本配置
打开 DAP_config.h(需要先把这个文件变成非只读)。
这个文件大体上分成四个部分,中间以大段注释分割: CMSIS-DAP Debug Unit Information 部分定义了调试器的参数, CMSIS-DAP Hardware I/O Pin Access 是 JTAG 和 SWD 接口的引脚操作函数, CMSIS-DAP Hardware Status LEDs 是 LED 引脚操作函数, CMSIS-DAP Initialization 是这些 IO 引脚的初始化函数。
这些代码都与具体的硬件有关,需要根据硬件情况来编写。
CMSIS-DAP Debug Unit Information 部分按如下设置修改: