USART_DeInit(USART1);这个是复位串口吗
时间: 2024-03-03 08:53:59 浏览: 77
USART_DeInit是STM32库函数中的一个函数,用于将指定的USART外设恢复为默认值。该函数并不是复位串口,而是将USART外设的所有寄存器恢复为默认值,相当于将USART外设重新初始化。
在使用USART外设之前,可以先使用USART_DeInit函数进行初始化,以确保外设处于默认状态。这个函数的作用是将USART外设恢复为初始化状态,包括关闭USART时钟、还原所有配置寄存器为默认值等操作。
如果需要对USART外设进行复位操作,应该使用USART_ResetBlockState函数。该函数可以将指定的USART外设的所有寄存器恢复为复位时的默认值,并关闭时钟。
以下是USART_ResetBlockState函数的函数原型:
```
void USART_ResetBlockState(USART_TypeDef* USARTx);
```
其中,USARTx是要被复位的USART外设,可以是USART1、USART2、USART3等。
需要注意的是,使用USART_ResetBlockState函数复位USART外设时,会将外设的所有配置寄存器都恢复为默认值,因此在使用之前需要重新进行初始化。如果只需要将USART外设的某些寄存器恢复为默认值,而不是全部恢复为默认值,可以手动设置这些寄存器的值。
相关问题
void uart_init1(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); USART_DeInit(USART2); //复位串口 //USART1_TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9 //USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10解释代码
这段代码是初始化STM32的USART2串口,其中包含以下步骤:
1. 使能USART2和GPIOA的时钟,以及复用功能的时钟。
2. 将USART2重置为默认状态。
3. 配置PA.9引脚为复用推挽输出,速度为50MHz。
4. 配置PA.10引脚为浮空输入。
5. 初始化GPIOA的PA.9和PA.10引脚。
最终实现的功能是,将USART2的TX引脚连接到PA.9引脚,将USART2的RX引脚连接到PA.10引脚,以便进行串口通信。
gd32f103 软件实现串口0收到命令aa实现复位怎么写
要想在 GD32F103 上实现串口0收到命令 aa 后实现复位,你可以编写一个中断服务函数,当串口0收到命令 aa 时触发该中断,然后在中断服务函数中执行复位操作。
下面是示例代码:
```c
#include "gd32f10x.h"
#include <string.h>
void usart0_irq_handler(void)
{
char cmd[3];
memset(cmd, 0, sizeof(cmd));
// 检测串口接收缓冲区中的数据
if (usart_flag_get(USART0, USART_FLAG_RBNE) != RESET) {
cmd[0] = usart_data_receive(USART0);
if (usart_flag_get(USART0, USART_FLAG_RBNE) != RESET) {
cmd[1] = usart_data_receive(USART0);
if (strcmp(cmd, "aa") == 0) {
NVIC_SystemReset(); // 收到aa命令,执行复位操作
}
}
}
}
int main()
{
/* 配置USART0 */
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200U);
usart_word_length_set(USART0, USART_WL_8BIT);
usart_stop_bit_set(USART0, USART_STB_1BIT);
usart_parity_config(USART0, USART_PM_NONE);
usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
usart_interrupt_enable(USART0, USART_INT_RBNE);
usart_enable(USART0);
/* 配置中断 */
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable(USART0_IRQn, 0, 0);
while (1) {
// 主循环中不需要执行其他操作
}
return 0;
}
```
在代码中,我们编写了一个名为 `usart0_irq_handler` 的中断服务函数,当串口0接收到数据时触发该中断。在中断服务函数中,我们检测串口接收缓冲区中的数据是否为 "aa" 命令,如果是,则执行 `NVIC_SystemReset()` 函数,该函数用于执行复位操作。
在 `main` 函数中,我们首先配置了串口0,并使能了串口接收中断。然后配置了中断,将 `usart0_irq_handler` 函数注册为串口0接收中断的处理函数。最后进入一个空的 `while` 循环,让程序进入等待状态,等待串口中断触发。
需要注意的是,当执行复位操作时,程序会重新启动,因此需要重新执行初始化等操作。因此,在实际应用中,需要根据具体的需求进行相应的修改。