Nuru_Banmian
Nuru_Banmian
Published on 2025-03-28 / 78 Visits
1
1

使用printf对代码进行调试的方法

寄存器操作

编辑器操作

使用printf进行调试_编辑器设置.png

usart.h

 #ifndef __USART_H
 #define __USART_H
 ​
 #include "stm32f10x.h"
 #include <stdio.h>
 ​
 void USART_Init(void);
 void USART_SendChar(uint8_t ch);
 ​
 #endif
 ​

usart.c

 #include "usart.h"
 ​
 // 初始化
 void USART_Init(void)
 {
     // 1. 配置时钟
     RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
     RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
 ​
     // 2. GPIO工作模式
     //  PA9  TX(发送端):  复用推挽输出:CNF-10,MODE-11
     //  PA10 RX(接收端):  浮空输入:CNF-01,MODE-00
     GPIOA->CRH |= GPIO_CRH_MODE9;
     GPIOA->CRH |= GPIO_CRH_CNF9_1;
     GPIOA->CRH &= ~GPIO_CRH_CNF9_0;
 ​
     GPIOA->CRH &= ~GPIO_CRH_MODE10;
     GPIOA->CRH &= ~GPIO_CRH_CNF10_1;
     GPIOA->CRH |= GPIO_CRH_CNF10_0;
     
     // 3. 串口设置
     // 3.1 波特率设置
     USART1->BRR = 0x271;
 ​
     // 3.2 收发使能及USART模块使能
     USART1->CR1 |= (USART_CR1_UE | USART_CR1_TE | USART_CR1_RE);
 ​
     // 3.3 其他配置,设置数据帧格式
     USART1->CR1 &= ~USART_CR1_M;
     USART1->CR1 &= ~USART_CR1_PCE;
     USART1->CR1 &= ~USART_CR1_PS;
     USART1->CR2 &= ~USART_CR2_STOP;
 }
 ​
 // 发送一个字符
 void USART_SendChar(uint8_t ch)
 {
     // 判断SR里TXE是否为1
     while((USART1->SR & USART_SR_TXE) == 0) //TXE位为0时说明缓冲区未空,等待
     {}
 ​
     // 向DR写入新的要发送的数据
     USART1->DR = ch;
 }
 ​
 int fputc(int ch, FILE * file)
 {
     // 直接将字符发送到串口
     USART_SendChar(ch);
     return ch;
 }

main.c

 #include "usart.h"
 ​
 int main(void)
 {
     USART_Init;
     
     printf("Hello, world!\n");
     
     while(1)
     {
         
     }
 }

HAL库操作

usart.h

 #include <stdio.h>

usart.c

 /* USER CODE BEGIN 1 */
 int fputc(int ch, FILE *f)
 {
   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
   return ch;
 }
 /* USER CODE END 1 */

main.c

 printf("Hello, world!");



Comment