你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103标准库开发---Uart串口通信实验---函数发送和中断接收

[复制链接]
STMCU小助手 发布时间:2022-9-7 16:09
一、Uart串口通信----函数发送
1. Uart串口发送(标准库)函数—单字节发送
Uart串口发送函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:
2bd9c169cd004f968a579887ed1b5140.png

具体函数如下:

  1. /**
  2.   *@功能:通过USARTx外设传输单个字节数据
  3.   *@参数1:指定USART外设(USART1,USART2,USART3,USART4,USART5)
  4.   *@参数2:要传输的数据(最多9位数据,由初始化配置决定)
  5.   *@返回值:无
  6.   */
  7. void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
  8. {
  9.   /* Check the parameters */
  10.   assert_param(IS_USART_ALL_PERIPH(USARTx));
  11.   assert_param(IS_USART_DATA(Data));

  12.   /* Transmit Data */
  13.   USARTx->DR = (Data & (uint16_t)0x01FF);//虽然Data是16位的,但是赋给USART_DR是最多9位有效数据
  14. }
复制代码

在STM32F103参考手册中541页,对 USART_DR 寄存器有详细介绍,具体如下所示:

48ae086e7815476c9dd674f6d98677f6.png
7d76fe27fc5e4faab4ff5b90e403171c.png

USART_DR 寄存器最多9位数据有效,所以函数一次最多只能发送9位数据,所以函数是单字节发送。

2. Uart串口检测标志(标准库)函数
Uart串口检测标志函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:

c5e53712368841e88ce2179f01e0b2d1.png

函数如下:

  1. /**
  2.   *@功能:检查是否设置了指定的USART标志
  3.   *@参数1:指定USART外设(USART1,USART2,USART3,USART4,USART5)
  4.   *@参数2:要检查的标志
  5.   *@返回值:标志位新状态(SET or RESET)
  6.   */
  7. FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
复制代码

参数2要检测的标志,一共有10个标志,具体如下:

  1. #define USART_FLAG_CTS              ((uint16_t)0x0200)         //CTS 标志
  2. #define USART_FLAG_LBD              ((uint16_t)0x0100)        //LIN 断开检测标志
  3. #define USART_FLAG_TXE              ((uint16_t)0x0080)        //发送数据寄存器空
  4. #define USART_FLAG_TC               ((uint16_t)0x0040)        //发送完成
  5. #define USART_FLAG_RXNE             ((uint16_t)0x0020)        //读数据寄存器非空
  6. #define USART_FLAG_IDLE             ((uint16_t)0x0010)        //监测到总线空闲
  7. #define USART_FLAG_ORE              ((uint16_t)0x0008)        //过载错误
  8. #define USART_FLAG_NE               ((uint16_t)0x0004)  //噪声错误标志
  9. #define USART_FLAG_FE               ((uint16_t)0x0002)        //帧错误
  10. #define USART_FLAG_PE               ((uint16_t)0x0001)  //校验错误
复制代码

USART_SR 状态寄存器有详细介绍,具体如下所示:

7b0832e235bc4e5e886d2fc90ed69140.png
39fcad2c32244ee0b0d681c89d26bf34.png

3. Uart串口函数发送具体程序
自己写一个函数,外包装了一下,方便调用。
想要通过Uart串口发送数据,调用此函数即可。
具体程序如下:

  1. /**
  2.   *@功能:串口1发送函数,负责发送数据
  3.   *@参数:要传输的数据(最多9位,日常8位就是一个字节)
  4.   *@返回值:无
  5.   */
  6. void Uart1Send(u16 data)
  7. {
  8.         USART_SendData(USART1, data);        //发送数据
  9.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待发送完成
  10. }
复制代码

二、Uart串口通信----中断接收
1. Uart串口接收(标准库)函数—单字节接收
Uart串口接收函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:

4a7cf8731f5b4c6099849e68385cf7ac.png

具体函数如下:

  1. /**
  2.   *@功能:返回USARTx外设最近接收到的数据
  3.   *@参数:指定USART外设(USART1,USART2,USART3,USART4,USART5)
  4.   *@返回值:接收到的数据
  5.   */
  6. uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
  7. {
  8.   /* Check the parameters */
  9.   assert_param(IS_USART_ALL_PERIPH(USARTx));

  10.   /* Receive Data */
  11.   return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
  12. }
复制代码

USART_DR 寄存器上面有详细介绍。

2. Uart串口检测中断(标准库)函数
Uart串口检测中断函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:

87b80fd1510b459cb49850c946ecac89.png

函数如下:

  1. /**
  2.   *@功能:检查指定的USART中断是否已经发生
  3.   *@参数1:指定USART外设(USART1,USART2,USART3,USART4,USART5)
  4.   *@参数2:USART中断源校验
  5.   *@返回值:USART_IT新状态(SET or RESET)
  6.   */
  7. ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
复制代码

参数2要检测的中断源,具体如下:

  1. #define USART_IT_PE             ((uint16_t)0x0028)
  2. #define USART_IT_TXE            ((uint16_t)0x0727)
  3. #define USART_IT_TC             ((uint16_t)0x0626)
  4. #define USART_IT_RXNE           ((uint16_t)0x0525)
  5. #define USART_IT_ORE_RX         ((uint16_t)0x0325) /* In case interrupt is generated if the RXNEIE bit is set */
  6. #define USART_IT_IDLE           ((uint16_t)0x0424)
  7. #define USART_IT_LBD            ((uint16_t)0x0846)
  8. #define USART_IT_CTS            ((uint16_t)0x096A)
  9. #define USART_IT_ERR            ((uint16_t)0x0060)
  10. #define USART_IT_ORE_ER         ((uint16_t)0x0360) /* In case interrupt is generated if the EIE bit is set */
  11. #define USART_IT_NE             ((uint16_t)0x0260)
  12. #define USART_IT_FE             ((uint16_t)0x0160)
复制代码

3. Uart串口中断接收具体程序

Uart串口中断接收,没接收一个字节数据,进一次中断。

  1. /**
  2.   * @brief  串口1中断服务函数,负责接收数据
  3.   * @retval None
  4.   */
  5. void USART1_IRQHandler(void) //串口1中断服务程序
  6. {
  7.         u8 Res=0;
  8.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
  9.         {
  10.                 Res =USART_ReceiveData(USART1);        //读取接收到的数据
  11.                 /*
  12.                   对接收的数据进行处理
  13.                 */
  14.     }
  15. }
复制代码

————————————————
版权声明:根号五


收藏 评论0 发布时间:2022-9-7 16:09

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版