新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2020-9-6
- 在线时间
- 1 小时
|
1金钱
#include <stdio.h>
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "timer.h"
#include "beep.h"
void My_USART1_Init() //串口初始化
{
/*
在使用IO口之前需要对相应的IO口进行初始化,
此时需要使用到GPIO_InitTypeDef结构体和GPIO_Init函数进行相应的初始化工作
同时还要对时钟和串口进行使能操作(使能啥意思)
*/
GPIO_InitTypeDef GPIO_InitStrue; //创建一个GPIO口的配置结构体
USART_InitTypeDef USART_InitStruct; //创建一个配置串口的结构体
// NVIC_InitTypeDef NVIC_InitStruct; //创建一个中断配置结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //时钟使能 //第一步:使能相应时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //串口1使能
//PA9口输出初始化
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用输出模式 //第二步:初始化IO口
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9; //被设置的接口
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; //GPIO口的速度
GPIO_Init(GPIOA,&GPIO_InitStrue); //GPIO口初始化函数
//PA10口输入初始化
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入模式
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10; //被设置的接口
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; //GPIO口的速度
GPIO_Init(GPIOA,&GPIO_InitStrue); //GPIO口初始化函数
USART_InitStruct.USART_BaudRate = 9600; //波特率为9600 //第三步:初始化串口
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //控制流为无
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; //发送/接收使能
USART_InitStruct.USART_Parity = USART_Parity_No; //无校验位
USART_InitStruct.USART_StopBits = USART_StopBits_1; //停止位为1位
USART_InitStruct.USART_WordLength = USART_WordLength_8b; //八位数据传输
USART_Init(USART1,&USART_InitStruct); //串口初始化
USART_Cmd(USART1,ENABLE); //串口使能函数
//以上为不使用中断时所需要初始化的串口相关设置
//第四步:中断设置
// USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //串口中断配置,开启接收中断
// NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; //中断通道设置
// NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //是否开启中断通道
// NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
// NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //子优先级
// NVIC_Init(&NVIC_InitStruct); //中断初始化
// USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //串口中断配置,开启接收中断
// NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; //中断通道设置
// NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //是否开启中断通道
// NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
// NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; //子优先级
// NVIC_Init(&NVIC_InitStruct); //中断初始化
}
void My_USART2_Init() //串口初始化
{
/*
在使用IO口之前需要对相应的IO口进行初始化,
此时需要使用到GPIO_InitTypeDef结构体和GPIO_Init函数进行相应的初始化工作
同时还要对时钟和串口进行使能操作(使能啥意思)
*/
GPIO_InitTypeDef GPIO_InitStrue; //创建一个GPIO口的配置结构体
USART_InitTypeDef USART_InitStruct; //创建一个配置串口的结构体
// NVIC_InitTypeDef NVIC_InitStruct; //创建一个中断配置结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //时钟使能 //第一步:使能相应时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //串口2使能
//PA2口输出初始化
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用输出模式 //第二步:初始化IO口
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_2; //被设置的接口
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; //GPIO口的速度
GPIO_Init(GPIOA,&GPIO_InitStrue); //GPIO口初始化函数
//PA3口输入初始化
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入模式
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_3; //被设置的接口
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; //GPIO口的速度
GPIO_Init(GPIOA,&GPIO_InitStrue); //GPIO口初始化函数
USART_InitStruct.USART_BaudRate = 9600; //波特率为9600 //第三步:初始化串口
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //控制流为无
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; //发送/接收使能
USART_InitStruct.USART_Parity = USART_Parity_No; //无校验位
USART_InitStruct.USART_StopBits = USART_StopBits_1; //停止位为1位
USART_InitStruct.USART_WordLength = USART_WordLength_8b; //八位数据传输
USART_Init(USART2,&USART_InitStruct); //串口初始化
USART_Cmd(USART2,ENABLE); //串口使能函数
}
//void USART1_IRQHandler() //中断函数
//{
// unsigned char date;
// if(USART_GetITStatus(USART1,USART_IT_RXNE)) //判断串口的状态(是否接收到数据)
// {
// date = USART_ReceiveData(USART1); //将数据读到date中
// USART_SendData(USART1,date); //将数据从串口1发送出去
// }
// if(USART_GetITStatus(USART2,USART_IT_RXNE)) //判断串口的状态(是否接收到数据)
// {
// date = USART_ReceiveData(USART2); //将数据读到date中
// USART_SendData(USART1,date); //将数据从串口1发送出去
// }
//}
int main()
{
unsigned char date;
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级设置
My_USART1_Init();
My_USART2_Init();
while(1)
{
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)) //判断串口的状态(是否接收到数据)
{
date = USART_ReceiveData(USART1); //将数据读到date中
USART_SendData(USART1,date); //将数据从串口1发送出去
}
if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)) //判断串口的状态(是否接收到数据)
{
date = USART_ReceiveData(USART2); //将数据读到date中
USART_SendData(USART1,date); //将数据从串口1发送出去
}
}
} GM65模块连接到串口二,STM32从串口2接收数据然后通过串口1发送出去,但是实际情况是如果我把线直接接到串口1就没问题,接到串口2数据就死活传不出去 |
|