寄存器操作
编辑器操作

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!");