一、串口2的引脚和相关的设置
我们上节课讲到了串口1的驱动程序
串口1挂载在APB2(72Mhz)的时钟线上,串口2的时钟线是APB1(36Mhz)时钟线,所以在使能时钟时,使用的是关于APB1的时钟,大致上和串口1的配置是一样的.
第一步:使能相对应的时钟
第二步:对应引脚的初始化
第三步:编写对应的串口程序
第四步:串口中断配置(如果使用中断的话)
二、代码编写
usrt2.c的代码:
#include "usart2.h"
#include "led.h"
void uart2_init(u32 bound){
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能USART2,GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
//USART2_TX GPIOA2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
//USART2_RX GPIOA.3初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART2 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_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_DeInit(USART2);
USART_Init(USART2, &USART_InitStructure); //初始化串口2
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_Cmd(USART2, ENABLE); //使能串口2
}
void USART2_IRQHandler(void) //串口2中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART2); //读取接收到的数据
if(Res==1)
{
LED0_ON;
}
else if(Res==2)
{
LED0_OFF;
}
}
}
usart2.h文件的相关配置
#ifndef _USART2_H
#define _USART2_H
#include “stdio.h”
#include “stm32f10x.h”
void uart2_init(u32 bound);
#endif
main.c的主函数代码如下:
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart2.h"
int main(void)
{
LED_Init();
delay_init();
uart2_init(115200);
while(1)
{
USART_SendData(USART2,'f');
}
}
总结
链接:https://pan.baidu.com/s/1rsEKipJwVmsm9X5_XM7VqQ
提取码:fx46