[AT32F407] 【AT-START-F407测评】+使用Printf函数注意事项

[复制链接]
903|1
 楼主| gaoyang9992006 发表于 2021-1-28 17:00 | 显示全部楼层 |阅读模式
本帖最后由 gaoyang9992006 于 2021-1-28 19:14 编辑

https://bbs.21ic.com/icview-3068602-1-1.html
上一贴讲述了如何使用 串口发送字符,这一帖在上一贴基础上讲述如何使用stdio.h里的printf函数
大家都记得有个次叫:重定向
那么这次咱们就将printf映射到USART1端口上去。
将stdio.h包含进来,并打开观察,看看是哪个函数用于发送一个字符。
4592460127c20453f9.png
这里要使用的就是这个

  1. int fputc(int /*c*/, FILE * /*stream*/)
只需要重写该函数即可完成。我们可以利用库函数实现,
考虑到这个发送一个字符要完成什么呢?
1、发送1 个字符到USART1
2、判断是否发送完成,完成的话进入下一个字符发送。
查找库函数找到实现这两个功能的函数,如下
  1. int fputc(int ch, FILE *f)
  2. {  
  3.   USART_SendData(USART1, ch);
  4.   while ( USART_GetFlagStatus(USART1, USART_FLAG_TRAC) == RESET );   
  5.   return ch;
  6. }
这样就可以了吗?
编译测试,发现不行啊,没反应,单片机像死机了一样,没反应,是什么问题呢?
要启用MicroLIB才行,勾选上保持,重新编译下载,OK了。
4935560127cac12b2e.png
  1. #include "at32f4xx_gpio.h"
  2. #include "at32f4xx_usart.h"
  3. #include "stdio.h"
  4. /*delay variable*/
  5. static __IO uint32_t fac_us;
  6. static __IO uint32_t fac_ms;
  7. /*delay macros*/
  8. #define STEP_DELAY_MS        50
  9. void Delay_init()
  10. {
  11.   /*Config Systick*/
  12.   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
  13.   fac_us = SystemCoreClock / (1000000U);
  14.   fac_ms = fac_us * (1000U);
  15. }

  16. void Delay_ms(u16 nms)
  17. {
  18.   u32 temp;
  19.   while(nms)
  20.   {
  21.     if(nms > STEP_DELAY_MS)
  22.     {
  23.       SysTick->LOAD = (u32)(STEP_DELAY_MS * fac_ms);
  24.       nms -= STEP_DELAY_MS;
  25.     }
  26.     else
  27.     {
  28.       SysTick->LOAD = (u32)(nms * fac_ms);
  29.       nms = 0;
  30.     }
  31.     SysTick->VAL = 0x00;
  32.     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
  33.     do
  34.     {
  35.       temp = SysTick->CTRL;
  36.     }while( (temp & 0x01) && !(temp & (1<<16)) );

  37.     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  38.     SysTick->VAL = 0X00;
  39.   }
  40. }
  41. //串口初始化,根据原理图使用的是USART1,PA9为TX,PA10为RX
  42. void UART1_Init(uint32_t bound)
  43. {
  44.   GPIO_InitType GPIO_InitStructure;
  45.   USART_InitType USART_InitStructure;
  46.         
  47.         RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA,ENABLE);
  48.         RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART1,ENABLE);
  49.   /* Configure the UART1 TX pin */
  50.   GPIO_StructInit(&GPIO_InitStructure);
  51.   GPIO_InitStructure.GPIO_Pins = GPIO_Pins_9;
  52.   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  53.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  54.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  55.         
  56.           /*Configure UART param*/
  57.   USART_StructInit(&USART_InitStructure);
  58.   USART_InitStructure.USART_BaudRate = bound;
  59.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  60.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  61.   USART_InitStructure.USART_Parity = USART_Parity_No;
  62.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  63.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        

  64.   USART_Init(USART1, &USART_InitStructure);
  65.   USART_INTConfig(USART1, USART_INT_RDNE, ENABLE);
  66.   USART_Cmd(USART1, ENABLE);  
  67. }


  68. int fputc(int ch, FILE *f)
  69. {  
  70.   USART_SendData(USART1, ch);
  71.   while ( USART_GetFlagStatus(USART1, USART_FLAG_TRAC) == RESET );   
  72.   return ch;
  73. }


  74. int main(void)
  75. {
  76. //LED2管脚初始化
  77.         GPIO_InitType GPIO_InitStructure;
  78.         RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOD, ENABLE);
  79.         GPIO_StructInit(&GPIO_InitStructure);
  80.         GPIO_InitStructure.GPIO_Pins =GPIO_Pins_13;
  81.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  82.         GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;        
  83.         GPIO_Init(GPIOD,&GPIO_InitStructure);
  84.         
  85.         Delay_init();
  86.         UART1_Init(115200);
  87.         
  88.         while(1)
  89.         {
  90.                 GPIO_SetBits(GPIOD,GPIO_Pins_13);
  91.                 Delay_ms(200);
  92.                 GPIO_ResetBits(GPIOD,GPIO_Pins_13);               
  93.                 Delay_ms(200);
  94.                 USART_SendData(USART1,'A');
  95.                 printf("Hello\n");
  96.         }
  97.         
  98. }
8400860127d12e70b4.png

工程下载地址
https://bbs.21ic.com/icview-3068390-1-1.html
xuanhuanzi 发表于 2021-2-28 21:07 | 显示全部楼层
经验啊,我忘了勾选LIB就卡死了。s
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

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