STM32F407中,USART1:RX使用DMA2_Stream5_Channel4,TX使用DMA2_Stream7_Channel4 USART2:RX使用DMA1_Stream5_Channel4,TX使用DMA1_Stream6_Channel4 USART3:RX使用DMA1_Stream1_Channel4,TX使用DMA1_Stream3_Channel4 UART4:RX使用DMA1_Stream2_Channel4,TX使用DMA1_Stream4_Channel4 UART5:RX使用DMA1_Stream0_Channel4,TX使用DMA1_Stream7_Channel4 USART6:RX使用DMA2_Stream1_Channel5,TX使用DMA2_Stream6_Channel5 SPI1:RX使用DMA2_Stream0_Channel3,TX使用DMA2_Stream3_Channel3 SPI2:RX使用DMA1_Stream3_Channel0,TX使用DMA1_Stream4_Channel0 I2C1:RX使用DMA1_Stream0_Channel7,TX使用DMA1_Stream6_Channel7,给出USART1、USART2、USART3、UART4、UART5、USART6、SPI1、SPI2、I2C1的初始化及数据收发代码,不要使用HAL库,只能使用标准库。
时间: 2023-06-26 17:07:37 浏览: 355
STM32F407多串口收发程序DMA实现
以下是每个模块的初始化和数据收发代码示例:
USART1初始化代码:
```
void USART1_init(void) {
// 使能USART1和DMA2时钟
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;
// 配置USART1引脚
GPIOA->MODER |= GPIO_MODER_MODE9_1 | GPIO_MODER_MODE10_1;
GPIOA->AFR[1] |= (7 << GPIO_AFRH_AFSEL9_Pos) | (7 << GPIO_AFRH_AFSEL10_Pos);
// 配置USART1
USART1->CR1 &= ~USART_CR1_UE;
USART1->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE;
// 配置DMA2_Stream5_Channel4用于USART1的RX
DMA2_Stream5->CR &= ~DMA_SxCR_EN;
DMA2_Stream5->PAR = (uint32_t)&(USART1->DR);
DMA2_Stream5->M0AR = (uint32_t)rx_buffer;
DMA2_Stream5->NDTR = RX_BUFFER_SIZE;
DMA2_Stream5->CR = DMA_SxCR_MINC | DMA_SxCR_CIRC | DMA_SxCR_PL_0 | DMA_SxCR_TCIE | DMA_SxCR_EN;
// 配置DMA2_Stream7_Channel4用于USART1的TX
DMA2_Stream7->CR &= ~DMA_SxCR_EN;
DMA2_Stream7->PAR = (uint32_t)&(USART1->DR);
DMA2_Stream7->M0AR = (uint32_t)tx_buffer;
DMA2_Stream7->CR = DMA_SxCR_MINC | DMA_SxCR_DIR_0 | DMA_SxCR_PL_0 | DMA_SxCR_EN;
// 设置中断优先级
NVIC_SetPriority(USART1_IRQn, 1);
// 使能USART1和DMA2_Stream5_Channel4
USART1->CR1 |= USART_CR1_UE;
DMA2_Stream5->CR |= DMA_SxCR_EN;
}
```
USART1数据收发代码:
```
void USART1_IRQHandler(void) {
if (USART1->SR & USART_SR_RXNE) {
rx_buffer[rx_index++] = USART1->DR;
if (rx_index >= RX_BUFFER_SIZE) {
// 禁用DMA2_Stream5_Channel4,等待下一次接收
DMA2_Stream5->CR &= ~DMA_SxCR_EN;
rx_index = 0;
}
}
}
void USART1_send(uint8_t *data, uint16_t len) {
memcpy(tx_buffer, data, len);
DMA2_Stream7->NDTR = len;
DMA2_Stream7->CR |= DMA_SxCR_EN;
while (DMA2_Stream7->CR & DMA_SxCR_EN);
}
```
USART2、USART3、UART4、UART5、USART6、SPI1、SPI2、I2C1的初始化和数据收发代码类似,只需要修改对应的寄存器和引脚即可。
阅读全文