赞
踩
串口参数及时序:
串口数据帧的整体结构:串口中,每⼀个字节都装载在⼀个数据帧(10或者11位)⾥⾯,每个数据帧都由起始位、数据位和停⽌位组成。数据位有8个,代表⼀个字节的8位;还可以在数据位的最后加⼀个奇偶校验位,这样数据位总共就是9位;其中有效载荷时前8位,代表1个字节,校验位跟在有效载荷后⾯,占1位。
功能引脚:
TX:发送数据输出引脚 RX:接收数据输入引脚
SW_RX:用于智能卡通信的引脚
硬件数据流控:
数据帧下的时钟波就是之前说的同步时钟输出功能,在每一个数据位的中间都有一个时钟上升沿,时钟频率和数据速率一样,接收端可以在时钟上升沿处进行采集。
一般选择9位字长有校验或者8位字长无校验,保证每一帧的有效载荷都是1字节.
STM32的串口可以配置停⽌位为0.5、1、1.5、2,一般选择1位停⽌位。
串口的输出TX比输入RX简单得多,输出就定时翻转TX引脚高低电平;但是要保证采样频率和波特率一致,还要保证每次输入采样的位置正好处于每一位中间。
- void USART_DeInit(USART_TypeDef* USARTx);//回复缺省值函数
- void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);//开启串口函数
- void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState);//开启串口中断函数
- void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq,FunctionalState NewState);//开启USART到DMA的触发通道函数
- void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);//发送数据函数
- uint16_t USART_ReceiveData(USART_TypeDef* USARTx);//接收数据
- FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_tUSART_FLAG);//在中断函数外获取标志位函数
- void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);//在中断函数外清除标志位函数
- ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);//在中断函数内获取标志位函数
- void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_tUSART_IT);//在中断函数内清除标志位函数
- #include "stm32f10x.h" // Device header
- #include <stdio.h>
- #include <stdarg.h>
- void Serial_Init(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- USART_InitTypeDef USART_InitStructure;
- USART_InitStructure.USART_BaudRate = 9600;//波特率
- USART_InitStructure.USART_HardwareFlowControl =
- USART_HardwareFlowControl_None;//⽆流控
- USART_InitStructure.USART_Mode = USART_Mode_Tx;//发送模式
- USART_InitStructure.USART_Parity = USART_Parity_No;//⽆校验位
- USART_InitStructure.USART_StopBits = USART_StopBits_1;//停⽌位⼀位
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位1字
- 节
- USART_Init(USART1, &USART_InitStructure);
-
- USART_Cmd(USART1, ENABLE);//开启串⼝
- }
-
- void Serial_SendByte(uint8_t Byte)//发送字符
- {
- USART_SendData(USART1, Byte);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
-
- void Serial_SendArray(uint8_t *Array, uint16_t Length)//发送数组
- {
- uint16_t i;
- for (i = 0; i < Length; i ++)
- {
- Serial_SendByte(Array[i]);
- }
- }
-
- void Serial_SendString(char *String)//发送字符串
- {
- uint8_t i;
- for (i = 0; String[i] != '\0'; i ++)
- {
- Serial_SendByte(String[i]);
- }
- }
-
- uint32_t Serial_Pow(uint32_t X, uint32_t Y)
- {
- uint32_t Result = 1;
- while (Y --)
- {
- Result *= X;
- }
- return Result;
- }
-
- void Serial_SendNumber(uint32_t Number, uint8_t Length)//发送数字
- {
- uint8_t i;
- for (i = 0; i < Length; i ++)
- {
- Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 +'0');
- }
- }
-
- int fputc(int ch, FILE *f)//重定向printf
- {
- Serial_SendByte(ch);
- return ch;
- }
-
- void Serial_Printf(char *format, ...)//重定向printf多串⼝使⽤
- {
- char String[100];
- va_list arg;
- va_start(arg, format);
- vsprintf(String, format, arg);
- va_end(arg);
- Serial_SendString(String);
- }

文本数据包:
数据包的收发流程:
- void Serial_SendPacket(void)
- {
- Serial_SendByte(0xFF);
- Serial_SendArray(Serial_TxPacket, 4);
- Serial_SendByte(0xFE);
- }
- void USART1_IRQHandler(void)
- {
- static uint8_t RxState = 0;//状态机变量
- static uint8_t pRxPacket = 0;//指示接收个数
- if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
- {
- uint8_t RxData = USART_ReceiveData(USART1);
-
- if (RxState == 0)
- {
- if (RxData == 0xFF)
- {
- RxState = 1;
- pRxPacket = 0;
- }
- }
- else if (RxState == 1)
- {
- Serial_RxPacket[pRxPacket] = RxData;
- pRxPacket ++;
- if (pRxPacket >= 4)
- {
- RxState = 2;
- }
- }
- else if (RxState == 2)
- {
- if (RxData == 0xFE)
- {
- RxState = 0;
- Serial_RxFlag = 1;
- }
- }
-
- USART_ClearITPendingBit(USART1, USART_IT_RXNE);
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。