STM32
直播中

郑成枝

7年用户 1267经验值
私信 关注
[问答]

STM32F407的USART异步通信方式的功能有哪些

STM32F407的USART接口所对应的引脚有哪些?
STM32F407的USART异步通信方式的功能有哪些?

回帖(1)

王超

2021-10-22 10:39:27
  资源:STM32F407有2个UART(通用异步收发器),4个USART(通用异步/同步收发器)
  在STM32F407ZET6的手册上有描述,
  
  这些接口所对应的引脚如下:
  
  在这里我们选用串口1进行简单编程:
  实现功能吐下:
  1.每秒发送一个数字
  2.进行数据回传
  其所要配置的内容如下:
  1.GPIO的时钟使能
  2.声明一个GPIO结构体变量,进行定义并进行初始化,主要是开启复用功能
  3.将GPIO复用为何,将IO口功能配置为USART功能
  4.USART1的时钟进行使能
  5.声明一个USART结构体变量,进行定义并进行初始化,设置其波特率,停止位,字长,是否硬件流控制,收发模式,
  6.设置中断优先组
  7.声明一个中断优先组变量,进行定义并进行初始化,设置什么为中断源,其抢占优先组,响应优先组的值
  8.配置串口中断源为哪个:是接收中断还是发送中断
  9.使能USART1
  int main(void)
  {
  //配置systick时钟的时钟源
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
  if(SysTick_Config(SystemCoreClock/1000)!=0)
  {
  }
  //配置中断优先分组
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  //声明一个GPIO结构体变量
  GPIO_InitTypeDef GPIO_InitStructure;
  //声明一个USART结构体变量
  USART_InitTypeDef USART_InitStructure;
  //使能USART1外设时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  //使能GPIO外设时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  //定义GPIO结构体变量,复用该IO口作为串口
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//两个IO口
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //复用模式
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50MHz
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽输出
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  //定义USART结构体变量
  USART_InitStructure.USART_BaudRate=115200;
  USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制
  USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //收发模式
  USART_InitStructure.USART_Parity=USART_Parity_No; //无校准
  USART_InitStructure.USART_StopBits=USART_StopBits_1; //1位停止位
  USART_InitStructure.USART_WordLength=USART_WordLength_8b; //字长为8
  //明确IO为何功能进行配置
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
  //串口进行初始化
  USART_Init(USART1,&USART_InitStructure);
  //串口中断优先组结构体变量声明
  NVIC_InitTypeDef NVIC_InitStructure_usart;
  //定义该串口中断优先组分组
  NVIC_InitStructure_usart.NVIC_IRQChannel=USART1_IRQn;
  NVIC_InitStructure_usart.NVIC_IRQChannelCmd=ENABLE;
  NVIC_InitStructure_usart.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级设置
  NVIC_InitStructure_usart.NVIC_IRQChannelSubPriority=0x02; //响应优先级设置
  //初始化该优先级分组
  NVIC_Init(&NVIC_InitStructure_usart);
  //配置串口接收中断
  USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  //使能串口1
  USART_Cmd(USART1,ENABLE);
  while(1)
  {
  //定时发送数据的功能
  USART_SendData(USART1,9);
  delay_sys(1000);
  }
  }
  //进行数据的回传
  void USART1_IRQHandler(void)
  {
  u8 res;
  if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判断是否有接收中断
  {
  res=USART_ReceiveData(USART1);
  USART_SendData(USART1,res);
  }
  }
  //延时功能
  int delaytime;
  void delay_sys(unsigned int time)
  {
  delaytime=time;
  while(delaytime!=0);//延时
  }
  //systick中的中断函数,对其进行编写
  /**
  * @brief This function handles SysTick Handler.
  * @param None
  * @retval None
  */
  void SysTick_Handler(void)
  {
  if(delaytime!=0)
  {
  delaytime--;
  }
  }
  最后可以实现所要求的功能。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分