#include "stm32f1xx.h" #include "stdio.h"

// 串口波特率 #define DEBUG_USART_BAUDRATE 115200

// 串口接收缓冲数组大小 #define UART_RX_BUFFER_SIZE 256 unsigned char UART_RxBuffer[UART_RX_BUFFER_SIZE];

// 引脚定义 /*******************************************************/ #define DEBUG_USART USART1 #define DEBUG_USART_CLK_ENABLE() RCC->APB2ENR |= RCC_APB2ENR_USART1EN;

#define DEBUG_USART_RX_GPIO_PORT GPIOB #define DEBUG_USART_RX_GPIO_CLK_ENABLE() RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; #define DEBUG_USART_RX_PIN GPIO_PIN_7

#define DEBUG_USART_TX_GPIO_PORT GPIOB #define DEBUG_USART_TX_GPIO_CLK_ENABLE() RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; #define DEBUG_USART_TX_PIN GPIO_PIN_6

#define DEBUG_USART_IRQHandler USART1_IRQHandler #define DEBUG_USART_IRQ USART1_IRQn

// 将串口1复用到 PB6\PB7 上 #define DEBUG_USART_AF_ENABLE() GPIOB->CRH &= ~(GPIO_CRH_CNF6 | GPIO_CRH_MODE6); \ GPIOB->CRH |= GPIO_CRH_CNF6_1 | GPIO_CRH_MODE6_0; \ GPIOB->CRH &= ~(GPIO_CRH_CNF7 | GPIO_CRH_MODE7); \ GPIOB->CRH |= GPIO_CRH_CNF7_0; /************************************************************/

USART_TypeDef *USARTx = DEBUG_USART; GPIO_TypeDef *USARTx_RX_GPIO_PORT = DEBUG_USART_RX_GPIO_PORT; GPIO_TypeDef *USARTx_TX_GPIO_PORT = DEBUG_USART_TX_GPIO_PORT; uint16_t USARTx_RX_PIN = DEBUG_USART_RX_PIN; uint16_t USARTx_TX_PIN = DEBUG_USART_TX_PIN;

USART_InitTypeDef USART_InitStructure;

// 串口接收数组指针 unsigned char UART_RxPtr;

void USART_Config(void) { // 使能 USART1 时钟 DEBUG_USART_CLK_ENABLE();

// 使能 GPIOB 时钟
DEBUG_USART_RX_GPIO_CLK_ENABLE();
DEBUG_USART_TX_GPIO_CLK_ENABLE();

// 配置 USART1 引脚
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure);

// USART 初始化设置
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USARTx, &USART_InitStructure);

// 使能串口接收中断
USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);

// 设置串口中断优先级
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 使能串口
USART_Cmd(USARTx, ENABLE);

}

void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { UART_RxBuffer[UART_RxPtr++] = USART_ReceiveData(USART1); } }

/***************** 发送字符串 **********************/ void Usart_SendString(uint8_t *str) { unsigned int k=0; do { USART_SendData(USART1, (str + k)); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); k++; } while((str + k) != '\0'); }

// 清空发送缓冲 void uart_FlushRxBuffer(void) { UART_RxPtr = 0; UART_RxBuffer[UART_RxPtr] = 0; }

/// 重定向 c 库函数 printf 到串口 DEBUG_USART,重定向后可使用 printf 函数 int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t)ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return ch; }

/// 重定向 c 库函数 scanf 到串口 DEBUG_USART,重写向后可使用 scanf、getchar 等函数 int fgetc(FILE *f) { while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return (int)USART_ReceiveData(USART1); }


原文地址: https://www.cveoy.top/t/topic/o4v9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录