完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
串口配置 最近闲来无事,发现以前买的esp 12E开发板在抽屉里躺灰就网上找资料折腾了两三天,结果一顿操作猛如虎,一看是个辣鸡。怎么也烧写不了固件,我怀疑是开发板有问题。所以我又在乐鑫官网买了个新的。然后脑子一热,想用STM32做个串口转发的程序来玩一下串口。 我是这样想的STM32f103串口一连接电脑,串口2连接esp然后。 第一次画流程图,不知道对不对 usart.c #include "usart.h" __IO uint8_t CocheData[2]; //临时数据缓存 /*串口1初始化函数*/ void init_usart1() { GPIO_InitTypeDef GPIOA_InitStructure; //定义GPIOA初始化结构体变量 USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体变量 NVIC_InitTypeDef NVIC_InitStructure; //定义中断初始化结构体变量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//ENABLE THE GPIOA 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//ENABLE USART1 使能串口1时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//ENABLE USART2 使能串口2时钟 GPIOA_InitStructure.GPIO_Pin = (GPIO_Pin_9 | GPIO_Pin_2); //启用GPIOA Pin9引脚 串口发送引脚 GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //工作模式 复用推挽输出 GPIOA_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //工作频率50MHz GPIO_Init(GPIOA, &GPIOA_InitStructure); //初始化GPIOA GPIOA_InitStructure.GPIO_Pin = (GPIO_Pin_10 | GPIO_Pin_3); //启用GPIOA Pin10引脚 串口接收引脚 GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //工作模式 悬空输入 GPIO_Init(GPIOA, &GPIOA_InitStructure); //初始化GPIO USART_InitStructure.USART_BaudRate = 76800; //设置串口1的波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置数据长度 USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位为1位 USART_InitStructure.USART_Parity = USART_Parity_No; //设置奇偶校验为无校验 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //启用接收和传输模式 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置硬件流模式 USART_Init(USART1, &USART_InitStructure); //初始化串口1 USART_Cmd(USART1, ENABLE); //使能串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能串口1中断 USART_ClearFlag(USART1, USART_IT_RXNE); //清除接收缓存非空 USART_Init(USART2, &USART_InitStructure); //初始化串口2 USART_Cmd(USART2, ENABLE); //使能串口2 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能串口2中断 USART_ClearFlag(USART2, USART_IT_RXNE); //清除接收缓存非空 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //指定串口1的中断 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能串口1中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中断优先级 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //指定串口1的中断 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能串口1中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //中断优先级 NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //中断优先级分组 /*发送单个字节*/ void USART1_SendChar(uint8_t dat){ while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){ //判断发送缓存区是否为空 TXE是发送缓存区清空标志 } USART_SendData(USART1,dat); } /*发送多个字节*/ void USART1_SendMulti(uint8_t *dat,uint8_t len){ uint8_t i; for(i=0;i } } /*发送字符串*/ void USART1_SendString(uint8_t *dat) { while (*dat != ' |