硬件:JZ2440

实现功能:用putchr()函数实现printf()

start.s

nand.c

uart.c

uart.h

my_stdio.c

my_stdio.h

main.c

start.s源码:

  1. .extern main
  2. .text
  3. .global _start
  4. _start:
  5. ldr sp,=
  6. bl watchdog_init
  7. bl clock_init
  8. bl nand_init
  9. bl sdram_init
  10.  
  11. ldr r0,=0x30000000
  12. mov r1,#
  13. mov r2,#(*)
  14. bl nand_read
  15.  
  16. ldr sp,=0x34000000
  17. ldr lr,=main_return
  18. ldr pc,=main
  19. main_return:
  20. b main_return

init.c

  1. //watchdog
  2. #define WTCON (*(volatile unsigned long *)0x53000000)
  3.  
  4. //clock
  5. #define LOCKTIME (*(volatile unsigned long *)0x4c000000)
  6. #define MPLLCON (*(volatile unsigned long *)0x4c000004)
  7. #define CLKDIVN (*(volatile unsigned long *)0x4c000014)
  8.  
  9. //sdram
  10. #define BWSCON (*(volatile unsigned long *)0x48000000)
  11. #define BANKCON0 (*(volatile unsigned long *)0x48000004)
  12. #define BANKCON1 (*(volatile unsigned long *)0x48000008)
  13. #define BANKCON2 (*(volatile unsigned long *)0x4800000c)
  14. #define BANKCON3 (*(volatile unsigned long *)0x48000010)
  15. #define BANKCON4 (*(volatile unsigned long *)0x48000014)
  16. #define BANKCON5 (*(volatile unsigned long *)0x48000018)
  17. #define BANKCON6 (*(volatile unsigned long *)0x4800001c)
  18. #define BANKCON7 (*(volatile unsigned long *)0x48000020)
  19. #define REFRESH (*(volatile unsigned long *)0x48000024)
  20. #define BANKSIZE (*(volatile unsigned long *)0x48000028)
  21. #define MRSRB6 (*(volatile unsigned long *)0x4800002c)
  22. #define MRSRB7 (*(volatile unsigned long *)0x48000030)
  23.  
  24. void watchdog_init(void)
  25. {
  26. WTCON=;
  27. }
  28.  
  29. void clock_init(void)
  30. {
  31. CLKDIVN=0x03;
  32. __asm__
  33. (
  34. "mrc p15,0,r1,c1,c0,0\n"
  35. "orr r1,r1,#0xc0000000\n"
  36. "mcr p15,0,r1,c1,c0,0\n"
  37. );
  38. MPLLCON=((0x5c<<)|(0x01<<)|(0x02));
  39. }
  40.  
  41. void sdram_init(void)
  42. {
  43. volatile unsigned long *sdram_base=(volatile unsigned long *)0x48000000;
  44. sdram_base[] = 0x22011110;
  45. sdram_base[] = 0x00000700;
  46. sdram_base[] = 0x00000700;
  47. sdram_base[] = 0x00000700;
  48. sdram_base[] = 0x00000700;
  49. sdram_base[] = 0x00000700;
  50. sdram_base[] = 0x00000700;
  51. sdram_base[] = 0x00018005;
  52. sdram_base[] = 0x00018005;
  53. sdram_base[] = 0x008C04F4;
  54. sdram_base[] = 0x000000B1;
  55. sdram_base[] = 0x00000030;
  56. sdram_base[] = 0x00000030;
  57.  
  58. }

nand.c

  1. #define LARGER_NAND_PAGE
  2.  
  3. #define GSTATUS1 (*(volatile unsigned int *)0x560000B0)
  4. #define BUSY 1
  5.  
  6. #define NAND_SECTOR_SIZE 512
  7. #define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
  8.  
  9. #define NAND_SECTOR_SIZE_LP 2048
  10. #define NAND_BLOCK_MASK_LP (NAND_SECTOR_SIZE_LP - 1)
  11.  
  12. typedef unsigned int S3C24X0_REG32;
  13.  
  14. /* NAND FLASH (see S3C2410 manual chapter 6) */
  15. typedef struct {
  16. S3C24X0_REG32 NFCONF;
  17. S3C24X0_REG32 NFCMD;
  18. S3C24X0_REG32 NFADDR;
  19. S3C24X0_REG32 NFDATA;
  20. S3C24X0_REG32 NFSTAT;
  21. S3C24X0_REG32 NFECC;
  22. } S3C2410_NAND;
  23.  
  24. /* NAND FLASH (see S3C2440 manual chapter 6, www.100ask.net) */
  25. typedef struct {
  26. S3C24X0_REG32 NFCONF;
  27. S3C24X0_REG32 NFCONT;
  28. S3C24X0_REG32 NFCMD;
  29. S3C24X0_REG32 NFADDR;
  30. S3C24X0_REG32 NFDATA;
  31. S3C24X0_REG32 NFMECCD0;
  32. S3C24X0_REG32 NFMECCD1;
  33. S3C24X0_REG32 NFSECCD;
  34. S3C24X0_REG32 NFSTAT;
  35. S3C24X0_REG32 NFESTAT0;
  36. S3C24X0_REG32 NFESTAT1;
  37. S3C24X0_REG32 NFMECC0;
  38. S3C24X0_REG32 NFMECC1;
  39. S3C24X0_REG32 NFSECC;
  40. S3C24X0_REG32 NFSBLK;
  41. S3C24X0_REG32 NFEBLK;
  42. } S3C2440_NAND;
  43.  
  44. typedef struct {
  45. void (*nand_reset)(void);
  46. void (*wait_idle)(void);
  47. void (*nand_select_chip)(void);
  48. void (*nand_deselect_chip)(void);
  49. void (*write_cmd)(int cmd);
  50. void (*write_addr)(unsigned int addr);
  51. unsigned char (*read_data)(void);
  52. }t_nand_chip;
  53.  
  54. static S3C2410_NAND * s3c2410nand = (S3C2410_NAND *)0x4e000000;
  55. static S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000;
  56.  
  57. static t_nand_chip nand_chip;
  58.  
  59. /* 供外部调用的函数 */
  60. void nand_init(void);
  61. void nand_read(unsigned char *buf, unsigned long start_addr, int size);
  62.  
  63. /* NAND Flash操作的总入口, 它们将调用S3C2410或S3C2440的相应函数 */
  64. static void nand_reset(void);
  65. static void wait_idle(void);
  66. static void nand_select_chip(void);
  67. static void nand_deselect_chip(void);
  68. static void write_cmd(int cmd);
  69. static void write_addr(unsigned int addr);
  70. static unsigned char read_data(void);
  71.  
  72. /* S3C2410的NAND Flash处理函数 */
  73. static void s3c2410_nand_reset(void);
  74. static void s3c2410_wait_idle(void);
  75. static void s3c2410_nand_select_chip(void);
  76. static void s3c2410_nand_deselect_chip(void);
  77. static void s3c2410_write_cmd(int cmd);
  78. static void s3c2410_write_addr(unsigned int addr);
  79. static unsigned char s3c2410_read_data();
  80.  
  81. /* S3C2440的NAND Flash处理函数 */
  82. static void s3c2440_nand_reset(void);
  83. static void s3c2440_wait_idle(void);
  84. static void s3c2440_nand_select_chip(void);
  85. static void s3c2440_nand_deselect_chip(void);
  86. static void s3c2440_write_cmd(int cmd);
  87. static void s3c2440_write_addr(unsigned int addr);
  88. static unsigned char s3c2440_read_data(void);
  89.  
  90. /* S3C2410的NAND Flash操作函数 */
  91.  
  92. /* 复位 */
  93. static void s3c2410_nand_reset(void)
  94. {
  95. s3c2410_nand_select_chip();
  96. s3c2410_write_cmd(0xff); // 复位命令
  97. s3c2410_wait_idle();
  98. s3c2410_nand_deselect_chip();
  99. }
  100.  
  101. /* 等待NAND Flash就绪 */
  102. static void s3c2410_wait_idle(void)
  103. {
  104. int i;
  105. volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand->NFSTAT;
  106. while(!(*p & BUSY))
  107. for(i=; i<; i++);
  108. }
  109.  
  110. /* 发出片选信号 */
  111. static void s3c2410_nand_select_chip(void)
  112. {
  113. int i;
  114. s3c2410nand->NFCONF &= ~(<<);
  115. for(i=; i<; i++);
  116. }
  117.  
  118. /* 取消片选信号 */
  119. static void s3c2410_nand_deselect_chip(void)
  120. {
  121. s3c2410nand->NFCONF |= (<<);
  122. }
  123.  
  124. /* 发出命令 */
  125. static void s3c2410_write_cmd(int cmd)
  126. {
  127. volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand->NFCMD;
  128. *p = cmd;
  129. }
  130.  
  131. /* 发出地址 */
  132. static void s3c2410_write_addr(unsigned int addr)
  133. {
  134. int i;
  135. volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand->NFADDR;
  136.  
  137. *p = addr & 0xff;
  138. for(i=; i<; i++);
  139. *p = (addr >> ) & 0xff;
  140. for(i=; i<; i++);
  141. *p = (addr >> ) & 0xff;
  142. for(i=; i<; i++);
  143. *p = (addr >> ) & 0xff;
  144. for(i=; i<; i++);
  145. }
  146.  
  147. /* 读取数据 */
  148. static unsigned char s3c2410_read_data(void)
  149. {
  150. volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand->NFDATA;
  151. return *p;
  152. }
  153.  
  154. /* S3C2440的NAND Flash操作函数 */
  155.  
  156. /* 复位 */
  157. static void s3c2440_nand_reset(void)
  158. {
  159. s3c2440_nand_select_chip();
  160. s3c2440_write_cmd(0xff); // 复位命令
  161. s3c2440_wait_idle();
  162. s3c2440_nand_deselect_chip();
  163. }
  164.  
  165. /* 等待NAND Flash就绪 */
  166. static void s3c2440_wait_idle(void)
  167. {
  168. int i;
  169. volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFSTAT;
  170. while(!(*p & BUSY))
  171. for(i=; i<; i++);
  172. }
  173.  
  174. /* 发出片选信号 */
  175. static void s3c2440_nand_select_chip(void)
  176. {
  177. int i;
  178. s3c2440nand->NFCONT &= ~(<<);
  179. for(i=; i<; i++);
  180. }
  181.  
  182. /* 取消片选信号 */
  183. static void s3c2440_nand_deselect_chip(void)
  184. {
  185. s3c2440nand->NFCONT |= (<<);
  186. }
  187.  
  188. /* 发出命令 */
  189. static void s3c2440_write_cmd(int cmd)
  190. {
  191. volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFCMD;
  192. *p = cmd;
  193. }
  194.  
  195. /* 发出地址 */
  196. static void s3c2440_write_addr(unsigned int addr)
  197. {
  198. int i;
  199. volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;
  200.  
  201. *p = addr & 0xff;
  202. for(i=; i<; i++);
  203. *p = (addr >> ) & 0xff;
  204. for(i=; i<; i++);
  205. *p = (addr >> ) & 0xff;
  206. for(i=; i<; i++);
  207. *p = (addr >> ) & 0xff;
  208. for(i=; i<; i++);
  209. }
  210.  
  211. static void s3c2440_write_addr_lp(unsigned int addr)
  212. {
  213. int i;
  214. volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;
  215. int col, page;
  216.  
  217. col = addr & NAND_BLOCK_MASK_LP;
  218. page = addr / NAND_SECTOR_SIZE_LP;
  219.  
  220. *p = col & 0xff; /* Column Address A0~A7 */
  221. for(i=; i<; i++);
  222. *p = (col >> ) & 0x0f; /* Column Address A8~A11 */
  223. for(i=; i<; i++);
  224. *p = page & 0xff; /* Row Address A12~A19 */
  225. for(i=; i<; i++);
  226. *p = (page >> ) & 0xff; /* Row Address A20~A27 */
  227. for(i=; i<; i++);
  228. *p = (page >> ) & 0x03; /* Row Address A28~A29 */
  229. for(i=; i<; i++);
  230. }
  231.  
  232. /* 读取数据 */
  233. static unsigned char s3c2440_read_data(void)
  234. {
  235. volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFDATA;
  236. return *p;
  237. }
  238.  
  239. /* 在第一次使用NAND Flash前,复位一下NAND Flash */
  240. static void nand_reset(void)
  241. {
  242. nand_chip.nand_reset();
  243. }
  244.  
  245. static void wait_idle(void)
  246. {
  247. nand_chip.wait_idle();
  248. }
  249.  
  250. static void nand_select_chip(void)
  251. {
  252. int i;
  253. nand_chip.nand_select_chip();
  254. for(i=; i<; i++);
  255. }
  256.  
  257. static void nand_deselect_chip(void)
  258. {
  259. nand_chip.nand_deselect_chip();
  260. }
  261.  
  262. static void write_cmd(int cmd)
  263. {
  264. nand_chip.write_cmd(cmd);
  265. }
  266. static void write_addr(unsigned int addr)
  267. {
  268. nand_chip.write_addr(addr);
  269. }
  270.  
  271. static unsigned char read_data(void)
  272. {
  273. return nand_chip.read_data();
  274. }
  275.  
  276. /* 初始化NAND Flash */
  277. void nand_init(void)
  278. {
  279. #define TACLS 0
  280. #define TWRPH0 3
  281. #define TWRPH1 0
  282.  
  283. /* 判断是S3C2410还是S3C2440 */
  284. if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
  285. {
  286. nand_chip.nand_reset = s3c2410_nand_reset;
  287. nand_chip.wait_idle = s3c2410_wait_idle;
  288. nand_chip.nand_select_chip = s3c2410_nand_select_chip;
  289. nand_chip.nand_deselect_chip = s3c2410_nand_deselect_chip;
  290. nand_chip.write_cmd = s3c2410_write_cmd;
  291. nand_chip.write_addr = s3c2410_write_addr;
  292. nand_chip.read_data = s3c2410_read_data;
  293.  
  294. /* 使能NAND Flash控制器, 初始化ECC, 禁止片选, 设置时序 */
  295. s3c2410nand->NFCONF = (<<)|(<<)|(<<)|(TACLS<<)|(TWRPH0<<)|(TWRPH1<<);
  296. }
  297. else
  298. {
  299. nand_chip.nand_reset = s3c2440_nand_reset;
  300. nand_chip.wait_idle = s3c2440_wait_idle;
  301. nand_chip.nand_select_chip = s3c2440_nand_select_chip;
  302. nand_chip.nand_deselect_chip = s3c2440_nand_deselect_chip;
  303. nand_chip.write_cmd = s3c2440_write_cmd;
  304. #ifdef LARGER_NAND_PAGE
  305. nand_chip.write_addr = s3c2440_write_addr_lp;
  306. #else
  307. nand_chip.write_addr = s3c2440_write_addr;
  308. #endif
  309. nand_chip.read_data = s3c2440_read_data;
  310.  
  311. /* 设置时序 */
  312. s3c2440nand->NFCONF = (TACLS<<)|(TWRPH0<<)|(TWRPH1<<);
  313. /* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */
  314. s3c2440nand->NFCONT = (<<)|(<<)|(<<);
  315. }
  316.  
  317. /* 复位NAND Flash */
  318. nand_reset();
  319. }
  320.  
  321. /* 读函数 */
  322. void nand_read(unsigned char *buf, unsigned long start_addr, int size)
  323. {
  324. int i, j;
  325.  
  326. #ifdef LARGER_NAND_PAGE
  327. if ((start_addr & NAND_BLOCK_MASK_LP) || (size & NAND_BLOCK_MASK_LP)) {
  328. return ; /* 地址或长度不对齐 */
  329. }
  330. #else
  331. if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
  332. return ; /* 地址或长度不对齐 */
  333. }
  334. #endif
  335.  
  336. /* 选中芯片 */
  337. nand_select_chip();
  338.  
  339. for(i=start_addr; i < (start_addr + size);) {
  340. /* 发出READ0命令 */
  341. write_cmd();
  342.  
  343. /* Write Address */
  344. write_addr(i);
  345. #ifdef LARGER_NAND_PAGE
  346. write_cmd(0x30);
  347. #endif
  348. wait_idle();
  349.  
  350. #ifdef LARGER_NAND_PAGE
  351. for(j=; j < NAND_SECTOR_SIZE_LP; j++, i++) {
  352. #else
  353. for(j=; j < NAND_SECTOR_SIZE; j++, i++) {
  354. #endif
  355. *buf = read_data();
  356. buf++;
  357. }
  358. }
  359.  
  360. /* 取消片选信号 */
  361. nand_deselect_chip();
  362.  
  363. return ;
  364. }

uart.c 源码:

  1. #include"uart.h"
  2.  
  3. //uart
  4. #define ULCON0 (*(volatile unsigned long *)0x50000000)
  5. #define UCON0 (*(volatile unsigned long *)0x50000004)
  6. #define UFCON0 (*(volatile unsigned long *)0x50000008)
  7. #define UMCON0 (*(volatile unsigned long *)0x5000000c)
  8. #define UTRSTAT0 (*(volatile unsigned long *)0x50000010)
  9. #define UERSTAT0 (*(volatile unsigned long *)0x50000014)
  10. #define UTXH0 (*(volatile unsigned char *)0x50000020)
  11. #define URXH0 (*(volatile unsigned char *)0x50000024)
  12. #define UBRDIV0 (*(volatile unsigned long *)0x50000028)
  13.  
  14. //GPH
  15. #define GPHCON (*(volatile unsigned long *)0x56000070)
  16. #define GPHDAT (*(volatile unsigned long *)0x56000074)
  17. #define GPHUP (*(volatile unsigned long *)0x56000078)
  18.  
  19. void uart0_init(void)
  20. {
  21. GPHCON|=0xa0;
  22. GPHUP=0x0c;
  23.  
  24. ULCON0=0x03;
  25. UCON0=0x05;
  26. UFCON0=0x00;
  27. UMCON0=0x00;
  28. UBRDIV0=((/(*))-);
  29. }
  30.  
  31. unsigned char my_getchar(void)
  32. {
  33. while(!(UTRSTAT0 & 0x01));
  34. return URXH0;
  35. }
  36.  
  37. void my_putchar(unsigned char date)
  38. {
  39. while(!(UTRSTAT0 & 0x02));
  40. UTXH0=date;
  41. }
  42.  
  43. unsigned char getc(void)
  44. {
  45. while(!(UTRSTAT0 & 0x01));
  46. return URXH0;
  47. }
  48.  
  49. void putc(unsigned char c)
  50. {
  51. while(!(UTRSTAT0 & 0x02));
  52. UTXH0=c;
  53. }

uart.h 源码:

  1. #ifndef _UART_H_
  2. #define _UART_H_
  3.  
  4. void uart0_init(void);
  5. unsigned char my_getchar(void);
  6. void my_putchar(unsigned char date);
  7.  
  8. unsigned char getc(void);
  9. void putc(unsigned char c);
  10.  
  11. #endif

my_stdio.c 源码:

  1. #include"uart.h"
  2. #include"my_stdio.h"
  3.  
  4. typedef char* va_list;
  5.  
  6. #define int_sizeof(type) ((sizeof(int)+sizeof(type)-1)&~(sizeof(int)-1))
  7.  
  8. #define va_start(para_p,first_para) (para_p=(va_list)&first_para+int_sizeof(first_para))
  9. #define va_arg(para_p,type) (*(type *)((para_p+=int_sizeof(type))-int_sizeof(type)))
  10. #define va_end(para_p) (para_p=(va_list)0)
  11.  
  12. void my_printf(const char *format, ...)
  13. {
  14. va_list temp ;
  15. char *string = format;
  16. va_start(temp, format);
  17.  
  18. while (*string)
  19. {
  20. if (*string == '%')
  21. {
  22. switch (*++string)
  23. {
  24. case 'c': { my_putchar(va_arg(temp,char)); break; }
  25. case 's':
  26. {
  27. char* p = va_arg(temp,char*);
  28. while (*p != ) my_putchar(*p++);
  29. break;
  30. }
  31.  
  32. case 'p':
  33. {
  34. unsigned int addr = (unsigned int)&va_arg(temp, unsigned int), sheft = 0xf0000000;
  35. unsigned char temp = ,count=;
  36. my_putchar('');
  37. my_putchar('x');
  38. while (count<)
  39. {
  40. temp = (unsigned char)(((sheft >> count)&addr) >> ( - count - )) ;
  41. if (temp < ) my_putchar(temp + );
  42. if (temp >= ) my_putchar(temp+-);
  43. count += ;
  44. }
  45. break;
  46. }
  47.  
  48. case 'd':
  49. {
  50. int value = va_arg(temp, int),num=;
  51. if (value == ) my_putchar();
  52. if (value & 0x80000000) //负数
  53. {
  54. my_putchar('-');
  55. num = -;
  56. }
  57. else //正数.;
  58. while (!(value / num))
  59. {
  60. num /= ;
  61. if (num == )
  62. {
  63. my_putchar();
  64. return;
  65. }
  66. }
  67. while (num != )
  68. {
  69. my_putchar(value / num+);
  70. value %= num;
  71. num /= ;
  72. }
  73. break;
  74. }
  75.  
  76. case 'f':
  77. {
  78. char *str = "Sorry: function is not available";
  79. while (*str != ) my_putchar(*str++);
  80. }
  81.  
  82. default: break;
  83. }
  84. }
  85. string++;
  86. }
  87. va_end(temp);
  88. }

my_stdio.h 源码:

  1. #ifndef _OWN_STDIO_H_
  2. #define _OWN_STDIO_H_
  3.  
  4. void my_printf(const char *format,...);
  5.  
  6. #endif

main.c 源码:

  1. #include"uart.h"
  2. #include"my_stdio.h"
  3. #include"stdio.h"
  4.  
  5. void raise(int sig_nr){;}
  6.  
  7. int main(void)
  8. {
  9. uart0_init();
  10.  
  11. printf("%s"," wds_standard ");
  12. my_printf("%s"," zsy_standard ");
  13.  
  14. while()
  15. my_putchar(my_getchar()+);
  16.  
  17. return ;
  18. }

链接脚本 uart.lds :

  1. SECTIONS
  2. {
  3. . = 0x00000000;
  4. .init : AT(){start.o init.o nand.o}
  5. . = 0x30000000;
  6. .text : AT(){*(.text)}
  7. .rodata ALIGN() : AT((LOADADDR(.text)+SIZEOF(.text)+)&~(0x03)) {*(.rodata*)}
  8. .data ALIGN() : AT((LOADADDR(.rodata)+SIZEOF(.rodata)+)&~(0x03)) {*(.data)}
  9. .bss : {*(.bss) *(COMMON)}
  10.  
  11. }

Makefile:

  1. objs:= start.o init.o uart.o nand.o main.o my_stdio.o lib/libc.a
  2.  
  3. CC =arm-linux-gcc
  4. LD =arm-linux-ld
  5. AR =arm-linux-ar
  6. OBJCOPY =arm-linux-objcopy
  7. OBJDUMP =arm-linux-objdump
  8.  
  9. INCLUDEDIR :=$(shell pwd)/include
  10. CFLAGS :=-Wall -O2
  11. CPPFLAGS :=-nostdinc -I$(INCLUDEDIR)
  12.  
  13. export CC LD OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS
  14.  
  15. uart.bin:$(objs)
  16. arm-linux-ld -Tuart.lds -o uart_elf $^ libgcc.a
  17. arm-linux-objcopy -O binary -S uart_elf $@
  18. arm-linux-objdump -D -m arm uart_elf > uart.dis
  19.  
  20. .PHONY:lib/libc.a
  21. lib/libc.a:
  22. cd lib;make;cd ..
  23.  
  24. %.o:%.s
  25. $(CC) $(CPPFLAGS) $(FLAGS)-o $@ -c $<
  26.  
  27. %.o:%.c
  28. $(CC) $(CPPFLAGS) $(FLAGS) -o $@ -c $<
  29.  
  30. clean:
  31. make clean -C lib
  32. rm -f *.o *.bin *.dis uart_elf

用uart实现printf函数的更多相关文章

  1. 可变参数列表与printf()函数的实现

    问题 当我们刚开始学习C语言的时候,就接触到printf()函数,可是当时"道行"不深或许不够细心留意,又或者我们理所当然地认为库函数规定这样就是这样,没有发现这个函数与普通的函数 ...

  2. 如何在单片机上使用printf函数(printf)(avr)(stm)(lpc)(单片机)(转)

    摘要:    当我们在调试代码时,通常需要将程序中的某个变量打印至PC机上,来判断我们的程序是否按预期的运行,printf函数很好的做到了这一点,它能直接以字符的方式输出变量名和变量的值,printf ...

  3. 如果简化stm32中printf函数的使用——首先重定向

    STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印.(HAL库例程)https://blog.csdn.net/wu10188/article/details/9 ...

  4. 通过串口利用printf函数输出数据

    一.printf函数格式 printf函数具有强大的输出功能 %表示格式化字符串输出 目前printf支持以下格式的输出,例如: printf("%c",a);输出单个字符. pr ...

  5. printf函数

    printf函数的格式及含义 d                    以十进制带符号的形式输出整数(对正数不输出符号) o                    以八进制无符号的形式输出整数(不输出 ...

  6. Linux Linux下特殊的printf函数和fputs函数

    Linux下,printf函数必须以'\n'结尾才会立刻输出到屏幕,如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),如果需要不换行的输出,一般可以使用write函数代替.'\n ...

  7. 关于printf函数的所思所想

    缘起大一下学期,C语言程序设计徐小青老师的随口一提,经娄嘉鹏老师提醒,我觉得应该自己整理清楚这一问题.涉及网上资料将会标明出处. 关于printf函数的所思所想 * printf的定义 printf( ...

  8. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  9. 关于printf函数输出先后顺序的讲解!!

    对于printf函数printf("%d%d\n",a,b);函数的实际输出顺序是这样的先计算出b,然后在计算a,接着输出a,最后在输出b:例子如下:#include<ios ...

随机推荐

  1. Sphinx 2.2.11-release reference manual

    1. Introduction 1.1. About 1.2. Sphinx features 1.3. Where to get Sphinx 1.4. License 1.5. Credits 1 ...

  2. Virtualbox的centos7 nat和桥接网络配置

    在实际配置虚拟机的过程中,网络配置时候一个很繁琐的过程,经常一个点没注意到,就访问不了了.在此,做一个简单的教程以供后续使用时可以参考! 方法一: 使用NAT网络 1. 选择网卡 安装centos7的 ...

  3. Xcode6: CocoaPods 错误 target overrides the `OTHER_LDFLAGS`...

    CocoaPods 错误 target overrides the `OTHER_LDFLAGS`... Xcode 升级到 6.0 后,更新 CocoaPods,出现了如下的警告 [!] The ` ...

  4. [PHP] 07 - Json, XML and MySQL

    前言 [Node.js] 09 - Connect with Database 菜鸟JSON教程[内容不多] PHPSimpleXML[大概了解下即可] SQL语句需要复习一遍:http://www. ...

  5. asp.net mvc 3.0 知识点整理 ----- (4).asp.net mvc 3 和asp.net mvc 4 对比

    asp.net mvc的版本更新很快,每个版本都在前一个版本的基础上,进行性能的优化和功能的完善和提升. 以下,便是我对比了下两个版本,发现最基本的差异.(更新补充中..) 一.关于配置类Global ...

  6. 51 IP核查询

    康芯的IP核 Oregano systems 公司的MC8051 IP CoreSynthesizeable VHDL Microcontroller IP-Core User Guide这个里面51 ...

  7. 构建工具:grunt、Glup、webpack

    相关代码已上传至github 怎么是项目构建? 编译项目中的js, sass, less: 合并js/css等资源文件: 压缩js/css/html等资源文件: JS语法的检查. 构建工具的作用? 简 ...

  8. js的微任务和宏任务

    1.机制如下: 注意一点: 宏任务需要多次事件循环才能执行完,微任务是一次性执行完的: 2.宏任务macrotask: (事件队列中的每一个事件都是一个macrotask) 优先级:主代码块 > ...

  9. 保证Activity启动时每次都调用create

    原文:https://stackoverflow.com/questions/41766547/run-oncreate-every-time-android-app-is-opened If you ...

  10. Apache Maven 打包可执行jar

    在本文的 参考资料 部分,您将发现大量介绍 Maven 的入门教程.本文的 5 个技巧目的是帮助您解决即将出现的一些问题:使用 Maven 管理您的应用程序的生命周期时,将会出现的编程场景. 1. 可 ...