STM32F407通过按键触发外部中断,用DMA方式从串口1发送并接受一个100字节的信息
时间: 2023-05-12 07:06:56 浏览: 54
可以使用STM32F407的DMA和串口1来实现这个功能。首先,需要配置外部中断和DMA通道,以便在按键按下时触发DMA传输。然后,可以使用串口1的发送和接收功能来发送和接收100字节的信息。以下是一个可能的实现:
```c
#include "stm32f4xx.h"
#define BUFFER_SIZE 100
uint8_t tx_buffer[BUFFER_SIZE];
uint8_t rx_buffer[BUFFER_SIZE];
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
// Clear the interrupt flag
EXTI_ClearITPendingBit(EXTI_Line0);
// Start DMA transfer
DMA_Cmd(DMA2_Stream7, DISABLE);
DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
DMA_SetCurrDataCounter(DMA2_Stream7, BUFFER_SIZE);
DMA_Cmd(DMA2_Stream7, ENABLE);
}
}
void DMA2_Stream7_IRQHandler(void)
{
if (DMA_GetITStatus(DMA2_Stream7, DMA_IT_TCIF7) != RESET)
{
// Clear the interrupt flag
DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);
// Send and receive data
USART_SendData(USART1, tx_buffer[0]);
USART_ReceiveData(USART1);
}
}
int main(void)
{
// Configure GPIO for button
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_0;
gpio.GPIO_Mode = GPIO_Mode_IN;
gpio.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &gpio);
// Configure EXTI for button
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
EXTI_InitTypeDef exti;
exti.EXTI_Line = EXTI_Line0;
exti.EXTI_Mode = EXTI_Mode_Interrupt;
exti.EXTI_Trigger = EXTI_Trigger_Falling;
exti.EXTI_LineCmd = ENABLE;
EXTI_Init(&exti);
// Configure USART1 for communication
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &gpio);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1);
USART_InitTypeDef usart;
usart.USART_BaudRate = 9600;
usart.USART_WordLength = USART_WordLength_8b;
usart.USART_StopBits = USART_StopBits_1;
usart.USART_Parity = USART_Parity_No;
usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &usart);
USART_Cmd(USART1, ENABLE);
// Configure DMA for USART1
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
DMA_InitTypeDef dma;
dma.DMA_Channel = DMA_Channel_4;
dma.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
dma.DMA_Memory0BaseAddr = (uint32_t)rx_buffer;
dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
dma.DMA_BufferSize = BUFFER_SIZE;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
dma.DMA_Mode = DMA_Mode_Normal;
dma.DMA_Priority = DMA_Priority_High;
dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
dma.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
dma.DMA_MemoryBurst = DMA_MemoryBurst_Single;
dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream2, &dma);
DMA_ITConfig(DMA2_Stream2, DMA_IT_TC, ENABLE);
NVIC_EnableIRQ(DMA2_Stream2_IRQn);
// Enable interrupts
NVIC_EnableIRQ(EXTI0_IRQn);
while (1)
{
// Wait for DMA transfer to complete
while (DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7) == RESET);
// Process received data
// ...
// Prepare next transmission
for (int i = 0; i < BUFFER_SIZE; i++)
{
tx_buffer[i] = i;
}
}
}
```
这个代码片段演示了如何使用STM32F407的外部中断、DMA和串口1来实现按键触发的数据传输。当按键按下时,外部中断会触发DMA传输,将tx_buffer中的数据发送到串口1,并将接收到的数据存储在rx_buffer中。在主循环中,可以处理接收到的数据,并准备下一次传输。