目录
1.编程思路
2.代码
USART串口的库函数:
USART_:
AIRCR中断分组设置表:
1.编程思路
通过485通信来实现MCU之间的通信,把接收到的数据通过串口助手显示在pc端。第一是对usart1,usart2进行初始化,Usart1负责与串口助手通信,Usart2,485负责进行MCU通信。第二是实现发送接收,接收在Ustart2中去实现。第三是把数据信息在PC端显示。
2.代码
1)初始化
void Uart1_Init(void)
{//USART1 初始化GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体,定义了一个GPIO_InitTypeDef类型的变量,名为GPIO_InitStructure。USART_InitTypeDef USART_InitStructure; //USART_Init函数的功能是初始化异步串口,包括选定使用的串口,设定串口的数据传输速率、数据位数、检验方式、停止位、流量控制方式等,是串口最重要的库函数。NVIC_InitTypeDef NVIC_InitStructure; //中断优先级RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //开启USART1时钟//串口1对应引脚复用映射GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1//USART1端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9,GPIOA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10//USART1 端口配置USART_InitStructure.USART_BaudRate= 115200; // 波特率为:115200USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据USART_InitStructure.USART_StopBits = USART_StopBits_1; //在帧结尾传输1个停止位USART_InitStructure.USART_Parity= USART_Parity_No; //奇偶失能USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //指定了硬件流控制模式使能还是失能=硬件流控制失能USART_InitStructure.USART_Mode= USART_Mode_Rx | USART_Mode_Tx; //接收使能,发送使能USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); //使能串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启相关中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口 1 中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; // 抢占优先级为3(抢断)NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级为3(响应) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
}void Uart2_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体,定义了一个GPIO_InitTypeDef类型的变量,名为GPIO_InitStructure。USART_InitTypeDef USART_InitStructure; //USART_Init函数的功能是初始化异步串口,包括选定使用的串口,设定串口的数据传输速率、数据位数、检验方式、停止位、流量控制方式等,是串口最重要的库函数。NVIC_InitTypeDef NVIC_InitStructure; //中断优先级RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //开启GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //开启USART1时钟 //串口2对应引脚复用映射GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2复用为USART2GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
//GPIOA3复用为USART2GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2,GPIOA3GPIO_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); //初始化PA2,PA3 //USART2 端口配置USART_InitStructure.USART_BaudRate = 115200; // 波特率为:115200USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据USART_InitStructure.USART_StopBits = USART_StopBits_1; //在帧结尾传输1个停止位USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶失能USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //指定了硬件流控制模式使能还是失能=硬件流控制失能USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收使能,发送使能USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); //使能串口2USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //开启相关中断 //Usart2 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //串口 2 中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; // 抢占优先级为3(抢断)NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级为2(响应) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器 接收数据
void USART2_IRQHandler(void)
{static u32 rx_i=0; //32位,初始化if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收数据寄存器不为空的中断(接收到的数据必须是0x0d 0x0a结尾){ USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除标志位rx_buf[rx_i++] = USART_ReceiveData(USART2); //rx_buf是在main.c定义的全局变量while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); //发送数据寄存器空标志位}rx_flag = 1;//
}
USART串口的库函数:
USART_Init函数:初始化所使用的串口外设
USART_Cmd函数:使能或者失能USART外设
USART_ITConfig函数:使能或者失能指定的USART中断
USART_SendData函数:通过外设USARTx发送单个数据
USART_ReceiveData函数:返回USARTx最近解释接收到的数据
USART_GetFlagStatus函数:检查指定的USART标志位设置与否
USART_ClearFlag函数:清楚USARTx的待处理标志位
USART_GetITStatus函数:检查指定的USART中断发生与否
USART_:
USART_BaudRate:波特率,视具体设备而定
USART_WordLength:字长
USART_StopBits:停止位
USART_Parity:校验方式
USART_HardwareFlowControl:硬件流控制
USART_Mode:单/双工
USART_WordLength提示了在一个帧中传输或者接收到的数据位数;
USART_WordLength_8b;8位数据
USART_WordLength_9b;9位数据
USART_StopBits定义了发送的停止位数目;
USART_StopBits_1 在帧结尾传输1个停止位
USART_StopBits_0.5 在帧结尾传输0.5个停止位
USART_StopBits_2 在帧结尾传输2个停止位
USART_StopBits_1.5 在帧结尾传输1.5个停止位
USART_Parity定义了奇偶模式
USART_Parity_No 奇偶失能
USART_Parity_Even 偶模式
USART_Parity_Odd 奇模式
USART_HardwareFlowControl指定了硬件流控制模式使能还是失能
USART_HardwareFlowControl_None 硬件流控制失能
USART_HardwareFlowControl_RTS 发送请求RTS使能
USART_HardwareFlowControl_CTS 清除发送CTS使能
USART_HardwareFlowControl_RTS_CTS RTS和CTS使能
USART_Mode指定了使能或者失能发送和接收模式
USART_Mode_Tx 发送使能
USART_Mode_Rx 接收使能
USART_FLAG_CTS CTS标志位
USART_FLAG_LBD LIN中断检测标志位
USART_FLAG_TXE 发送数据寄存器空标志位
USART_FLAG_TC 发送完成标志位
USART_FLAG_RXNE 接收数据寄存器非空标志位
USART_FLAG_IDLE 空闲总线标志位
USART_FLAG_ORE 溢出错误标志位
USART_FLAG_NE 噪声错误标志位
USART_FLAG_FE 帧错误标志位
USART_FLAG_PE 奇偶错误标志位
USART_IT_PE 奇偶错误判断
USART_IT_TXE 发送中断
USART_IT_TC 发送完成中断
USART_IT_RXNE 接收中断
USART_IT_IDLE 空闲总线中断
USART_IT_LBD LIN中断探测中断
USART_IT_CTS CTS中断
USART_IT_ORE 溢出错误中断
USART_IT_NE 噪声错误中断
USART_IT_FE 帧错误中断
AIRCR中断分组设置表:
0 | 111 | 0:4 | 0位抢占优先级,4位响应优先级 |
1 | 110 | 1:3 | 1位抢占优先级,3位响应优先级 |
2 | 101 | 2:2 | 2位抢占优先级,2位响应优先级 |
3 | 100 | 3:1 | 3位抢占优先级,1位响应优先级 |
4 | 011 | 4:0 | 4位抢占优先级,0位响应优先级 |