一、Uart串口通信----函数发送
1. Uart串口发送(标准库)函数—单字节发送
Uart串口发送函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:
具体函数如下:
- /**
- *@功能:通过USARTx外设传输单个字节数据
- *@参数1:指定USART外设(USART1,USART2,USART3,USART4,USART5)
- *@参数2:要传输的数据(最多9位数据,由初始化配置决定)
- *@返回值:无
- */
- void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
- {
- /* Check the parameters */
- assert_param(IS_USART_ALL_PERIPH(USARTx));
- assert_param(IS_USART_DATA(Data));
- /* Transmit Data */
- USARTx->DR = (Data & (uint16_t)0x01FF);//虽然Data是16位的,但是赋给USART_DR是最多9位有效数据
- }
复制代码
在STM32F103参考手册中541页,对 USART_DR 寄存器有详细介绍,具体如下所示:
USART_DR 寄存器最多9位数据有效,所以函数一次最多只能发送9位数据,所以函数是单字节发送。
2. Uart串口检测标志(标准库)函数
Uart串口检测标志函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:
函数如下:
- /**
- *@功能:检查是否设置了指定的USART标志
- *@参数1:指定USART外设(USART1,USART2,USART3,USART4,USART5)
- *@参数2:要检查的标志
- *@返回值:标志位新状态(SET or RESET)
- */
- FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
复制代码
参数2要检测的标志,一共有10个标志,具体如下:
- #define USART_FLAG_CTS ((uint16_t)0x0200) //CTS 标志
- #define USART_FLAG_LBD ((uint16_t)0x0100) //LIN 断开检测标志
- #define USART_FLAG_TXE ((uint16_t)0x0080) //发送数据寄存器空
- #define USART_FLAG_TC ((uint16_t)0x0040) //发送完成
- #define USART_FLAG_RXNE ((uint16_t)0x0020) //读数据寄存器非空
- #define USART_FLAG_IDLE ((uint16_t)0x0010) //监测到总线空闲
- #define USART_FLAG_ORE ((uint16_t)0x0008) //过载错误
- #define USART_FLAG_NE ((uint16_t)0x0004) //噪声错误标志
- #define USART_FLAG_FE ((uint16_t)0x0002) //帧错误
- #define USART_FLAG_PE ((uint16_t)0x0001) //校验错误
复制代码
USART_SR 状态寄存器有详细介绍,具体如下所示:
3. Uart串口函数发送具体程序
自己写一个函数,外包装了一下,方便调用。
想要通过Uart串口发送数据,调用此函数即可。
具体程序如下:
- /**
- *@功能:串口1发送函数,负责发送数据
- *@参数:要传输的数据(最多9位,日常8位就是一个字节)
- *@返回值:无
- */
- void Uart1Send(u16 data)
- {
- USART_SendData(USART1, data); //发送数据
- while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待发送完成
- }
复制代码
二、Uart串口通信----中断接收
1. Uart串口接收(标准库)函数—单字节接收
Uart串口接收函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:
具体函数如下:
- /**
- *@功能:返回USARTx外设最近接收到的数据
- *@参数:指定USART外设(USART1,USART2,USART3,USART4,USART5)
- *@返回值:接收到的数据
- */
- uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
- {
- /* Check the parameters */
- assert_param(IS_USART_ALL_PERIPH(USARTx));
- /* Receive Data */
- return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
- }
复制代码
USART_DR 寄存器上面有详细介绍。
2. Uart串口检测中断(标准库)函数
Uart串口检测中断函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:
函数如下:
- /**
- *@功能:检查指定的USART中断是否已经发生
- *@参数1:指定USART外设(USART1,USART2,USART3,USART4,USART5)
- *@参数2:USART中断源校验
- *@返回值:USART_IT新状态(SET or RESET)
- */
- ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
复制代码
参数2要检测的中断源,具体如下:
- #define USART_IT_PE ((uint16_t)0x0028)
- #define USART_IT_TXE ((uint16_t)0x0727)
- #define USART_IT_TC ((uint16_t)0x0626)
- #define USART_IT_RXNE ((uint16_t)0x0525)
- #define USART_IT_ORE_RX ((uint16_t)0x0325) /* In case interrupt is generated if the RXNEIE bit is set */
- #define USART_IT_IDLE ((uint16_t)0x0424)
- #define USART_IT_LBD ((uint16_t)0x0846)
- #define USART_IT_CTS ((uint16_t)0x096A)
- #define USART_IT_ERR ((uint16_t)0x0060)
- #define USART_IT_ORE_ER ((uint16_t)0x0360) /* In case interrupt is generated if the EIE bit is set */
- #define USART_IT_NE ((uint16_t)0x0260)
- #define USART_IT_FE ((uint16_t)0x0160)
复制代码
3. Uart串口中断接收具体程序
Uart串口中断接收,没接收一个字节数据,进一次中断。
- /**
- * @brief 串口1中断服务函数,负责接收数据
- * @retval None
- */
- void USART1_IRQHandler(void) //串口1中断服务程序
- {
- u8 Res=0;
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
- {
- Res =USART_ReceiveData(USART1); //读取接收到的数据
- /*
- 对接收的数据进行处理
- */
- }
- }
复制代码
————————————————
版权声明:根号五
|