【目的】
官方示例提供了MDK、IAR的示例,也提供了以上兩個(gè)環(huán)境的工程模板,但是沒有GCC的工程模板,GCC編譯環(huán)境與MDK、IAR主要區(qū)別就是C語言啟動(dòng)環(huán)境的配置、鏈接文件的不一至,因?yàn)橐獙?shí)現(xiàn)VScode或者其他的編譯器來實(shí)現(xiàn)開發(fā)環(huán)境的搭建,就需要自己編寫CW32L083_FLASH.ld、以及startup_cw32l083_gcc.s。
【實(shí)現(xiàn)的思路】
1、尋找官方支持,我在CW32生態(tài)群里發(fā)了求助的信息,沒有回復(fù)。
2、在淘寶客服,咨詢,回復(fù)說,沒有工程。
3、有大佬提供了CW32F030的工程,我了解到CW32F030與CW32L083一樣是CortexM0+的內(nèi)核,所以想他的啟動(dòng)文件跟LD應(yīng)該可以相互借鑒。所以償試修改CW32F030的工程來實(shí)現(xiàn)GCC的工程。
【實(shí)現(xiàn)步驟】
1、拷貝一份工程,另存為cw32l083_gcc,并用vscode打開。
2、到官網(wǎng)下載cw32l083的固件庫。
3、把cw32l083-stdperiph-lib/Libraries下面的固件替換掉cw32l083_gcc/Libraries固件。
4、復(fù)制cw32l083.h、system_cw32l083.h到/Libraries/CMSIS/Device/目錄下面。刪除原來的cw32f030.h以及system_cwl083.h。
5、Libraries/CMSIS/Device/startup_cw32f030_gcc.s重命名為startup_cw32l083_gcc.s。
6、Libraries/CMSIS/Device/CW32f030_FLASH.ld重命名為CW32L083_FLASH.ld。
7、Debug/CW32F030.svd 重命名為CW32L083.svd。并把其文件內(nèi)的cwf030修改為cw32l083.
8、復(fù)制l083固件庫中的cw32l083-stdperiph-lib/IdeSupport/MDKWHXY.CW32L083_DFP.1.0.8.pack 到Debug/WHXY.CW32L083_DFP.1.0.8.pack,并刪除原來的.pack文件。
9、復(fù)制cw32l083-stdperiph-lib/Examples/GPIO/gpio_blink/USER/src/interrupts_cw32l083.c 到/cw32l083_gcc/Core/app/interrupts_cw32l083.c。以及inc下面的interrupts_cw32l083.h。
10、修改Libraries/Libraries.mk文件內(nèi)容,主要是文件夾的名稱重新定位。
模塊名_DIR 是上一層傳遞下來的參數(shù),
是從工程根目錄到該模塊文件夾的路徑
向 C_SOURCES 中添加需要編譯的源文件
C_SOURCES += **(wildcard **(Libraries_DIR)/CW32L083_StdLib/src/*.c)
向 C_INCLUDES 中添加頭文件路徑
C_INCLUDES += -I$(Libraries_DIR)/CMSIS/Include
C_INCLUDES += -I$(Libraries_DIR)/CMSIS/Device/
C_INCLUDES += -I$(Libraries_DIR)/CW32L083_StdLib/inc
向 LIBDIR 中添加靜態(tài)庫文件路徑
LIBDIR += -L$(Libraries_DIR)/Lib
向 LIBS 中添加需要鏈接的靜態(tài)庫
LIBS += -lxxxx
link script
LDSCRIPT = $(Libraries_DIR)/CMSIS/Device/CW32L083_FLASH.ld
匯編文件宏定義
AS_DEFS +=
匯編頭文件目錄
AS_INCLUDES +=
匯編源文件(starup)
ASM_SOURCES += $(Libraries_DIR)/CMSIS/Device/startup_cw32l083_gcc.s
11、修改makefile,修加gcc的路徑:
#######################################
編譯器指定
#######################################
PREFIX = arm-none-eabi-
啟用下一項(xiàng)以指定GCC目錄
GCC_PATH = /Applications/ARM/bin/
12、修改pyocd.yaml,指定tartgets、pack包名稱:
pack: ./Debug/WHXY.CW32L083_DFP.1.0.8.pack
target_override: CW32L083vc
frequency: 24000000
13、查找CW32L083用戶手冊(cè),修改/Libraries/CMSIS/Device/CW32L083_FLASH.ld的RAM、FLASH如下:
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 24K
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K
}
14、由于.h與MDK的編譯上有所差別會(huì)報(bào)警告
Libraries/CW32L083_StdLib/inc/cw32l083_gtim.h:272:52: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
272 | #define IS_GTIM_DMA(DMA) (((DMA) & 0xFFFFFFC0 == 0x0UL) && (DMA) != 0x0UL)
修改為:#define IS_GTIM_DMA(DMA) ((((DMA) & 0xFFFFFFC0) == 0x0UL) && (DMA) != 0x0UL),消除運(yùn)算符的警告。
15、修改SysTick.c中的__weak 編譯錯(cuò)誤,修改為:attribute ((weak))
到此,工程修改就結(jié)束。
編譯后無警告無錯(cuò)誤:
[LD] build_exec/template.elf
[HEX] build_exec/template.elf -> build_exec/template.hex
[BIN] build_exec/template.elf -> build_exec/template.bin
[DUMP] build_exec/template.elf -> build_exec/template.s
[SIZE] build_exec/template.elf
text data bss dec hex filename
1088 16 1568 2672 a70 build_exec/template.elf
-e Build Finish
修改app_main.c的LED針腳,內(nèi)容如下:
#include "app_main.h"
#include "cw32l083_gpio.h"
#include "cw32l083_rcc.h"
static inline void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOC, ENABLE);
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Pins = GPIO_PIN_2;
GPIO_Init(CW_GPIOC, &GPIO_InitStruct);
}
int main(void)
{
LED_Init();
// 開啟兩線調(diào)試接口
RCC_SWDIO_Config(RCC_SYSCTRL_SWDIOEN);
while (1)
{
GPIO_TogglePin(CW_GPIOC, GPIO_PIN_2);
FirmwareDelay(1000000);
}
return 0;
}
/******************************************************************************
- EOF (not truncated)
****************************************************************************/
#ifdef USE_FULL_ASSERT
/- @brief Reports the name of the source file and the source line number
- where the assert_param error has occurred.
- @param file: pointer to the source file name
- @param line: assert_param error line source number
- @retval None
*/
void assert_failed(uint8_t file, uint32_t line)
{
/ USER CODE BEGIN 6 /
/ User can add his own implementation to report the file name and line number,
tex: printf("Wrong parameters value: file %s on line %d
", file, line) /
/ USER CODE END 6 /
}
#endif / USE_FULL_ASSERT */
編譯下載,就可以實(shí)現(xiàn)Led1閃爍了。
liujianhuadeMacBook-Pro:cw32l083_gcc liujianhua$ make flash
-e Start pyOCD
0000909 I Loading /Users/liujianhua/cw32l083/cw32l083_gcc/build_exec/template.elf [load_cmd]
[==================================================] 100%
0001522 I Erased 0 bytes (0 sectors), programmed 0 bytes (0 pages), skipped 1536 bytes (3 pages) at 2.45 kB/s [loader]
【總結(jié)】
經(jīng)過N次的試驗(yàn),終于成功的實(shí)現(xiàn)了cw32l083的gcc工程模版的創(chuàng)建。使得在linux、macOS環(huán)境下不能用MDK、IAR的難題。
附工程模版:
審核編輯:湯梓紅
-
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136808 -
IAR
+關(guān)注
關(guān)注
5文章
352瀏覽量
36678 -
編譯器
+關(guān)注
關(guān)注
1文章
1634瀏覽量
49129 -
開發(fā)環(huán)境
+關(guān)注
關(guān)注
1文章
225瀏覽量
16617
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論