STM32F407基于官方库串口通信用按键怎么实现
时间: 2023-08-17 10:26:29 浏览: 74
以下基于官方库实现的 STM32F407 的串口通信代码,并实现了一个按键来控制发送数据的功能,以 USART1 为例:
```c
#include "stm32f4xx.h"
#include <stdio.h>
#define USARTx USART1
#define USARTx_CLK RCC_APB2Periph_USART1
#define USARTx_CLK_INIT RCC_APB2PeriphClockCmd
#define USARTx_IRQn USART1_IRQn
#define USARTx_IRQHandler USART1_IRQHandler
#define USARTx_TX_PIN GPIO_Pin_9
#define USARTx_TX_GPIO_PORT GPIOA
#define USARTx_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define USARTx_TX_SOURCE GPIO_PinSource9
#define USARTx_TX_AF GPIO_AF_USART1
#define USARTx_RX_PIN GPIO_Pin_10
#define USARTx_RX_GPIO_PORT GPIOA
#define USARTx_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define USARTx_RX_SOURCE GPIO_PinSource10
#define USARTx_RX_AF GPIO_AF_USART1
#define KEY_PIN GPIO_Pin_0
#define KEY_GPIO_PORT GPIOA
#define KEY_GPIO_CLK RCC_AHB1Periph_GPIOA
#define KEY_EXTI_LINE EXTI_Line0
#define KEY_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA
#define KEY_EXTI_PIN_SOURCE EXTI_PinSource0
#define KEY_EXTI_IRQn EXTI0_IRQn
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
GPIO_InitTypeDef GPIO_KeyInitStruct;
void USARTx_Config(void)
{
USARTx_CLK_INIT(USARTx_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin = USARTx_TX_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = USARTx_RX_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);
GPIO_PinAFConfig(USARTx_TX_GPIO_PORT, USARTx_TX_SOURCE, USARTx_TX_AF);
GPIO_PinAFConfig(USARTx_RX_GPIO_PORT, USARTx_RX_SOURCE, USARTx_RX_AF);
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USARTx, &USART_InitStruct);
USART_Cmd(USARTx, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = USARTx_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);
}
void KEY_Config(void)
{
RCC_AHB1PeriphClockCmd(KEY_GPIO_CLK, ENABLE);
GPIO_KeyInitStruct.GPIO_Pin = KEY_PIN;
GPIO_KeyInitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_KeyInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_KeyInitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(KEY_GPIO_PORT, &GPIO_KeyInitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig(KEY_EXTI_PORT_SOURCE, KEY_EXTI_PIN_SOURCE);
EXTI_InitStruct.EXTI_Line = KEY_EXTI_LINE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = KEY_EXTI_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void USARTx_IRQHandler(void)
{
if (USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)
{
char data = USART_ReceiveData(USARTx);
USART_SendData(USARTx, data);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
}
void KEY_EXTI_IRQHandler(void)
{
if (EXTI_GetITStatus(KEY_EXTI_LINE) != RESET)
{
EXTI_ClearITPendingBit(KEY_EXTI_LINE);
if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_PIN) == RESET)
{
char str[] = "Hello, world!\r\n";
for (int i = 0; i < sizeof(str); i++)
{
USART_SendData(USARTx, str[i]);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
}
}
}
int main(void)
{
USARTx_Config();
KEY_Config();
while (1)
{
}
}
```
这段代码在 USARTx_Config 函数中初始化了 USART1 的相关配置,以及在 KEY_Config 函数中初始化了按键的 GPIO 和 EXTI 配置。在中断处理函数 KEY_EXTI_IRQHandler 中,当按键按下时,发送一段字符串 "Hello, world!\r\n"。在主函数中,只是一个空循环。
需要注意的是,这里使用了 EXTI 中断来实现按键的检测,因此还需要在 stm32f4xx_it.c 文件中添加 EXTI0_IRQHandler 的中断处理函数,以及在 stm32f4xx_it.h 文件中添加 EXTI0_IRQn 的中断向量表定义。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)