STM32C8T6三个串口同时开启配置程序
2020 年 03 月 22 日 295 518 字 暂无评论

STM32C8T6有三个串口分别为

  • 串口一:PA9-TXD、PA10-RXD
  • 串口二:PA2-TXD、PA3-RXD
  • 串口三:PB10-TXD、PB11-RXD

配置代码

void My_USART1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStrue;//定义结构体变量
    USART_InitTypeDef USART_InitStrue;
    NVIC_InitTypeDef NVIC_InitStrue;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟

    //PA9初始化
    GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出
    GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9;        //PA9
    GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;//翻转速度
    GPIO_Init(GPIOA,&GPIO_InitStrue);

    //PA10初始化
    GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10;         //PA10
    GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;    //翻转速度
    GPIO_Init(GPIOA,&GPIO_InitStrue);

    //USART1初始化
    USART_InitStrue.USART_BaudRate = 115200;//波特率115200
    USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制
    USART_InitStrue.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收发模式
    USART_InitStrue.USART_Parity = USART_Parity_No; //无奇偶校验位
    USART_InitStrue.USART_StopBits = USART_StopBits_1; //1停止位
    USART_InitStrue.USART_WordLength = USART_WordLength_8b; //8数据位
    USART_Init(USART1,&USART_InitStrue);

    //USART1使能
    USART_Cmd(USART1,ENABLE);

    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断

    //中断初始化
    NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn;         //指定IRQ通道
    NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;          //中断使能
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; //指定优先级
    NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1;        //中断优先级管理
    NVIC_Init(&NVIC_InitStrue);
}    

void My_USART2_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStrue;//定义结构体变量
    USART_InitTypeDef USART_InitStrue;
    NVIC_InitTypeDef NVIC_InitStrue;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能GPIO时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_AFIO,ENABLE);//使能USART2时钟

    //PA2初始化
    GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出
    GPIO_InitStrue.GPIO_Pin = GPIO_Pin_2;        //PA2
    GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;//翻转速度
    GPIO_Init(GPIOA,&GPIO_InitStrue);

    //PA3初始化
    GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IPU;        //上拉输入
    GPIO_InitStrue.GPIO_Pin = GPIO_Pin_3;         //PA3
    GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;    //翻转速度
    GPIO_Init(GPIOA,&GPIO_InitStrue);

    //USART2初始化
    USART_InitStrue.USART_BaudRate = 115200;//波特率115200
    USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制
    USART_InitStrue.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收发模式
    USART_InitStrue.USART_Parity = USART_Parity_No; //无奇偶校验位
    USART_InitStrue.USART_StopBits = USART_StopBits_1; //1停止位
    USART_InitStrue.USART_WordLength = USART_WordLength_8b; //8数据位
    USART_Init(USART2,&USART_InitStrue);

    //USART2初始化
    USART_Cmd(USART2,ENABLE);

    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启接收中断

    //中断初始化
    NVIC_InitStrue.NVIC_IRQChannel = USART2_IRQn;         //指定IRQ通道
    NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;          //中断使能
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 2; //指定优先级
    NVIC_InitStrue.NVIC_IRQChannelSubPriority = 2;        //中断优先级配置
    NVIC_Init(&NVIC_InitStrue);
}

void My_USART3_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStrue;//定义结构体变量
    USART_InitTypeDef USART_InitStrue;
    NVIC_InitTypeDef NVIC_InitStrue;
}

void My_USART3_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStrue;//定义结构体变量
    USART_InitTypeDef USART_InitStrue;
    NVIC_InitTypeDef NVIC_InitStrue;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIO时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3时钟

    //PB10初始化
    GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP;   //推挽输出
    GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10;        //PB10
    GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz; //翻转速度
    GPIO_Init(GPIOB,&GPIO_InitStrue);

    //PB11初始化
    GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IPU;        //上拉输入
    GPIO_InitStrue.GPIO_Pin = GPIO_Pin_11;         //PA11
    GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;    //翻转速度
    GPIO_Init(GPIOB,&GPIO_InitStrue);

    //USART3初始化
    USART_InitStrue.USART_BaudRate = 115200;//波特率115200
    USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制
    USART_InitStrue.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收发送模式
    USART_InitStrue.USART_Parity = USART_Parity_No; //无奇偶校验位
    USART_InitStrue.USART_StopBits = USART_StopBits_1; //1停止位
    USART_InitStrue.USART_WordLength = USART_WordLength_8b; //8数据位
    USART_Init(USART3,&USART_InitStrue);

    //USART3使能
    USART_Cmd(USART3,ENABLE);

    USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//开启接收中断

    //中断初始化
    NVIC_InitStrue.NVIC_IRQChannel = USART3_IRQn;         //指定IRQ通道
    NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;          //中断使能
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 3; //指定优先级
    NVIC_InitStrue.NVIC_IRQChannelSubPriority = 3;        //中断优先级配置
    NVIC_Init(&NVIC_InitStrue);
}

void My_USART_Init(void)
{
    My_USART1_Init();
    My_USART2_Init();
    My_USART3_Init();
}

//USART1接收中断服务函数
void USART1_IRQHandler(void)
{
    u8 res;
    if(USART_GetITStatus(USART1,USART_IT_RXNE))
    {
        res = USART_ReceiveData(USART1);
        USART_SendData(USART3,res);//串口一接收数据由串口三发送出去
    }
}

//USART2接收中断服务函数
void USART2_IRQHandler(void)
{
    u8 res;
    if(USART_GetITStatus(USART2,USART_IT_RXNE))
    {
        res = USART_ReceiveData(USART2);
        USART_SendData(USART1,res);//串口2接收数据由串口1发送出去
    }
}

//USART3接收中断服务函数
void USART3_IRQHandler(void)
{
    u8 res;
    if(USART_GetITStatus(USART3,USART_IT_RXNE))
    {
        res = USART_ReceiveData(USART3);
        USART_SendData(USART3,res);//串口3接收数据由串口3发送回去
    }
}

//主函数
 int main(void)
 {    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    My_USART_Init();
    while(1);
 }

经验分享:

  • 串口1位推挽输出、浮空输入,而串口2串口3为推挽输出、上拉输入。具体还需看数据手册。
  • IO口的翻转速度可以自己选10M50M都可。
  • 不开中断也能发送数据,但如果数据过大会造成堵塞。
  • 烧录程序时如果用串口烧录,在烧入时需要将boot0切换到高电平,并且按复位按键,烧入成功后再将boot0切回GND使用。

版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/8/



评论已关闭