|
Codesourcery G++是个商业软件, 不过它有个lite版本,是完全免费的,只不过没有IDE,只有commmand line。 这对于习惯于使用GNU编译器的人来说已经足够了。自己在找个编辑器(我用的是source insight)开发起来应该说还算方便。* z6 D- B. H; \% b Codesourcery G++支持coldfire, powerpc, ARM 和 MIPS. 每种都有windows和linxu下运行的版本。从其主页上看,Codesourcery应该是ARM和MIPS公司的合作伙伴了, 因此其提供的编译器各方面应该还是不错的。早在GCC支持cortex之前,codesourcery就已经有了支持cortex的版本了。3 j7 [0 u4 o3 m s6 D 我在年初买了一块EK-STM32板子,在公司,以及自己用AVR,其它ARM都是GNU,因此不大习惯使用keil和IAR。另外住在公司不方便(protel事件)。于是找到了这个codesourcery,当时貌似还没多少人用这个玩STM32,没找到范例。好在GNU那一套都差不多。自己摸索摸索终于还是用起来了。写了几个程序,移植了个以前其它平台上的mp3。 后来板子就扔在那,没有再玩。8过最近还是玩起来了。 首先下载了最新的q3版本的软件包。要选择EABI的windows版本。然后按装,安装很简单,一个可执行文件,按照正常的那套就行了。 $ \" Q* k. W8 s1 z( d 重新编译一下以前的程序。 有个错误,是一个内部库文件的函数名前要多加一个"_" 影响不大。* T X5 N& { Q- v 编译完,哇,size从之前的45K减少到38K,看来的确如别人所说,性能有所提高。这个版本的codesourcery使用了新的lib,我的程序中使用到printf函数,估计在这上面优化了吧。不过如果size吃紧的话最好还是自己写一个简单版的printf函数。不然代码会增加很多 (以前是一下子增加20K左右)。9 I7 k9 m5 r, D. ~/ ~ 具体怎么用这个编译器,下面附上我的程序。 这个压缩包内有三个文件夹。 4 d1 z: U8 |9 G( H* a% @ o build_library:顾名思义就是用来编译lib文件的。原来是放在每个工程下的。不过我嫌它占地方,就把它独立出来,build好后直接把lib文件(.a后缀)拷到我程序的目录下。如何编译这个lib呢,很简单装好codesourcery后进入command line,到./buid_library/library/src 然后敲make就可以了。 如果要配置lib,在project目录下有一个头文件,另外生成的lib文件也放在这。 0 q5 L% A; e F mp3_player_02:这是我移植的mp3程序。根据豆皮重新修改了IO口的位置(注:需要外接VS1003模块)。另外增加了SDHC的支持。 具体端口是:(我直接从程序中copy的): Z% t! J' \+ K! A& \ SD卡的 (可以使用豆皮上的SD卡socket): #define MMC_SD_CS GPIO_Pin_4 #define MMC_SD_CS_PORT GPIOA: e/ X# O- x* c /******************************/6 P P( J3 J! H/ @" | #define MMC_SD_SCK GPIO_Pin_5( H2 F+ M* x; u0 _: n4 C, q0 P% E3 Z #define MMC_SD_SCK_PORT GPIOA % Z3 y9 M* [, e* j0 i #define MMC_SD_MISO GPIO_Pin_67 n& x% j% S* f0 p; x1 x* R: U9 @: N3 I& k #define MMC_SD_MISO_PORT GPIOA $ H8 H$ t( P- @! {6 [9 s6 y% o #define MMC_SD_MOSI GPIO_Pin_7 #define MMC_SD_MOSI_PORT GPIOA5 I0 X2 {+ t/ U2 g/ ]9 Z8 ` , W. i, K; v) T. f9 x% Y #define MMC_SD_SPI_SAME 1 /* it indicate that all SPI signal are in the same port*/ #define MMC_SD_SPI_PORT GPIOA6 ?( m0 c. N2 i" t: V! [0 O /*****************************/8 P9 {# K- x4 Z3 c% \8 O 5 J2 i, d4 t4 |$ }& i7 Y9 u #define MMC_SD_GPIO_PORTS RCC_APB2Periph_GPIOA VS1003的: #define VS1003B_XCS GPIO_Pin_0- h1 I3 L" l; t' }. S; G Q( h #define VS1003B_XCS_PORT GPIOB9 N G$ b9 ]/ a . V$ N' `# f' u2 T* \$ C! a* x9 U2 f #define VS1003B_XDCS GPIO_Pin_2( O7 }7 z3 V) w" X6 V #define VS1003B_XDCS_PORT GPIOB' \- q1 t+ B8 z8 f5 S3 h9 X #define VS1003B_XRESET GPIO_Pin_1 #define VS1003B_XRESET_PORT GPIOB 4 K+ f" Q" w0 \ #define VS1003B_CONTROL_SAME 1- ?- l6 j2 Q2 O #define VS1003B_CONTROL_PORT GPIOB /* it indicate that all above signal are in the same port*/ ( G( O( _6 l8 \: C /*******************************/ #define VS1003B_DREQ GPIO_Pin_5 #define VS1003B_DREQ_PORT GPIOC0 s6 j# K' w8 n( C) S/ G ( d% Y6 O; K# D0 F( n7 _" |& y /*******************************/ 9 ^9 `4 ]" K4 O. b- d5 e #define VS1003B_SCK GPIO_Pin_5 #define VS1003B_SCK_PORT GPIOA #define VS1003B_MISO GPIO_Pin_6 #define VS1003B_MISO_PORT GPIOA8 s0 H8 |, Y& s #define VS1003B_MOSI GPIO_Pin_7 #define VS1003B_MOSI_PORT GPIOA #define VS1003B_SPI_SAME 1 /* it indicate that all SPI signal are in the same port*/ #define VS1003B_SPI_PORTS GPIOA6 |) @3 A$ N) G- j1 ]9 ^# C #define VS1003B_GPIO_PORTS RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC 6 C3 h! v9 p8 |+ n' \* g /********************************************************************************/+ u) G* J/ f( [+ f* I, W * G, c( |, C! r7 R 3310 LCD的,虽然我目前没有接LCD,但是之前有,应该是可以工作的: #define HW_SPI 1 /******************* Hardware pins definition **********************/" r3 Q! i' D- A9 r0 ^! w /* pins of the signal */( M! q3 k, M, \- ^ #define LCD_RS GPIO_Pin_3 #define LCD_RS_PORT GPIOE/ P8 w8 m- } z7 \, U- W8 M * M r4 x- l+ }& t+ s #define LCD_E GPIO_Pin_4, ?6 R9 X2 I' V* {# J5 U" M) X #define LCD_E_PORT GPIOE #define LCD_RST GPIO_Pin_5 #define LCD_RST_PORT GPIOE 3 v5 L5 R; H$ G2 \$ a% @$ l #define LCD_CONTROL_SAME 1 /* it indicate that all Control signal are in the same port*/6 Y Q' d3 h, Y3 v #define LCD_CONTROL_PORT GPIOE8 g( X ~) }. B) K$ N; r. x& m /******************************/ #define LCD_SCK GPIO_Pin_5 #define LCD_SCK_PORT GPIOA 0 L9 t; i; k+ ]$ q! q #define LCD_MISO GPIO_Pin_67 B* l6 {8 p" Z; a5 g, s# W( C5 R #define LCD_MISO_PORT GPIOA) e9 I _/ ?7 R, H( b' Z #define LCD_MOSI GPIO_Pin_7 #define LCD_MOSI_PORT GPIOA #define LCD_SPI_SAME 1 /* it indicate that all SPI signal are in the same port*/ #define LCD_SPI_PORT GPIOA /*****************************/ #define LCD_GPIO_PORTS RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE" d! M- [6 D$ R! L1 G! B# w" _ 按键:(使用豆皮上的三个,另一个跳线过来的,总数不够,用的时候得跳)0 ^0 o+ E v0 J- D# P+ e# C #define MODE GPIO_Pin_8 #define STOP GPIO_Pin_7" [! U% {+ `- ]1 e, v #define NEXT GPIO_Pin_62 R) ?$ a1 W8 Y/ P5 c1 g #define UP GPIO_Pin_9- ?: G2 v9 }. Z) r' _+ V #define DOWN GPIO_Pin_10# ]9 i; i2 G( Q$ F% c! Z+ ~ #define PREV GPIO_Pin_11 2 u# E" D, L" u2 T2 y- `0 a #define KEYS_PORT GPIOC) W2 x! A3 k" L/ o3 l# `- {! J 9 ?; Y: y9 J* @ 这个程序编译在src/codesourcery下编译,敲make就可以了,最后生成bin文件。 用烧写软件烧进去就可以工作了。 这个软件即使没有VS1003模块,也可以测试SD卡(虽然不能播放),还有板子上LED5会闪烁。 板子会从串口1输出信息。' T0 v l! z9 i6 Q ' p. Y$ F' a# x5 k WORM_LED:这个是littleworm写的豆皮的跑马灯程序。由于GNU的优化搞得鬼, 需要在里面的delay函数作一处改动asm("nop")。也仅此一处改动。 所以应该说其它平台下的程序几乎不需要改动就可以在这个模板上运行了。 |
微信公众号
手机版
回复:推荐个GNU编译器:Codesourcery (内附工程模板和例子)
RE:推荐个GNU编译器:Codesourcery (内附工程模板和例子)
回复:推荐个GNU编译器:Codesourcery (内附工程模板和例子)
想看
回复:推荐个GNU编译器:Codesourcery (内附工程模板和例子)
回复:推荐个GNU编译器:Codesourcery (内附工程模板和例子)
RE:推荐个GNU编译器:Codesourcery (内附工程模板和例子)
回复:推荐个GNU编译器:Codesourcery (内附工程模板和例子)
回复:推荐个GNU编译器:Codesourcery (内附工程模板和例子)
RE:推荐个GNU编译器:Codesourcery (内附工程模板和例子)