目录
USART(Universal Synchronous/Asynchronous Receiver/Transmitter):通用同步/异步串行接收/发送器
USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。
USART的初始化
void INIT(USART2)(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//时钟使能:因为任何外设的使用,都要开启对应的时钟,因为单片机工作离不开时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//这里使用了IO,和外设串口,所以需要对这两个时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//这是IO的引脚配置——这个需要根据芯片引脚找
//找到输入引脚和输出引脚,千万别找错了
//这里使用的GPIO_Mode_AF_PP是复用推挽模式
//意味着,这个引脚允许功能复用,也就是该引脚允许在一定情况下使能多个外设
//因为,我们这个引脚作为串口输出数据到终端(电脑)的引脚
//不可避免它本身具有的一定的功能,我们需要复用它来输出,保证功能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//这个是输入,因为是数据输入,这个需要看外设要求,来选择合适的输入模式
//输入模式很多,常见的就是上拉下拉输入,这个多用在按键这些硬件的地方
//其次的模拟输入,多在adc的通道引脚读取值的时候
//当前的模式是浮空输入,一般串口应该就是这个
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//这是中断配置
//我们要使用串口的接收中断,不然要设置中断的参数
//终端参数最主要的就是三个——哪个中断通道,优先级设置,通道使能与否
//NVIC_IRQChannel——中断通道的选择,这个部分一般存在于芯片的启动文件里
//比如我都这块32,他就在我的截图里——在选择中断通道时,怎么选择,等下我会截图说明
//NVIC_IRQChannelPreemptionPriority这个是设置抢占优先级——也可以理解成父优先级
//NVIC_IRQChannelSubPriority这个是设置子优先级
//通过设置这两个参数——实现中断的优先级配置
//优先级的作用等下再说
//最有NVIC_IRQChannelCmd,该中断通道是否使能/打开
//NVIC_Init(&NVIC_InitStructure);调用函数,实现配置
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_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(USART2, &USART_InitStructure);
USART_Cmd(USART2,ENABLE);//对指定USART进行使能
USART_ITConfig( USART2, USART_IT_RXNE,ENABLE);
}
GPIO口初始化初始化配置
该装置具有两个多功能的UART / FIFO控制器, 可以在多种不同模式下进行单独地配置。不仅UART接口,FIFO接口和第二代FT232B与FT245B装置的Bit-Bang IO模式之外,FT2232D还提供了多种新的操作模式,包括多协议同步串行引擎(MPSSE)接口。专为同步串行协议而设计, 如I2C,JTAG和SPI总线。
首先我们需要知道该芯片的作用:FT2232D芯片,完成对USB协议和JTAG协议的转换。
从上图可以看到RXD2与M_PA3,TXD2与M_PA3相对应,所以以上初始化代码我们初始化GPIOA的Pin2与Pin3。
对于GPIOA的Pin2(与TXD2对应),这里使用的GPIO_Mode_AF_PP是复用推挽模式。意味着,这个引脚允许功能复用,也就是该引脚允许在一定情况下使能多个外设。因为,我们这个引脚作为串口输出数据到终端(电脑)的引脚。不可避免它本身具有的一定的功能,我们需要复用它来输出,保证功能。
对于GPIOA的Pin3与RXD2对应),当前的模式是浮空输入,一般串口应该就是这个。
中断初始化配置
这里注意中断频道是USART2_IRQn(参考stm32f10x.h)
USART初始化配置
USART相关函数的使用
函数的基本介绍
void USART2_IRQHandler(void)
{
}
以上是USART2中断服务函数,一般用于接收数据。
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
控制接收中断打开或者关闭,以上代码表示接收中断关闭。
USART_GetITStatus(USART2,USART_IT_RXNE)
引脚无数据为RESET=0,有数据为SET=1(SET=!RESET);当引脚有数据时,说明可以接受数据。
USART_GetFlagStatus(USART2,USART_FLAG_TXE)
引脚无数据为RESET=0,有数据为SET=1(SET=!RESET),当引脚有数据时,数据发送结束。
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
控制USART中断的开启和关闭,参数2:ENABLE(开启)或DISABLE(关闭)。
函数的使用举例
字符串发送
void USART2_SendString(u8 *str)
{
u8 index = 0;
do
{
USART_SendData(USART2,str[index]);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
//无使能相应中断时用USART_GetFlagStatus判断标志位是否置位
index++;
}while(str[index] != 0);
}
以上函数主要用于发送字符串,字符串的发送是在需要时使用,所以不需要一直保持中断,故可不用中断来进行。
字符串的接收
u8 usart_rec_str[20];//接收字符串
u8 usart_rec_flag=0;
void USART2_IRQHandler()
{
static u8 counts = 0;
u8 temp;
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
{ // 1:接受 0:
USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清除中断预处理位
temp=USART_ReceiveData(USART2);
if(temp=='\n')
{
usart_rec_flag=1;//接收完成标志
counts=0;
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);//暂时关闭
}
else
{
usart_rec_str[counts]=temp;
counts++;
}
}
}
以上函数主要用于接收字符串。
参考文献
[1] USART https://baike.baidu.com/item/USART/10593784?fr=aladdin
[2] FTDI官网 http://www.ftdichip.cn/Products/ICs/FT2232D.html
[3] CT117E嵌入式竞赛板部分芯片功能及作用 https://blog.csdn.net/qq_51558898/article/details/113055420