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口的翻转速度可以自己选10M或50M都可。
- 不开中断也能发送数据,但如果数据过大会造成堵塞。
- 烧录程序时如果用串口烧录,在烧入时需要将boot0切换到高电平,并且按复位按键,烧入成功后再将boot0切回GND使用。
评论已关闭