硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3232|回复: 0
收起左侧

发一个V6板子使用C标准库,不使用微库的裸机例子

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2018-2-20 10:48:48 | 显示全部楼层 |阅读模式
例子下载,仅做了MDK,未做IAR:
V6-101_按键检测和LED控制例程(使用C标准库.7z (3.04 MB, 下载次数: 163)



移植说明,简单三步即可。
1. 关闭微库
QQ截图20180220111343.png

2. 添加Retarget.c重定向文件,MDK安装目录也有这么一个文件,不过跟MDK本身的中间件有耦合(当前,修改下也是可以的)。所以直接使用SEGGER提供的,简单省事些。
QQ截图20180220112253.png
添加这个文件是因为,如果用户不使用微库的话,会开启半主模式:
QQ截图20180220112009.png

所以在这个重定向文件里面主要是实现以下几个函数,仅写上即可,什么都不用实现。当然,如果要做MDK支持的文件操作,即使用RL-FlashFS,它的API就是C标准库的形式,需要做具体实现代码。
QQ截图20180220112339.png


3. 做个fpuc和fgetc的重定向
我们这里是放在bsp_uart_fifo.c文件里面。这里不限制使用fputc和fgetc做重定向,也可以不做重定向,实现第2步中的函数_sys_write和_sys_read也是可以的。
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: fputc
  4. *        功能说明: 重定义putc函数,这样可以使用printf函数从串口1打印输出
  5. *        形    参: 无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. int fputc(int ch, FILE *f)
  10. {
  11. #if 1        /* 将需要printf的字符通过串口中断FIFO发送出去,printf函数会立即返回 */
  12.         comSendChar(COM1, ch);

  13.         return ch;
  14. #else        /* 采用阻塞方式发送每个字符,等待数据发送完毕 */
  15.         /* 写一个字节到USART1 */
  16.         USART_SendData(USART1, (uint8_t) ch);

  17.         /* 等待发送结束 */
  18.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  19.         {}

  20.         return ch;
  21. #endif
  22. }

  23. /*
  24. *********************************************************************************************************
  25. *        函 数 名: fgetc
  26. *        功能说明: 重定义getc函数,这样可以使用getchar函数从串口1输入数据
  27. *        形    参: 无
  28. *        返 回 值: 无
  29. *********************************************************************************************************
  30. */
  31. int fgetc(FILE *f)
  32. {

  33. #if 1        /* 从串口接收FIFO中取1个数据, 只有取到数据才返回 */
  34.         uint8_t ucData;

  35.         while(comGetChar(COM1, &ucData) == 0);

  36.         return ucData;
  37. #else
  38.         /* 等待串口1输入数据 */
  39.         while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

  40.         return (int)USART_ReceiveData(USART1);
  41. #endif
  42. }
复制代码



通过上面三步就可以实现使用C标准库了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 21:02 , Processed in 0.052074 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表