stm32f10x串口与串口通信实例
时间: 2023-05-24 14:05:51 浏览: 60
以下是一个使用STM32F10x系列单片机的串口与串口通信示例。
在此示例中,我们将使用两个串口进行通信:USART1和USART2。我们将在STM32F103C8单片机上实现此示例。总线时钟为8MHz。
硬件连接:
将USART1的TX引脚(PA9)连接到另一方的RX引脚。
将USART1的RX引脚(PA10)连接到另一方的TX引脚。
将USART2的TX引脚(PA2)连接到另一方的RX引脚。
将USART2的RX引脚(PA3)连接到另一方的TX引脚。
代码:
下面是使用Keil MDK-ARM编写的完整代码:
```
#include "stm32f10x.h" // Device header
void usart1Init(void);
void usart2Init(void);
void usart1SendChar(char ch);
void usart2SendChar(char ch);
int main(void)
{
usart1Init();
usart2Init();
while (1)
{
char ch = USART1->DR;
usart2SendChar(ch);
}
}
void usart1Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// PA9: USART1_TX
GPIOA->CRH |= GPIO_CRH_MODE9_1 | GPIO_CRH_MODE9_0; // Output, 50MHz
GPIOA->CRH |= GPIO_CRH_CNF9_1; // Alternate function
// PA10: USART1_RX
GPIOA->CRH &= ~(GPIO_CRH_MODE10_0 | GPIO_CRH_MODE10_1); // Input mode
GPIOA->CRH |= GPIO_CRH_CNF10_0; // Floating input
USART1->BRR = 0x45; // Baud rate = 115200 @ PCLK = 8MHz
USART1->CR1 |= USART_CR1_TE | USART_CR1_RE; // Enable transmitter and receiver
USART1->CR1 |= USART_CR1_RXNEIE; // Enable RXNE interrupt
NVIC_EnableIRQ(USART1_IRQn);
USART1->CR1 |= USART_CR1_UE; // Enable USART1
}
void usart2Init(void)
{
RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// PA2: USART2_TX
GPIOA->CRL |= GPIO_CRL_MODE2_1 | GPIO_CRL_MODE2_0; // Output, 50MHz
GPIOA->CRL |= GPIO_CRL_CNF2_1; // Alternate function
// PA3: USART2_RX
GPIOA->CRL &= ~(GPIO_CRL_MODE3_0 | GPIO_CRL_MODE3_1); // Input mode
GPIOA->CRL |= GPIO_CRL_CNF3_0; // Floating input
USART2->BRR = 0x45; // Baud rate = 115200 @ PCLK = 8MHz
USART2->CR1 |= USART_CR1_TE | USART_CR1_RE; // Enable transmitter and receiver
USART2->CR1 |= USART_CR1_UE; // Enable USART2
}
void usart1SendChar(char ch)
{
while ((USART1->SR & USART_SR_TC) == 0); // Wait until transmission complete
USART1->DR = ch;
}
void usart2SendChar(char ch)
{
while ((USART2->SR & USART_SR_TC) == 0); // Wait until transmission complete
USART2->DR = ch;
}
void USART1_IRQHandler(void)
{
if (USART1->SR & USART_SR_RXNE)
{
char ch = USART1->DR;
usart1SendChar(ch); // Echo back
}
}
```
说明:
usart1Init()和usart2Init()函数用于初始化USART1和USART2。我们将PA9和PA2配置为USART1_TX和USART2_TX,将PA10和PA3配置为USART1_RX和USART2_RX。我们选用了波特率为115200,一个停止位,无校验位。
usart1SendChar()和usart2SendChar()函数用于向USART1和USART2发送一个字符。
main()函数中,我们定义了一个char变量ch,用于存储USART1接收到的字符。同时,我们将这个字符发送到USART2中。注意,发送前需要等待前一个字符传输完成(等待USART_SR_TC标志位被置位)。
当USART1接收到一个字符时,我们将这个字符发送回USART1,用于回应。我们还可以在此处添加更多的处理代码。例如,将接收到的字符存储到数组中、将其传输到闪存中等等。
在我们的示例中,我们没有添加错误处理和超时处理。在实际使用中,这些问题可能需要考虑。另外,由于它是一个简单的示例,我们可能没有使用操作系统或RTOS。因此,需要在接收和发送时注意上下文切换的问题。