• STM32 寄存器配置笔记——USART配置 打印


    一、概述

           本文主要介绍如何配置USART,并通过USART打印验证结果。以stm32f10为例,将PA9、PA10复用为USART功能,使用HSE PLL输出72MHZ时钟 APB2 clk不分频提供配置9600波特率。波特率计算公式如下:

    fck即为APB2 clk参考计算:

    硬件图:

    二、配置流程

            1)配置系统时钟输出72MHZ

             参考上文STM32 寄存器配置笔记——系统时钟配置 HSE as PLL

            2)计算USARTDIV

            USARTDIV = fck / 波特率 * 16

    temp = (float)(pclk2 * 1000000) / (bound * 16);      // cal USARTDIV

             3)获取整数部分和小数部分

             获取整数和小数部分以及要写进BRR波特率寄存器的值。

    1. mantissa = temp; // get mantissa
    2. fraction = (temp - mantissa) * 16; // get fraction
    3. uart_brr = (mantissa << 4) | fraction;

             4) 使能时钟

             使能端口A时钟和USART1时钟。

             

               

    1. RCC->APB2ENR |= 1 << 2; // enable portA clk
    2. RCC->APB2ENR |= 1 << 14; // enable USART1 clk

             5)配置GPIO复用功能

             参考手册配置TX、RX的复用功能。

               

    1. GPIOA->CRH &= 0xFFFFF00F; // reset portA pin9¡¢10 cfg
    2. GPIOA->CRH |= 0x4B0; // pin9 - UART1_TX pp af output pin10 - UART1_RX float input

             6)复位USART状态

            此处在开启USART前复位一下USART状态,保证USART能够彻底初始化。复位完后需要停止复位,避免USART不停复位

    1. RCC->APB2RSTR |= 1 << 14; // reset USART1
    2. RCC->APB2RSTR &= ~(1 << 14); // stop reset USART1

           7)配置波特率使能USART1

          

    1. USART1->BRR = uart_brr; // set bound param
    2. USART1->CR1 |= 0x200C; // enable usart 8bit data no parity enable tx & rx

     三、源码

            整个代码调用情况如下:

            

    1. void uart_init(u32 pclk2,u32 bound)
    2. {
    3. float temp;
    4. u16 mantissa;
    5. u16 fraction;
    6. u16 uart_brr;
    7. temp = (float)(pclk2 * 1000000) / (bound * 16); // cal USARTDIV
    8. mantissa = temp; // get mantissa
    9. fraction = (temp - mantissa) * 16; // get fraction
    10. uart_brr = (mantissa << 4) | fraction;
    11. RCC->APB2ENR |= 1 << 2; // enable portA clk
    12. RCC->APB2ENR |= 1 << 14; // enable USART1 clk
    13. GPIOA->CRH &= 0xFFFFF00F; // reset portA pin9¡¢10 cfg
    14. GPIOA->CRH |= 0x4B0; // pin9 - UART1_TX pp af output pin10 - UART1_RX float input
    15. RCC->APB2RSTR |= 1 << 14; // reset USART1
    16. RCC->APB2RSTR &= ~(1 << 14); // stop reset USART1
    17. USART1->BRR = uart_brr; // set bound param
    18. USART1->CR1 |= 0x200C; // enable usart 8bit data no parity enable tx & rx
    19. }

            在USART1配置完成后,将PA9、PA10接TTL转USB串口设备在主循环一直打印内容验证是否配置成功。

            在使用printf前需要做映射:

    1. //加入以下代码,支持printf函数,而不需要选择use MicroLIB
    2. #if 1
    3. #pragma import(__use_no_semihosting)
    4. //标准库需要支持的函数
    5. struct __FILE
    6. {
    7. int handle;
    8. /* Whatever you require here. If the only file you are using is */
    9. /* standard output using printf() for debugging, no file handling */
    10. /* is required. */
    11. };
    12. /* FILE is typedef¡¯ d in stdio.h. */
    13. FILE __stdout;
    14. //定义 _sys_exit以避免使用半主机模式
    15. void _sys_exit(int x)
    16. {
    17. x = x;
    18. }
    19. //重定向fputc函数
    20. //printf的输出,指向fputc, 由fputc输出到串口
    21. //这里使用USART1输出printf信息
    22. int fputc(int ch, FILE *f)
    23. {
    24. while((USART1->SR&0X40)==0);//等待上一次串口数据发送完成
    25. USART1->DR = (u8) ch; //写DR,串口1将发送数据
    26. return ch;
    27. }
    28. #endif

  • 相关阅读:
    Ubuntu:VS Code IDE安装ESP-IDF【保姆级】(草稿)
    为什么不建议使用自定义Object作为HashMap的key?
    2.Map和WeakMap用法
    t265 px4
    工业元宇宙的价值和发展
    WPF绘图(Path剪裁)
    面向对象编程有四大特性
    Centos7 升级 Kubernetes(k8s) 集群
    Linux中的scp指令
    linux高级篇基础理论五(用户安全,口令设置,JR暴力破解用户密码,NMAP端口扫描)
  • 原文地址:https://blog.csdn.net/wanruiou/article/details/134544429