天天看点

stm32f407 6个串口dma_stm32F之USART串口通信

概述

​ 上一篇说了stm32 定时器的基本使用,这篇来说说 stm32 串口通信

一.stm32F407资源

​ STM32F407有2个UART(通用异步收发器),4个USART(通用异步/同步收发器)

在STM32F407ZET6的手册上有描述,

stm32f407 6个串口dma_stm32F之USART串口通信

这些接口所对应的引脚如下:

stm32f407 6个串口dma_stm32F之USART串口通信

二. 在这里我们选用串口1进行简单编程:

实现功能吐下:

  • 每秒发送一个数字
  • 进行数据回传

其所要配置的内容如下:

  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--;
    }
}
           

最后可以实现所要求的功能, 下载至开发板中测试。

后续我还会继续分享stm32 的相关知识,相信你会学到更多知识,我会在[

stm32 ] 专栏

持续更新,来关注本专栏吧!

文章有帮助到你,点赞,收藏,关注我吧!