• 简单聊下STM32F103的串口


    串口是单片机嵌入式必不可少的外设,它上手简单,使用方便,很受小伙伴的欢迎。

    用STM32CubeMX体验下STM32F103的串口,硬件平台采用百问网STM32F103mini开发板。

    生成的一些代码:

    此时,我们可以调用下面两个接口来实现串口数据的收发:

    HAL_UART_Receive
    HAL_UART_Transmit

    我们在pc上开发不是经常使用printf吗,如何在单片机上使用使用printf呢?

    这就需要重定向了。

    printf和scanf会分别调用“fputc()”和“fgetc()”,因此这里覆写这两个函数,使用HAL提供的函数实现
    收发数据。
    同时,还需要需要点击“ ”,打开工程选项界面,切换到“Target”标签,勾选上“Use MicroLIB”。

    1. /*****************************************************
    2. *function: 写字符文件函数
    3. *param1: 输出的字符
    4. *param2: 文件指针
    5. *return: 输出字符的 ASCII 码
    6. ******************************************************/
    7. int fputc(int ch, FILE *f)
    8. {
    9. HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10);
    10. return ch;
    11. }
    12. /*****************************************************
    13. *function: 读字符文件函数
    14. *param1: 文件指针
    15. *return: 读取字符的 ASCII 码
    16. ******************************************************/
    17. int fgetc(FILE *f)
    18. {
    19. uint8_t ch = 0;
    20. HAL_UART_Receive(&huart1, (uint8_t*)&ch, 1, 10);
    21. return (int)ch;
    22. }

    如果不勾选上“Use MicroLIB”,还需要再添加下面代码:

    1. /*
    2. * 添加如下代码,可不在工程设置中勾选 Use MicroLIB
    3. */
    4. #pragma import(__use_no_semihosting)
    5. struct __FILE
    6. {
    7. int a;
    8. };
    9. FILE __stdout;
    10. FILE __stdin;
    11. void _sys_exit(int x)
    12. {
    13. }

    最后别忘了添加头文件#include <stdio.h>

     

    最后在main函数中添加测试代码:

    1. printf("百问科技 www.100ask.net\n\r");
    2. printf("UART 实验\n\r");
    3. printf("test char = %c,%c\n\r", 'H', 'c');
    4. printf("test string1 = %s\n\r", "www.100ask.net");
    5. printf("test string2 = %s\n\r", "深圳百问网科技有限公司");
    6. printf("test decimal1 number = %d\n\r", 123456);
    7. printf("test decimal2 number = %d\n\r", -123456);
    8. printf("test hex1 number = 0x%x\n\r", 0x123456);
    9. printf("test hex2 number = 0x%08x\n\r", 0x123456);
    10. printf("test float = %.5f\n\r", 3.1415);
    11. printf("test double = %.10lf\n\r", 3.141592653);
    12. printf("\r\n 键盘输入‘C’或者‘c’控制串口打印‘Hello world’");
    13. while(1)
    14. {
    15. scanf("%c", &cmd);
    16. if(cmd=='C' || cmd=='c')
    17. {
    18. cmd = 0;
    19. printf("\r\nHello World.");
    20. }
    21. HAL_Delay(100);
    22. }

     

  • 相关阅读:
    如何在VS2022中进行调试bug,调试的快捷键,debug与release之间有什么区别
    Spring Security多登录页面示例
    深入浅出Django的MTV架构
    r9 5900hx和i9 12900h哪个好
    分享购模式:解析企业家眼中的新型销售模式
    CJ20N 项目定义属性字段增强
    【算法训练营】 - ①① 暴力递归
    【大厂真题实战】Java工程师 | 字节面试真题(一)
    创建模拟器
    idea Springboot 校园助学贷款系统VS开发mysql数据库web结构java编程计算机网页源码maven项目
  • 原文地址:https://blog.csdn.net/parasoft/article/details/125494982