在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32自制CMSIS-DAP下載器

strongerHuang ? 來源:strongerHuang ? 2023-12-19 09:12 ? 次閱讀

市面上針對Cortex-M處理器下載器,有很多是基于CMSIS-DAP演變而來,比如:e-Link、GD-Link等。

之前給大家分享過自制ST-Link的教程,今天繼續(xù)為大家分享一篇:基于STM32F103C8,自制CMSIS-DAP下載器。

關(guān)于CMSIS-DAP

CMSIS-DAP是支持訪問

CMSIS-DAP固件作為源代碼提供,并且可以完全配置為新的調(diào)試單元。

這里相關(guān)的更多內(nèi)容,可以參看我之前分享過的一篇文章:Cortex-M軟件接口標(biāo)準(zhǔn)CMSIS那些重要內(nèi)容

CMSIS-DAP固件

CMSIS-DAP固件Arm以源碼形式提供,不存在版權(quán)問題(因?yàn)獒槍rm Cortex處理器,他們還希望更多人使用)。

1.固件版本

目前有兩個版本:

版本1配置使用USB HID作為與主機(jī)PC的接口。

版本2配置使用WinUSB作為與主機(jī)PC的接口,并提供高速SWO跟蹤流。

2.源碼位置

目前源碼提供在Keil MDK V5版本,安裝好Keil MDK,你在安裝目錄下就能找到源碼。

C:Keil_v5ARMPacksARMCMSIS5.7.0CMSISDAPFirmware

(目前MDK V5.33,CMSIS版本為5.7.0)

3.源碼描述

從文件目錄可以看出,官方源碼提供了一些模板和例子。

目前只提供了LPC處理器的例子,如果你有這個處理器對應(yīng)的板卡,可以直接使用該源碼做一個下載調(diào)試器。(下面就針對于LPC這個例子進(jìn)行“改裝”)

配置

利用STM32CubeMX圖形化配置工具,幫助用戶選擇單片機(jī)引腳的功能,并自動生成外設(shè)初始化代碼。配置了USB、SPI1和USART1,并選擇了USB的Custom HID middleware模式。GPIOB10到GPIO15被配置為JTAG調(diào)試需要的引腳。GPIOC13用于驅(qū)動單片機(jī)上的LED燈。

ST公司也開發(fā)了他們自己的JTAG調(diào)試器——STLink。當(dāng)然它并不是必要的,你也可以使用J-Link或者其他種類的調(diào)試器。STLink的驅(qū)動和程序可以在ST官網(wǎng)上下載。在網(wǎng)站里還有一個基于Eclipse開發(fā)環(huán)境開發(fā)的IDE,STM32CubeMX也被包含其中。我選擇的IDE是基于CodeBlocks的Embitz,IDE中的arm_none_eabi_gcc版本是5.4.1。在我完成我的CMSIS-DAP之前,我必須使用STLink來調(diào)試我的代碼?,F(xiàn)在我在使用新做出來的CMSIS-DAP結(jié)合OpenOCD進(jìn)行日常的開發(fā)。

從CMSIS-DAP的源碼開始

源碼可以在官網(wǎng)下載

也可以直接在Keil MDK安裝目錄下獲取:

C:Keil_v5ARMPacksARMCMSIS5.7.0CMSISDAP

將從示例V1的頭文件 DAP_config.h 開始分析。

選擇LPC-Link-II V1作為我的參考是因?yàn)樗峭ㄟ^USB HID實(shí)現(xiàn)的(V2是通過WinUSB實(shí)現(xiàn))。我分析的第一個文件是DAP_Config.h。第一個關(guān)鍵位置如下:

#ifdef _RTE_
#include "RTE_Components.h"
#include CMSIS_device_header
#else
#include "device.h"  
#endif

不用RTE的相關(guān)文件,創(chuàng)建我自己的device.h。 我將參數(shù)CPU_CLOCK重定義為72000000(72MHz)。根據(jù)文件里的注釋,參數(shù)DAP_PACKET_SIZE必須重新定義為64U。我把SWO_UART改為0,這讓我的工作輕松不少。參數(shù)TIMESTAMP_CLOCK也要重定義為72000000。LPC-Link-II使用Cortex-M3 的 DWT模塊實(shí)現(xiàn)時間戳(TIMESTAMP),這也是為什么我想在CubeMX中嘗試配置STM32F103的DWT。最后我自己寫了一小段代碼來實(shí)現(xiàn)這個功能(在device.c中):

	
		CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; /** * On Cortex-M7 core there is a LAR register in DWT domain. * Any time we need to setup DWT registers, we MUST write * 0xC5ACCE55 into LAR first. LAR means Lock Access Register. */ DWT->CYCCNT = 0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
		我定義的引腳和NXP LPCxx的完全不同。我為STM32F103重寫了所有的引腳的操作代碼。在DAP_Config.h這個文件中還有一些奇怪的地方,比如:

	// SWCLK/TCK I/O pin ------------------------------------- /** SWCLK/TCK I/O pin: Get Input. eturn Current status of the SWCLK/TCK DAP hardware I/O pin. */ __STATIC_FORCEINLINE uint32_t PIN_SWCLK_TCK_IN (void) { return ((LPC_GPIO_PORT->PIN[PIN_SWCLK_TCK_PORT]>> PIN_SWCLK_TCK_BIT) & 1U); }

我不明白為什么DAP的代碼里需要讀取SWCLK/TCK引腳的電平,這個引腳明明是被配置為推挽輸出來產(chǎn)生時鐘信號輸送給JTAG從機(jī)的。從上面列出來的代碼可以看出,它是希望返回當(dāng)前引腳的電平值,我的實(shí)現(xiàn)方式稍微有點(diǎn)不同:

	
		__STATIC_FORCEINLINE uint32_t PIN_SWCLK_TCK_IN (void) { return (uint32_t)(JTAG_TCK_GPIO_Port->ODR & JTAG_TCK_Pin ? 1:0); }
我返回的是當(dāng)前引腳的輸出值。我不確定這是否正確。在整個代碼中,這句話只被DAP.c中的一個叫DAP_SWJ_Pins的函數(shù)調(diào)用了兩次。我猜測DAP_SWJ_Pins這個函數(shù)是用來測試IO口是否工作正常的。 另一個奇怪的地方是PIN_nRESET_OUT

	/** nRESET I/O pin: Set Output. param bit target device hardware reset pin status: - 0: issue a device hardware reset. - 1: release device hardware reset. */ __STATIC_FORCEINLINE void PIN_nRESET_OUT (uint32_t bit) { if (bit) { LPC_GPIO_PORT->DIR[PIN_nRESET_PORT] &= ~(1U <<PIN_nRESET_BIT); LPC_GPIO_PORT->CLR[PIN_nRESET_OE_PORT] = (1U <<PIN_nRESET_OE_BIT); } else { LPC_GPIO_PORT->SET[PIN_nRESET_OE_PORT] = (1U <<PIN_nRESET_OE_BIT); LPC_GPIO_PORT->DIR[PIN_nRESET_PORT] |= (1U <<PIN_nRESET_BIT); } }
		為猜測release的意思可能是將nRESET引腳重新配置為一個失能的引腳。我的代碼如下:

	
		__STATIC_FORCEINLINE void PIN_nRESET_OUT (uint32_t bit) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if ((bit & 1U) == 1) { JTAG_nRESET_GPIO_Port->BSRR = JTAG_nRESET_Pin; GPIO_InitStruct.Pin = JTAG_nRESET_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(JTAG_nRESET_GPIO_Port, &GPIO_InitStruct); } else { JTAG_nRESET_GPIO_Port->BRR = JTAG_nRESET_Pin; GPIO_InitStruct.Pin = JTAG_nRESET_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(JTAG_nRESET_GPIO_Port, &GPIO_InitStruct); } }
給你一個特殊的提示
  • 你可能在一些地方看見我寫了if(...)之類的代碼,像下面這樣:
  
if ((bit & 1U) == 1) { ... } else { ... }
我使用參數(shù)bit的最低位是因?yàn)橛袝r候這個bit既不是0也不是1,它可能是2或者其他奇怪的值,所以不要把你的代碼寫成這樣:
  
if (bit) { ... } else { ... }
這會出問題的!
  • osObjects.h

	#ifndef __osObjects_h__ #define __osObjects_h__ #include "cmsis_os2.h" #ifdef osObjectsExternal extern osThreadId_t DAP_ThreadId; #else extern osThreadId_t DAP_ThreadId; osThreadId_t DAP_ThreadId; #endif extern void DAP_Thread (void *argument); extern void app_main (void *argument); #endif /* __osObjects_h__ */
		這是一個很簡單的頭文件。但它引用了另一個叫做cmsis_os2.h的頭文件,這是CMSIS庫的一部分,但我沒有沒有從CMSIS庫中復(fù)制到我的工程中,因?yàn)椴⒉皇瞧渲兴械膬?nèi)容我都需要。我選擇寫一個“假”的cmsis_os2.h頭文件而不是直接使用原有的頭文件。這里還有另一個叫做DAP.h的頭文件,它屬于DAP的核心模塊,在這里面引用了cmsis_compiler.h文件,這也是CMSIS庫的一部分。毫無疑問,我也寫了一個“假”的cmsis_compiler.h。分析到現(xiàn)在,我需要創(chuàng)建三個頭文件(device.h&cmsis_os2.h&cmsis_compiler.h)來實(shí)現(xiàn)我的DAP工程。
		接下來我會對main.cUSBD_User_HID_0.c做一些一些簡單的介紹。
  • main.c
我在盡可能地精簡我下載下來的這些源文件,所以我也沒有要示例工程中的rl_usb.h文件。于是我還需要一個頭文件來定義一些關(guān)于USB通信的函數(shù)和參數(shù)。這里有一些來自CMSIS RTOS庫的函數(shù),其中最重要的一個是osThreadNew,在我的工程中我把它實(shí)現(xiàn)如下:

	
		osThreadId_t osThreadNew(void (*func)(void *), void * n, void * ctx) { (void)n; (*func)(ctx); return 0; }
		我直接“跳轉(zhuǎn)”到本需要被創(chuàng)建的線程函數(shù)中,這就意味著main.c中的osKernelGetState&osKernelStart&osDelay三個函數(shù)永遠(yuǎn)不會被執(zhí)行。下一個重要的函數(shù)是USBD_Configured,我將在使用STM32CubeMX生成初始化代碼那一節(jié)解釋這個函數(shù)。
  • USBD_User_HID_0.c
我移除了RTEUSBUSBD_Config_HID_0.h并在我自己的rl_usb.h中重新定義了USBD_HID0_OUT_REPORT_MAX_SZ&USBD_HID0_IN_REPORT_MAX_SZ兩個參數(shù)。 USB HID通信的核心是由兩個接口中斷函數(shù)管理的兩個循環(huán)隊(duì)列:

	
		int32_t USBD_HID0_GetReport (uint8_t rtype, uint8_t req, uint8_t rid, uint8_t *buf) { (void)rid; switch (rtype) { case HID_REPORT_INPUT: ... break; } return (0); }

	
		bool USBD_HID0_SetReport (uint8_t rtype, uint8_t req, uint8_t rid, const uint8_t *buf, int32_t len) { (void)req; (void)rid; switch (rtype) { case HID_REPORT_OUTPUT: ... break; } return true; }
		當(dāng)上位機(jī)向DAP發(fā)送OUTPUT REPORT報(bào)文后,DAP會調(diào)用USBD_HID0_SetReport函數(shù),該參數(shù)的輸入形參rtype必須為HID_REPORT_OUTPUT。當(dāng)DAP成功向上位機(jī)發(fā)送INPUT REPORT報(bào)文時,函數(shù)USB_HID0_GetReport被調(diào)用,該函數(shù)的輸入形參rtype必須為HID_REPORT_INPUT,并且形參req必須為USBD_HID_REQ_EP_INT。這意味著我們所有的報(bào)文必須通過64B數(shù)據(jù)包大小的USB中斷端點(diǎn)傳輸。
		線程DAP_Thread只是一個命令判斷選擇器。在這個函數(shù)中有一個很重要的語句:

	USBD_HID_GetReportTrigger(0U, 0U, USB_Response[n], DAP_PACKET_SIZE);
		我們必須實(shí)現(xiàn)一個叫做USBD_HID_GetReportTrigger的函數(shù)來想上位機(jī)發(fā)送INPUT REPORT。
		

使用STM32CubeMX生成初始化代碼

在我的單片機(jī)上有一個8MHz的晶振,所以我選擇HSE為時鐘信號源。PLLMul配置為x9,得到72MHz的PLLCLK,提供給CPU和AHB/APB2總線,提供給APB1總線的PCLK1配置為36MHz。USB預(yù)分頻配置為1.5分頻,得到48MHz的USB時鐘。SPI1配置為Full-Duplex Master,舍去NSS信號,USART1配置為Asynchronous。USB設(shè)備進(jìn)一步配置為Custom HID ClassUSBD_CUSTOMHID_OUTREPORT_BUF_SIZE設(shè)置為64 Bytes。

注意: 我沒有修改設(shè)備的VID和PID。但我猜測有些上位機(jī)軟件會檢測這兩個ID
如果你發(fā)現(xiàn)你的軟件不能識別我這個CMSIS-DAP,或許你需要恰當(dāng)?shù)腣ID和PID??梢栽囋囀纠a中的VID/PID,它在一個叫做USBD_Config_0.c的文件中,我的工程中沒有這個文件。

有STM32CubeMX生成的代碼需要一些修改。在usbd_customhid.h中,CUSTOM_HID_EPIN_SIZECUSTOM_HID_EPOUT_SIZE必須設(shè)置為0x40U。我把CUSTOM_HID_FS_BINTERVAL改為0x01來嘗試提升HID的通信速度。

_USBD_CUSTOM_HID_Itf結(jié)構(gòu)體中,我新增了一個成員:

	typedef struct _USBD_CUSTOM_HID_Itf { uint8_t *pReport; int8_t (* Init)(void); int8_t (* DeInit)(void); int8_t (* OutEvent)(uint8_t event_idx, uint8_t state); /* I add an extra interface func below. Zach Lee */ int8_t (* InEvent)(uint8_t event_idx, uint8_t state); } USBD_CUSTOM_HID_ItfTypeDef;
		當(dāng)INPUT REPORT報(bào)文成功發(fā)給上位機(jī)時,InEvent函數(shù)應(yīng)當(dāng)被調(diào)用,所以usbd_customhid.c中的USBD_CUSTOM_HID_DataIn函數(shù)需要修改如下:

	static uint8_t USBD_CUSTOM_HID_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) { /* Ensure that the FIFO is empty before a new transfer, this condition could be caused by a new transfer before the end of the previous transfer */ USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassData; hhid->state = CUSTOM_HID_IDLE; /* I add a new interface func in the structure USBD_CUSTOM_HID_ItfTypeDef. Zach Lee */ ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->InEvent(hhid->Report_buf[0], hhid->Report_buf[1]); return USBD_OK; }
		設(shè)備描述符CUSTOM_HID_ReportDesc_FS被定義在usbd_suctom_hid_if.c中,我定義了一個簡單的描述符:

	/** Usb HID report descriptor. */ __ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { /* USER CODE BEGIN 0 */ /* A minimal Report Desc with INPUT/OUTPUT/FEATURE report. Zach Lee */ 0x06,0x00,0xFF, /* Usage Page (vendor defined) ($FF00) global */ 0x09,0x01, /* Usage (vendor defined) ($01) local */ 0xA1,0x01, /* Collection (Application) */ 0x15,0x00, /* LOGICAL_MINIMUM (0) */ 0x25,0xFF, /* LOGICAL_MAXIMUM (255) */ 0x75,0x08, /* REPORT_SIZE (8bit) */ // Input Report 0x95,64, /* Report Length (64 REPORT_SIZE) */ 0x09,0x01, /* USAGE (Vendor Usage 1) */ 0x81,0x02, /* Input(data,var,absolute) */ // Output Report 0x95,64, /* Report Length (64 REPORT_SIZE) */ 0x09,0x01, /* USAGE (Vendor Usage 1) */ 0x91,0x02, /* Output(data,var,absolute) */ // Feature Report 0x95,64, /* Report Length (64 REPORT_SIZE) */ 0x09,0x01, /* USAGE (Vendor Usage 1) */ 0xB1,0x02, /* Feature(data,var,absolute) */ /* USER CODE END 0 */ 0xC0 /* END_COLLECTION */ };
		可能Feature Report在CMSIS-DAP中不是必要的,就留著它吧。
		我在這個C文件中還實(shí)現(xiàn)了一個新的接口函數(shù)CUSTOM_HID_InEvent_FS

	static int8_t CUSTOM_HID_InEvent_FS(uint8_t event_idx, uint8_t state); /* An extra interface func. */ USBD_CUSTOM_HID_ItfTypeDef USBD_CustomHID_fops_FS = { CUSTOM_HID_ReportDesc_FS, CUSTOM_HID_Init_FS, CUSTOM_HID_DeInit_FS, CUSTOM_HID_OutEvent_FS, /* I add an extra interface func below. Zach Lee */ CUSTOM_HID_InEvent_FS };

	extern void USBD_OutEvent(void); /* Implemented in file "device.h" */ static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state) { /* USER CODE BEGIN 6 */ USBD_OutEvent(); /* OUTPUT REPORT was received. Zach Lee */ return (USBD_OK); /* USER CODE END 6 */ } extern void USBD_InEvent(void); /* Implemented in file "device.h" */ static int8_t CUSTOM_HID_InEvent_FS(uint8_t event_idx, uint8_t state) { /* USER CODE BEGIN extra */ USBD_InEvent(); /* INPUT REPORT has been sent. Zach Lee */ return (USBD_OK); /* USER CODE END extra */ }CUSTOM_HID_Init_FSCUSTOM_HID_DeInit_FS兩個函數(shù)被實(shí)現(xiàn)為使能/失能DAP功能:

	extern void USBD_HID0_Initialize (void); static int8_t CUSTOM_HID_Init_FS(void) { /* USER CODE BEGIN 4 */ USBD_HID0_Initialize(); /* Initialize USB communication of DAP. Zach Lee */ return (USBD_OK); /* USER CODE END 4 */ } extern void USBD_HID0_Uninitialize (void); static int8_t CUSTOM_HID_DeInit_FS(void) { /* USER CODE BEGIN 5 */ USBD_HID0_Uninitialize(); /* Uninitialize. Zach Lee */ return (USBD_OK); /* USER CODE END 5 */ }
		

編寫將所有源代碼關(guān)聯(lián)起來的橋梁

為了移除CMSIS RTOS,我寫了一些函數(shù)來模擬RTOS:


	/** * Replace CMSIS RTOS api */ static volatile int osFlags; /* Use "volatile" to prevent GCC optimizing the code. */ void osKernelInitialize(void) { osFlags = 0; return; } int osThreadFlagsWait(int mask, int b, int c) { (void)b; (void)c; int ret; while((osFlags&mask) == 0) { ; } ret = osFlags; osFlags &= ~mask; return ret; } void osThreadFlagsSet(int tid, int f) { (void)tid; osFlags |= f; return; }
		函數(shù)USBD_ConfiguredUSBD_HID_GetReportTrigger實(shí)現(xiàn)如下:

	intUSBD_Configured(int n){  (void)n;  return(hUsbDeviceFS.dev_state == USBD_STATE_CONFIGURED ?1:0);}

	void USBD_HID_GetReportTrigger(int a, int b, void * report, int len) { (void)a; (void)b; if (USBD_OK != USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, report, len)) { ; } return; }
		函數(shù)USBD_CUSTOM_HID_SendReport是由STM32CubeMX生成的,它被定義在usbd_customhid.c中,我自己的事件句柄如下:

	
		bool USBD_HID0_SetReport (uint8_t rtype, uint8_t req, uint8_t rid, const uint8_t *buf, int32_t len); void USBD_OutEvent(void) { USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)hUsbDeviceFS.pClassData; USBD_HID0_SetReport(HID_REPORT_OUTPUT, 0, 0, hhid->Report_buf, USBD_CUSTOMHID_OUTREPORT_BUF_SIZE); } int32_t USBD_HID0_GetReport (uint8_t rtype, uint8_t req, uint8_t rid, uint8_t *buf); void USBD_InEvent(void) { int32_t len; USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)hUsbDeviceFS.pClassData; if ((len=USBD_HID0_GetReport(HID_REPORT_INPUT, USBD_HID_REQ_EP_INT, 0, hhid->Report_buf)) > 0) { USBD_HID_GetReportTrigger(0, 0, hhid->Report_buf, len); } }
注意: 在DAP.h中,這里有個名為PIN_DELAY_SLOW的函數(shù),它原本的實(shí)現(xiàn)是這樣的:

	
		__STATIC_FORCEINLINE void PIN_DELAY_SLOW (uint32_t delay) { uint32_t count; count = delay; while (--count); }
這里的空循環(huán)while (–count);會被GCC優(yōu)化。我在StackOverflow中找到了一個好點(diǎn)子,它能正常工作但不是太合適,你有更好的方法嗎?

	
		__STATIC_FORCEINLINE void PIN_DELAY_SLOW (uint32_t delay) { uint32_t count; count = delay; while (--count) { /** * Empty loop will be totally omitted by GCC. * Search "How to prevent GCC from optimizing out a busy wait loop?" @ StackOverflow. * This solution isn't portable. Zach Lee */ __ASM(""); } }
至此,相關(guān)源碼就介紹完畢。
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19286

    瀏覽量

    229841
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10900

    瀏覽量

    356005
  • 下載器
    +關(guān)注

    關(guān)注

    1

    文章

    62

    瀏覽量

    12839
  • Cortex-M
    +關(guān)注

    關(guān)注

    2

    文章

    229

    瀏覽量

    29763

原文標(biāo)題:基于STM32自制CMSIS-DAP下載器

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    STM32CubeMX生成的STM32F1工程,使用CMSIS-DAP下載下載一次之后就無法下載了,為什么?

    使用STM32CubeMX生成的STM32F1工程,在使用CMSIS-DAP下載下載一次之后,
    發(fā)表于 04-08 06:29

    在linux下使用openocd時cmsis-dap下載速度奇慢的原因?

    在linux下使用openocd時 cmsis-dap下載速度奇慢的問題
    發(fā)表于 04-25 07:21

    CMSIS-DAP Mini仿真器用戶手冊

    CMSIS-DAP Mini仿真器用戶手冊相關(guān)閱讀:【仿真,不只有J—Link】CMSIS-DAP調(diào)試標(biāo)準(zhǔn)解讀https://bbs.elecfans.com/jishu_576894_1_1.html
    發(fā)表于 04-27 15:22

    CMSIS-DAP Mini仿真申請】CMSIS-DAP Mini仿真評估

    申請理由:就職于全球知名半導(dǎo)體公司的MCU部門,負(fù)責(zé)Cortex M系列MCU的SDK支持與開發(fā),每一款MCU的SDK支持都需要評估各個調(diào)試的支持情況。所以會一直使用各種調(diào)試進(jìn)行測試。項(xiàng)目描述:已有與新的ARM cortex M系列MCU采用
    發(fā)表于 05-25 11:33

    CMSIS-DAP Mini仿真試用體驗(yàn)】+第一篇 ?CMSIS-DAP Mini仿真開箱大揭秘

    `今天中午收到了CMSIS-DAP Mini仿真,趕緊就迫不及待的上傳開箱貼了:整個外包裝。挺簡約的,再來幾張?zhí)貙懀嚎偟媒o我的感覺就是塑料外殼做的很簡陋,感覺材料不是很好,但是優(yōu)點(diǎn)是體積小巧,這個我喜歡。整個外觀就介紹這么多,接下來就要試用
    發(fā)表于 06-17 23:14

    CMSIS-DAP Mini仿真試用體驗(yàn)】+第六篇 ?CMSIS-DAP Mini仿真下載移植PM檢測從51到STM32

    ,對了還有串口,再來一張?zhí)貙懀捍诰€連接電腦,模擬PM傳感的串口數(shù)據(jù)輸出??纯匆郧坝?1做的:原帖子的連接這個雖然粗糙些,但是芯片高級啊,程序稍微復(fù)雜些。至此,CMSIS-DAP的試用算是告一段落了,后續(xù)要逐漸過渡下,從51先升級到S
    發(fā)表于 07-15 09:27

    CMSIS-DAP Mini仿真試用體驗(yàn)】CANNON藍(lán)牙板調(diào)試下載與試用總結(jié)

    CMSIS-DAP。再次下載,正常工作。在用KEIL 時還碰到了 一個問題,這個問題壇友也在問。我當(dāng)時遇到這個問題,然后用IAR連接調(diào)試調(diào)試之后,再換了KEIL就沒有再復(fù)現(xiàn),所以有點(diǎn)不確定是不是KEIL上述
    發(fā)表于 07-18 22:17

    CMSIS-DAP Mini仿真試用體驗(yàn)】+第七篇 ?CMSIS-DAP Mini仿真增補(bǔ)貼

    CMSIS-DAP和我寫的1602程序沖突了。前一段時間,發(fā)的STM32驅(qū)動1602的程序的異常現(xiàn)象,CMSIS-DAP Mini仿真下載
    發(fā)表于 07-24 19:37

    如何去實(shí)現(xiàn)一種基于STM32F103的CMSIS-DAP下載設(shè)計(jì)呢

    如何去實(shí)現(xiàn)一種基于STM32F103的CMSIS-DAP下載設(shè)計(jì)呢?有哪些設(shè)計(jì)步驟?
    發(fā)表于 01-26 06:15

    為什么STM32F1無法使用CMSIS-DAP下載進(jìn)行二次下載

    1. 問題描述使用STM32CubeMX生成的 STM32F1 工程,在使用 CMSIS-DAP 下載
    發(fā)表于 02-10 07:39

    自己制作一款CMSIS-DAP調(diào)試

    CMSIS-DAP調(diào)試是一款開源調(diào)試,網(wǎng)上也有很多制作資料,我也是根據(jù)這些資料,自己制作了一款CMSIS-DAP調(diào)試,目前使用沒發(fā)現(xiàn)什
    發(fā)表于 02-28 11:20

    淺析RT-Thread用CMSIS-DAP調(diào)試會導(dǎo)致SIGSEGV hardfault的問題

    : STM32H743-ATK-APOLLO調(diào)試工具: (Jlink V11) vs (fireDAP 野火高速調(diào)試)重現(xiàn)步驟1、使用在線 BSP創(chuàng)建新項(xiàng)目:2、查看默認(rèn)下載配置如下(CMS
    發(fā)表于 07-07 14:51

    CMSIS-DAP的LPC-Link2問題求解

    我有一個帶有閃存 CMSIS-DAP 腳本的 LPC-Link2 板,但是當(dāng)開始使用 openOCD 進(jìn)行調(diào)試時,我收到一個錯誤:“錯誤:CMSIS-DAP 命令 CMD_INFO 失敗”??赡苁?/div>
    發(fā)表于 03-16 06:47

    CMSIS-DAP Mini仿真-用戶手冊

    CMSIS-DAP Mini仿真-用戶手冊
    發(fā)表于 11-22 19:12 ?11次下載

    基于STM32F103自制CMSIS-DAP下載

    關(guān)注+星標(biāo)公眾號,不錯過精彩內(nèi)容編排 |strongerHuang微信公眾號 |strongerHuang市面上針對Cortex-M處理下載,有很多是基于CMSIS-DAP演變.
    發(fā)表于 12-01 15:21 ?44次下載
    基于<b class='flag-5'>STM32</b>F103<b class='flag-5'>自制</b><b class='flag-5'>CMSIS-DAP</b><b class='flag-5'>下載</b><b class='flag-5'>器</b>
    主站蜘蛛池模板: 欧美福利视频网| 午夜精品久久久久久久99| 国产香港三级理论在线| 爱爱小视频免费| 天天天干干干| 国产chinesehd精品酒店| 美国bj69video18视频| 久久国产精品免费专区| 五月婷婷丁香久久| 国色天香精品亚洲精品| 五月婷婷六月婷婷| 日本国产黄色片| 国产精品一区二区三区免费视频 | 日本三级s级在线播放| 久久青草91免费观看| 夜夜超b天天| 国产大片免费观看中文字幕| 种子天堂bt| 女人色视频| 4虎影院永久地址www| 黑色丝袜美女被视频网站| 亚洲精品免费视频| 完整日本特级毛片| a级毛片网站| 91福利网| 一级片aaa| 欧美色图综合网| 亚洲色图激情| 欧美草比| 五月婷婷在线免费观看| ts人妖另类国产| 亚洲性爱城| 亚洲va久久久噜噜噜久久男同| 欧美色图色就是色| 久久久黄色片| 黄网站在线观看| 国产精品九九久久一区hh| 在线99热| 色天使色婷婷在线影院亚洲| 国产高清免费视频| 一区二区三区久久|