[CW32L083系列] 首创CW32L083GCC工程模版

[复制链接]
 楼主| lulugl 发表于 2023-6-19 22:13 | 显示全部楼层 |阅读模式
#申请原创# #有奖活动# @21小跑堂
【目的】
官方示例提供了MDK、IAR的示例,也提供了以上两个环境的工程模板,但是没有GCC的工程模板,GCC编译环境与MDK、IAR主要区别就是C语言启动环境的配置、链接文件的不一至,因为要实现VScode或者其他的编译器来实现开发环境的搭建,就需要自己编写CW32L083_FLASH.ld、以及startup_cw32l083_gcc.s。
【实现的思路】
1、寻找官方支持,我在CW32生态群里发了求助的信息,没有回复。
2、在淘宝客服,咨询,回复说,没有工程。
3、有大佬提供了CW32F030的工程,我了解到CW32F030与CW32L083一样是CortexM0+的内核,所以想他的启动文件跟LD应该可以相互借鉴。所以偿试修改CW32F030的工程来实现GCC的工程。
【实现步骤】
1、拷贝一份工程,另存为cw32l083_gcc,并用vscode打开。
2、到官网下载cw32l083的固件库。
3、把cw32l083-stdperiph-lib/Libraries下面的固件替换掉cw32l083_gcc/Libraries固件。
4、复制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。并把其文件内的cwf030修改为cw32l083.
8、复制l083固件库中的cw32l083-stdperiph-lib/IdeSupport/MDKWHXY.CW32L083_DFP.1.0.8.pack 到Debug/WHXY.CW32L083_DFP.1.0.8.pack,并删除原来的.pack文件。
9、复制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文件内容,主要是文件夹的名称重新定位。
  1. # 模块名_DIR 是上一层传递下来的参数,
  2. # 是从工程根目录到该模块文件夹的路径

  3. # 向 C_SOURCES 中添加需要编译的源文件
  4. C_SOURCES += $(wildcard $(Libraries_DIR)/CW32L083_StdLib/src/*.c)

  5. # 向 C_INCLUDES 中添加头文件路径
  6. C_INCLUDES += -I$(Libraries_DIR)/CMSIS/Include
  7. C_INCLUDES += -I$(Libraries_DIR)/CMSIS/Device/
  8. C_INCLUDES += -I$(Libraries_DIR)/CW32L083_StdLib/inc


  9. # 向 LIBDIR 中添加静态库文件路径
  10. # LIBDIR += -L$(Libraries_DIR)/Lib
  11. # 向 LIBS 中添加需要链接的静态库
  12. # LIBS += -lxxxx

  13. # link script
  14. LDSCRIPT = $(Libraries_DIR)/CMSIS/Device/CW32L083_FLASH.ld


  15. # 汇编文件宏定义
  16. AS_DEFS +=

  17. # 汇编头文件目录
  18. AS_INCLUDES +=

  19. # 汇编源文件(starup)
  20. ASM_SOURCES += $(Libraries_DIR)/CMSIS/Device/startup_cw32l083_gcc.s

11、修改makefile,修加gcc的路径:
  1. #######################################
  2. # 编译器指定
  3. #######################################
  4. PREFIX = arm-none-eabi-
  5. # 启用下一项以指定GCC目录
  6. GCC_PATH = /Applications/ARM/bin/
12、修改pyocd.yaml,指定tartgets、pack包名称:
  1. pack: ./Debug/WHXY.CW32L083_DFP.1.0.8.pack
  2. target_override: CW32L083vc
  3. frequency: 24000000
13、查找CW32L083用户手册,修改/Libraries/CMSIS/Device/CW32L083_FLASH.ld的RAM、FLASH如下:
  1. /* Specify the memory areas */
  2. MEMORY
  3. {
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 24K
  5. FLASH (rx)     : ORIGIN = 0x00000000, LENGTH = 256K
  6. }
14、由于.h与MDK的编译上有所差别会报警告
  1. Libraries/CW32L083_StdLib/inc/cw32l083_gtim.h:272:52: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
  2.   272 | #define IS_GTIM_DMA(DMA)                   (((DMA) & 0xFFFFFFC0 == 0x0UL) && (DMA) != 0x0UL)
修改为:#define IS_GTIM_DMA(DMA) ((((DMA) & 0xFFFFFFC0) == 0x0UL) && (DMA) != 0x0UL),消除运算符的警告。
15、修改SysTick.c中的__weak 编译错误,修改为:__attribute__ ((weak))
到此,工程修改就结束。
编译后无警告无错误:
  1. [LD]    build_exec/template.elf
  2. [HEX]   build_exec/template.elf -> build_exec/template.hex
  3. [BIN]   build_exec/template.elf -> build_exec/template.bin
  4. [DUMP]  build_exec/template.elf -> build_exec/template.s
  5. [SIZE]  build_exec/template.elf
  6.    text    data     bss     dec     hex filename
  7.    1088      16    1568    2672     a70 build_exec/template.elf
  8. -e Build Finish
修改app_main.c的LED针脚,内容如下:
  1. #include "app_main.h"
  2. #include "cw32l083_gpio.h"
  3. #include "cw32l083_rcc.h"

  4. static inline void LED_Init()
  5. {
  6.     GPIO_InitTypeDef GPIO_InitStruct;
  7.     RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOC, ENABLE);

  8.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  9.     GPIO_InitStruct.IT = GPIO_IT_NONE;
  10.     GPIO_InitStruct.Pins = GPIO_PIN_2;
  11.     GPIO_Init(CW_GPIOC, &GPIO_InitStruct);
  12. }

  13. int main(void)
  14. {
  15.     LED_Init();
  16.     // 开启两线调试接口
  17.     RCC_SWDIO_Config(RCC_SYSCTRL_SWDIOEN);

  18.     while (1)
  19.     {
  20.         GPIO_TogglePin(CW_GPIOC, GPIO_PIN_2);
  21.         FirmwareDelay(1000000);
  22.     }

  23.     return 0;
  24. }

  25. /******************************************************************************
  26. * EOF (not truncated)
  27. ******************************************************************************/
  28. #ifdef USE_FULL_ASSERT
  29. /**
  30. * [url=home.php?mod=space&uid=247401]@brief[/url]  Reports the name of the source file and the source line number
  31. *         where the assert_param error has occurred.
  32. * @param  file: pointer to the source file name
  33. * @param  line: assert_param error line source number
  34. * @retval None
  35. */
  36. void assert_failed(uint8_t *file, uint32_t line)
  37. {
  38.     /* USER CODE BEGIN 6 */
  39.     /* User can add his own implementation to report the file name and line number,
  40.        tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  41.     /* USER CODE END 6 */
  42. }
  43. #endif /* USE_FULL_ASSERT */
编译下载,就可以实现Led1闪烁了。
  1. liujianhuadeMacBook-Pro:cw32l083_gcc liujianhua$ make flash
  2. -e Start pyOCD
  3. 0000909 I Loading /Users/liujianhua/cw32l083/cw32l083_gcc/build_exec/template.elf [load_cmd]
  4. [==================================================] 100%
  5. 0001522 I Erased 0 bytes (0 sectors), programmed 0 bytes (0 pages), skipped 1536 bytes (3 pages) at 2.45 kB/s [loader]
【总结】
经过N次的试验,终于成功的实现了cw32l083的gcc工程模块的创建。使得在linux、macOS环境下不能用MDK、IAR的难题。
pssyx 发表于 2023-6-20 09:48 | 显示全部楼层
本帖最后由 pssyx 于 2023-6-20 09:53 编辑

十分佩服!已经在苹果的MacBook-Pro上成功运行CW32。
 楼主| lulugl 发表于 2023-6-20 09:55 | 显示全部楼层
pssyx 发表于 2023-6-20 09:48
十分佩服!已经在苹果的MacBook-Pro上成功运行CW32。

感谢大佬的认可!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

830

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部

180

主题

830

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部