[活动] 【APM32F411V Tiny Board测评】4 调试串口的printf实现

[复制链接]
 楼主| 孤独的单行者 发表于 2024-5-24 12:09 | 显示全部楼层 |阅读模式
本帖最后由 孤独的单行者 于 2024-5-28 10:22 编辑

       printf的实现主要是通过串口进行实现,我们通过原理图的PDF文件中没有找到有关Geehy Link部分的原理图,通过网友们的测试实际上是有的,开发板的板载调试器可以实现虚拟串口,这一部门在串口例程的USART_IrDA中发现了踪迹(在官网实在没有找到),使用的是USART1。
       原理图中只有如下:
1.png

       对应的引脚为PA9和PA10.
       接下来我们进行USART1的初始化:
  1. void APM_USART1Init(void)
  2. {
  3.     GPIO_Config_T GPIO_configStruct;
  4.     USART_Config_T usartConfigStruct;;

  5.     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
  6.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);
  7.    
  8.     /* Connect PXx to USARTx_Tx */
  9.     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_9, GPIO_AF_USART1);
  10.     /* Connect PXx to USARTx_Rx */
  11.     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_10, GPIO_AF_USART1);

  12.     GPIO_ConfigStructInit(&GPIO_configStruct);
  13.     /* Configure USART Tx as alternate function push-pull */
  14.     GPIO_configStruct.mode = GPIO_MODE_AF;
  15.     GPIO_configStruct.pin = GPIO_PIN_9|GPIO_PIN_10;
  16.     GPIO_configStruct.speed = GPIO_SPEED_50MHz;
  17.     GPIO_Config(GPIOA, &GPIO_configStruct);

  18.     usartConfigStruct.baudRate = 115200;
  19.     usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  20.     usartConfigStruct.mode = USART_MODE_TX;
  21.     usartConfigStruct.parity = USART_PARITY_NONE;
  22.     usartConfigStruct.stopBits = USART_STOP_BIT_1;
  23.     usartConfigStruct.wordLength = USART_WORD_LEN_8B;
  24.   USART_Config(USART1,&usartConfigStruct);

  25.   /* Enable USART */
  26.   USART_Enable(USART1);
  27. }

  28. int fputc(int ch, FILE* f)
  29. {
  30.     /* send a byte of data to the serial port */
  31.     USART_TxData(USART1, (uint8_t)ch);

  32.     /* wait for the data to be send */
  33.     while (USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);

  34.     return (ch);
  35. }
      在外部中断中加入打印部分:
  1. void EINT0_IRQHandler(void)
  2. {
  3.     if(EINT_ReadIntFlag(EINT_LINE_0))
  4.     {
  5.         APM_LED3_Toggle;
  6.                 printf("APM_LED3_Toggle \r\n");

  7.         /*Clear EINT_LINE0 interrupt flag*/
  8.         EINT_ClearIntFlag(EINT_LINE_0);
  9.     }
  10. }
      效果如下:
2.png

       这里我遇到了一个问题,不知道是开发环境的问题还是调试器的问题(或者开发板的问题),程序编译后使用download下载后程序没有跑起来,在线调试也要run三次才能跑起来,这款的问题其实是由于程序中用到了printf,keil调试需要勾选:
3.png

       记得重新编译一下,才能连接到我们自定义的重定义中,之后就能正常了。

sdCAD 发表于 2024-6-4 11:47 | 显示全部楼层
fputc是C标准库中的一个函数,用于将一个字符写入到指定的流中。在重定向后,当printf调用fputc时,它实际上会将字符发送到串口。
mickit 发表于 2024-6-4 13:14 | 显示全部楼层
配置了UART并重定向了fputc,你就可以在代码中使用printf函数了。
nomomy 发表于 2024-6-5 11:32 | 显示全部楼层
printf函数调用需要在板级配置文件中预先定义,并且需要确保串口已经初始化完成。
51xlf 发表于 2024-6-5 14:56 | 显示全部楼层
需要重定向C标准库的输出流stdout到串口。
chenjun89 发表于 2024-6-5 19:23 来自手机 | 显示全部楼层
可以直接用C语言的格式化字符串函数来实现
primojones 发表于 2024-6-5 20:27 | 显示全部楼层
int fputc(int ch, FILE *f) {
    // 将字符ch发送到串口
    serial_putchar(ch);
    return ch;
}
星辰大海不退缩 发表于 2024-6-22 21:40 | 显示全部楼层
串口是TTL电平还是串口模块进行数据收发?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

152

帖子

0

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

13

主题

152

帖子

0

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