▪使用的硬件为:STM32F103ZET6。
在学习STM32的过程中,避免不了串口的数据传输,包括数据的发送与数据的接收,其中串口与上位机的对话也显得尤为重要(上位机:是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化。)。
串口是MCU的重要外部接口(MCU:单片微型计算机),STM的串口资源很丰富,功能也很强劲,STM32F103ZET6最多可以提供5路串口。在对串口进行使用的过程中,由于引脚资源的有限性,在一些引脚上板载了功能复用,对于复用功能的IO,首先要使能GPIO时钟,然后使能复用功能时钟,同时设置GPIO模式为复用功能对应的模式。
串口设置的一般步骤:
①串口时钟使能(挂载在APB2下面):
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
GPIO使能:
GPIO_InitTypeDef GPIO_InitStructure;
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
②串口复位:
void USART_DeInit(USART_TypeDef* USARTx);
③串口参数初始化:
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
USART_InitTypeDef USART_InitStructure;
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_Init(USART1, &USART_InitStructure); //初始化串口1
④数据发送:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
数据接收:
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
⑤读取串口状态:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
参数USART_FLAG标示我们要查看串口的某种状态:
我们要判断读寄存器是否非空(RXNE), 操作库函数的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);
我们要判断发送是否完成(TC),操作库函数的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_TC);
⑥串口使能:
USART_Cmd(USART1, ENABLE);
⑦开启串口响应中断:
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState)
比如在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是:
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
我们在发送数据结束的时候(TC, 发送完成) 要产生中断,那么方法是:
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
⑧获取相应中断状态:
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
在对串口进行初始化时会涉及到串口的中断优先级配置:
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
串口从缓冲器BUF向外发送数据:
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3f; //得到此次接收到的数据长度
printf("\r\n 您发送的消息为:\r\n\r\n");
for(t=0;t
USART_SendData(USART1, USART_RX_BUF[t]); //发送一个字节到串口
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); //检测这个数据是否已经被发送完成了。 USART_FLAG_TC 是宏定义的数据发送完成标识符。
❤软件❤
keil5、XCOM
XCOM输出为:
注:其中借鉴到了正点原子学习资料。