写一个stm32f103c8t6的usart3通信,要求使用stm32f1xx.h库
时间: 2024-01-30 16:03:04 浏览: 139
stm32f103c8t6_usart1_usart3.rar_STM32F103C8T6程序_stm32c8t6 usart3
5星 · 资源好评率100%
好的,以下是一个简单的使用stm32f1xx.h库的usart3通信的示例代码:
```
#include "stm32f1xx.h"
void USART3_Init(void) {
// 使能 USART3 时钟
RCC->APB1ENR |= RCC_APB1ENR_USART3EN;
// 配置 PA10 为输入模式
GPIOA->CRH &= ~(GPIO_CRH_CNF10 | GPIO_CRH_MODE10);
GPIOA->CRH |= GPIO_CRH_CNF10_1;
// 配置 PB10 为输出模式
GPIOB->CRH &= ~(GPIO_CRH_CNF10 | GPIO_CRH_MODE10);
GPIOB->CRH |= GPIO_CRH_MODE10_0 | GPIO_CRH_MODE10_1;
// 配置 USART3
USART3->BRR = 0x1D4C; // 波特率设置为 9600
USART3->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 使能 USART3 发送和接收,并开启 USART3
// 配置 NVIC
NVIC_EnableIRQ(USART3_IRQn);
}
void USART3_SendChar(char c) {
while (!(USART3->SR & USART_SR_TXE)); // 等待发送缓冲区为空
USART3->DR = c;
}
void USART3_SendString(char *s) {
while (*s) {
USART3_SendChar(*s++);
}
}
void USART3_IRQHandler(void) {
if (USART3->SR & USART_SR_RXNE) { // 判断接收缓冲区是否非空
char c = USART3->DR;
// 处理接收到的字符
}
}
int main(void) {
USART3_Init();
while (1) {
// 发送数据
USART3_SendString("Hello, world!\r\n");
for (int i = 0; i < 500000; i++); // 延时
// 接收数据
// ...
}
}
```
该代码使用了stm32f1xx.h库中的寄存器定义和宏定义来配置USART3,实现了发送和接收数据的功能。其中,`USART3_Init()`函数用于初始化USART3,`USART3_SendChar()`和`USART3_SendString()`函数用于发送数据,`USART3_IRQHandler()`函数用于处理接收到的数据。在`main()`函数中,使用了一个循环来不断发送数据和接收数据。
阅读全文