找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3457|回复: 0
打印 上一主题 下一主题
收起左侧

GD32F307开发板串行通讯功能测试

[复制链接]
跳转到指定楼层
楼主
在官网的例程提供了一个串口通信功能的例程,但比较奇葩的是其在硬件方面的设计,由于板上已丝印了GD-Link的提示,故在使用时不会产生歧异;在供电方面,也在切换开关作为标注“DC”和“Link”。然,其虚拟串口的使用就怪异了,居然竟不能使用虚拟串口端的USB来供电,也不能借用GD-Link来形成虚拟串口。其结果就是完成一个简单的串口通信测试却要同时使用2条USB线,见图1所示。
在不了解这些之前,是怎么也鼓捣不出虚拟串口的!

图1 串口通信测试连接
在鼓捣出虚拟串口后,测试就比较简单了。将程序编译下载后,即可见到图2所示的内容,即每按一下USER用户键,LED1就亮一下,与此同时通过串口也会输出一个“USART printf example”。
file:///C:/Users/fengqili/AppData/Local/Temp/msohtmlclip1/01/clip_image003.gif       
图2  串口输出内容
那么其程序是如何设计的呢?
实现要点亮LED1,就需要对其定义和初始化,其初始化函数为:
  1. void led_init(void)
  2. {
  3.     gd_eval_led_init(LED1);
  4. }
复制代码

而使LED1闪烁的函数则如下:
  1. void led_flash(int times)
  2. {
  3.     int i;
  4.     for(i=0; i<times; i++)
  5.     {
  6. /* delay 400 ms */
  7. delay_1ms(400);
  8. /* turn on LEDs */
  9. gd_eval_led_on(LED1);
  10. /* delay 400 ms */
  11. delay_1ms(400);
  12. /* turn off LEDs */
  13. gd_eval_led_off(LED1);
  14. }
  15. }
复制代码
也就是说,每隔400毫秒就切换一次状态。
对于串行通讯来讲,则涉及到收与发,在发送时所使用的是经重新定向的printf语句,而接收则是通过fputc函数,其内容如下:
  1. int fputc(int ch, FILE *f)
  2. {
  3. usart_data_transmit(EVAL_COM1, (uint8_t)ch);
  4. while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TBE));
  5. return ch;
  6. }
复制代码

最后再看一下主程序,功能不多但程序却写的很臃肿,其内容如下:
  1. int main(void)
  2. {
  3. /* initialize the LEDs */
  4. led_init();
  5. /* configure systick */
  6. systick_config();
  7. /* flash the LEDs for 1 time */
  8. led_flash(1);
  9. /* configure EVAL_COM1 */
  10. gd_eval_com_init(EVAL_COM1);
  11. /* configure TAMPER key */
  12. gd_eval_key_init(KEY_WAKEUP, KEY_MODE_GPIO);
  13. /* output a message on hyperterminal using printf function */
  14. printf("\r\n USART printf example: please press the User key \r\n");
  15. /* wait for completion of USART transmission */
  16. while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TC)){
  17. }
  18. while(1)
  19. {
  20. /* check if the user key is pressed */
  21. if(RESET == gd_eval_key_state_get(KEY_WAKEUP))
  22. {
  23. delay_1ms(50);
  24. if(RESET == gd_eval_key_state_get(KEY_WAKEUP))
  25. {
  26. delay_1ms(50);
  27. if(RESET == gd_eval_key_state_get(KEY_WAKEUP))
  28. {
  29. /* turn on LED1 */
  30. gd_eval_led_on(LED1);
  31. /* output a message on hyperterminal using printf function */
  32. printf("\r\n USART printf example \r\n");
  33. /* wait for completion of USART transmission */
  34. while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TC)){
  35. }
  36. }
  37. else
  38. {
  39. /* turn off LED1 */
  40. gd_eval_led_off(LED1);
  41. }
  42. }
  43. else
  44. {
  45. /* turn off LED1 */
  46. gd_eval_led_off(LED1);
  47. }
  48. }
  49. else
  50. {
  51. /* turn off LED1 */
  52. gd_eval_led_off(LED1);
  53. }
  54. }
  55. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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