stm32串口接收数据_ 空闲中断 寄存器版本
时间: 2023-11-30 14:03:39 浏览: 152
以下是使用空闲中断和寄存器版本实现stm32串口接收数据的示例代码:
```c
#include "stm32f10x.h"
#define USART1_DR_Base 0x40013804 // USART1 Data register base address
void USART1_IRQHandler(void)
{
if (USART1->SR & USART_SR_IDLE) // check if IDLE flag is set
{
volatile uint32_t tmp; // create a temporary variable to store data
tmp = USART1->SR; // read status register
tmp = USART1->DR; // read data register
(void)tmp; // avoid warning for unused variable
}
}
int main(void)
{
// enable USART1 clock
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
// configure USART1 pins
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // enable GPIOA clock
GPIOA->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9); // clear PA9 configuration
GPIOA->CRH |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_0; // set PA9 as alternate function output push-pull
GPIOA->CRH &= ~(GPIO_CRH_CNF10 | GPIO_CRH_MODE10); // clear PA10 configuration
GPIOA->CRH |= GPIO_CRH_CNF10_0; // set PA10 as floating input
// configure USART1
USART1->BRR = 0x271; // set baud rate to 115200
USART1->CR1 = USART_CR1_RE | USART_CR1_IDLEIE | USART_CR1_RXNEIE | USART_CR1_UE; // enable receiver, IDLE interrupt, RXNE interrupt, and USART1
// enable USART1 interrupt
NVIC_EnableIRQ(USART1_IRQn);
while (1)
{
// do something else
}
}
```
在上面的代码中,我们首先定义了USART1的数据寄存器地址,然后实现了一个USART1的中断处理函数。在中断处理函数中,我们首先检查IDLE标志是否被设置,如果设置了,就读取状态寄存器和数据寄存器,然后清除IDLE标志。在主函数中,我们首先使能了USART1的时钟,并配置了USART1的引脚。然后我们设置了波特率为115200,使能了接收器、IDLE中断、接收寄存器非空中断和USART1。最后,我们使能了USART1的中断,并进入了一个无限循环。
阅读全文
相关推荐
















