一、前言

这是我的第一篇CSDN,记录一些代码总结,一方面与大家分享交流,另一方面方便以后再次使用能够快速回忆,再就是提高自身写作水平。如有错误之处,欢迎各位大佬批评指正。

二、所涉及的芯片

1、STM32F103RCT6

2、MAX3483

a、主要特点

传输方式:半双工
速率:10Mbps
限摆率:NO
接收允许控制:YES
关断电流:2 nA
引脚数:8

b、使用说明


当RE与DE都拉高时,由TTL电平向RS232电平发送;(发送)
当RE与DE都拉低时,由RS232电平向TTL电平发送;(接收)

三、代码部分

1、初始化相关代码

.h文件

这个文件放置相关声明与宏定义

#ifndef __USART_INIT_H
#define __USART_INIT_H
#include "stm32f10x.h"//串口2和产品通信
//TXD
#define USART2_TXD_GPIO_PORT    GPIOA
#define USART2_TXD_GPIO_PIN     GPIO_Pin_2
//RXD
#define USART2_RXD_GPIO_PORT    GPIOA
#define USART2_RXD_GPIO_PIN     GPIO_Pin_3#define CD4067_USART          USART2
#define MCD4067_USART_IRQn      USART2_IRQn//串口3和上位机通信
//TXD
#define USART3_TXD_GPIO_PORT    GPIOB
#define USART3_TXD_GPIO_PIN     GPIO_Pin_10
//RXD
#define USART3_RXD_GPIO_PORT    GPIOB
#define USART3_RXD_GPIO_PIN     GPIO_Pin_11#define MAX3483_USART            USART3
#define MAX3483_USART_IRQn      USART3_IRQnstatic void NVIC_Config( uint32_t NVIC_PriorityGroup , \IRQn_Type NVIC_IRQChannel ,   \uint8_t PreemptionPriority ,  \uint8_t SubPriority );//NVIC配置
void USART_2_3_Init(void);//串口2、串口3初始化
void Usart_SendByte(USART_TypeDef* USARTx, uint8_t data);//发送一个字节
void Usart_SendHalfWord(USART_TypeDef* USARTx, uint16_t data);//发送二个字节
void Usart_SendStr(USART_TypeDef* USARTx, uint8_t *str);//发送字符串 #endif /* __USART_INIT_H */

.C文件

这部分代码用来初始化USART3接口(代码中有USART2是他用,还将与下面另一台设备进行通信,此处略去)

/*******************************************************************************
* Function Name  : USART_2_3_Init
* Description    : 串口2、串口3初始化,优先级组使用组1,串口2(1,2),串口3(1,1),串口3优先级高于串口2
* Input          : 无
* Output         : 无
* Return         : 无
*******************************************************************************/
void USART_2_3_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;
/*********************************************************************************/// 打开串口GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 打开串口外设的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);    // 将USART2的TXD配置为推挽复用模式GPIO_InitStructure.GPIO_Pin    = USART2_TXD_GPIO_PIN;GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;GPIO_Init(USART2_TXD_GPIO_PORT, &GPIO_InitStructure);// 将USART2的RXD配置为浮空输入模式GPIO_InitStructure.GPIO_Pin    = USART2_RXD_GPIO_PIN;GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_IN_FLOATING;GPIO_Init(USART2_RXD_GPIO_PORT, &GPIO_InitStructure);// 配置串口2的工作参数// 配置波特率19200USART_InitStructure.USART_BaudRate = 19200;// 配置 帧数据字长USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位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;// 完成串口2的初始化配置USART_Init(CD4067_USART, &USART_InitStructure);// 串口2中断优先级配置NVIC_Config(NVIC_PriorityGroup_1 ,MCD4067_USART_IRQn ,1 ,2);// 使能串口2接收中断USART_ITConfig(CD4067_USART, USART_IT_RXNE, ENABLE);USART_ITConfig(CD4067_USART, USART_IT_IDLE, ENABLE);//USART_IT_IDLE为帧数据接收// 使能串口2USART_Cmd(CD4067_USART, ENABLE);/*********************************************************************************/// 打开串口GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 打开串口外设的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);// 将USART3的TXD配置为推挽复用模式GPIO_InitStructure.GPIO_Pin    = USART3_TXD_GPIO_PIN;GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;GPIO_Init(USART3_TXD_GPIO_PORT, &GPIO_InitStructure);// 将USART3的RXD配置为浮空输入模式GPIO_InitStructure.GPIO_Pin    = USART3_RXD_GPIO_PIN;GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_IN_FLOATING;GPIO_Init(USART3_RXD_GPIO_PORT, &GPIO_InitStructure);// 配置串口3的工作参数// 配置波特率115200USART_InitStructure.USART_BaudRate = 115200;// 配置 帧数据字长USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位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;// 完成串口3的初始化配置USART_Init(MAX3483_USART, &USART_InitStructure);// 串口3中断优先级配置NVIC_Config(NVIC_PriorityGroup_1 ,MAX3483_USART_IRQn ,1 ,1);// 使能串口3接收中断USART_ITConfig(MAX3483_USART, USART_IT_RXNE, ENABLE);USART_ITConfig(MAX3483_USART, USART_IT_IDLE, ENABLE);//USART_IT_IDLE为帧数据接收// 使能串口3USART_Cmd(MAX3483_USART, ENABLE);
}
/*******************************************************************************
* Function Name  : NVIC_Config
* Description    : NVIC配置
* Input          : @arg NVIC_PriorityGroup_x(x:0~4)
*                  @ref IRQn_Type
*                  @ref NVIC_Priority_Table
*                  @ref NVIC_Priority_Table
* Output         : 无
* Return         : 无
*******************************************************************************/
static void NVIC_Config( uint32_t NVIC_PriorityGroup , \IRQn_Type NVIC_IRQChannel ,   \uint8_t PreemptionPriority ,  \uint8_t SubPriority )
{NVIC_InitTypeDef NVIC_InitStructure;/* 嵌套向量中断控制器组选择 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup);/* 配置为中断源 */NVIC_InitStructure.NVIC_IRQChannel = NVIC_IRQChannel;/* 抢断优先级*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriority;/* 子优先级 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority;/* 使能中断 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* 初始化配置NVIC */NVIC_Init(&NVIC_InitStructure);
}

这是三个用来发送不同数据的函数

/*******************************************************************************
* Function Name  : Usart_SendByte
* Description    : 发送一个字节
* Input          : @arg USARTx
*                  @arg data(8位)
* Output         : 无
* Return         : 无
*******************************************************************************/
void Usart_SendByte(USART_TypeDef* USARTx, uint8_t data)
{USART_SendData(USARTx, data);while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
}/*******************************************************************************
* Function Name  : Usart_SendHalfWord
* Description    : 发送二个字节
* Input          : @arg USARTx
*                  @arg data(16位)
* Output         : 无
* Return         : 无
*******************************************************************************/
void Usart_SendHalfWord(USART_TypeDef* USARTx, uint16_t data)
{uint8_t temp_h,temp_l;temp_h = (data&0xFF00) >> 8 ;temp_l = data&0xFF;USART_SendData(USARTx, temp_h);while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );USART_SendData(USARTx, temp_l);while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
}/*******************************************************************************
* Function Name  : Usart_SendStr
* Description    : 发送字符串
* Input          : @arg USARTx
*                  @arg *str
* Output         : 无
* Return         : 无
*******************************************************************************/
void Usart_SendStr(USART_TypeDef* USARTx, uint8_t *str)
{uint8_t i=0;do{Usart_SendByte(USARTx, *(str+i));i++;}while(*(str+i)!='\0');while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );//TC是一连串数据发送完毕的标志位
}

2、与MAX3483相关的代码部分

.h文件

#ifndef __OUT_DATA_232_H
#define __OUT_DATA_232_H
#include "stm32f10x.h"void set_MAX3483_out(void);//设置MAX3483芯片使得能够发送数据
void set_MAX3483_in(void);//设置MAX3483芯片使得能够接收中断和数据#endif /* __OUT_DATA_232_H */

.c文件

#include "out_data_232.h"
#include "main.h"/*******************************************************************************
* Function Name  : set_MAX3483_out
* Description    : 设置MAX3483芯片使得能够发送数据
* Input          : 无
* Output         : 无
* Return         : 无
*******************************************************************************/
void set_MAX3483_out(void)
{GPIO_SetBits(MAX3483_485_DE_PORT, MAX3483_485_DE_PIN);//设置MAX3483芯片使得能够发送数据GPIO_SetBits(MAX3483_485_RE_PORT, MAX3483_485_RE_PIN);//设置MAX3483芯片使得能够发送数据
}/*******************************************************************************
* Function Name  : set_MAX3483_in
* Description    : 设置MAX3483芯片使得能够接收中断和数据
* Input          : 无
* Output         : 无
* Return         : 无
*******************************************************************************/
void set_MAX3483_in(void)
{GPIO_ResetBits(MAX3483_485_DE_PORT, MAX3483_485_DE_PIN);//设置MAX3483芯片使得能够接收中断和数据GPIO_ResetBits(MAX3483_485_RE_PORT, MAX3483_485_RE_PIN);//设置MAX3483芯片使得能够接收中断和数据
}

3、中断服务代码

关键的代码部分在这hhhh,具体解释就略去了,代码注释很详细。
调试过程中的插曲

while( USART_GetFlagStatus(MAX3483_USART, USART_FLAG_TC) == RESET );//TC是一连串数据发送完毕的标志位

下面.c文件中的此处,不能使用库函数USART_GetITStatus,否则会卡死,具体没深究了,待有空了慢慢DEBUG。
注:数据回传功能最好不要写在中断中,因为要考虑其他情况,要遵守“中断处理函数越短越好,越简单越好 ”的原则。

.c文件

uint8_t ch[10];//串口接收缓存数组
uint8_t RxCounter = 0;//缓存数组计数标志// 串口3中断服务函数
void USART3_IRQHandler(void)
{//一个字节进一次中断,一帧结束进一次中断if(USART_GetITStatus(MAX3483_USART, USART_IT_RXNE) != RESET)//接收到一个字节,标志位置位{ch[RxCounter++] = USART_ReceiveData(MAX3483_USART);//接收到一个字节,缓存进数组} else if(USART_GetITStatus(MAX3483_USART,USART_IT_IDLE) != RESET)//接收到一帧数据,标志位置位{MAX3483_USART->SR;//先读SRMAX3483_USART->DR;//再读DRRxCounter = 0;//一帧数据接收结束,标志重置/******************************************************************************/
/*                                  DEBUG                                     */
/******************************************************************************/set_MAX3483_out();//设置MAX3483芯片使得能够发送数据for(uint8_t j = 0;j < 10 ;j++){Usart_SendByte(MAX3483_USART, ch[j]);//DEBUG}while( USART_GetFlagStatus(MAX3483_USART, USART_FLAG_TC) == RESET );//TC是一连串数据发送完毕的标志位set_MAX3483_in();//设置MAX3483芯片使得能够接收中断和数据
/******************************************************************************/
/*                                  DEBUG                                     */
/******************************************************************************/}
}

main函数记得默认打开接收,否则无法接收数据产生中断

set_MAX3483_in();//设置MAX3483,上位机向单片机发送数据//(默认保持接收状态,才可进入串口中断服务)

四、末尾

写完发现其实没啥语言描述,哈哈哈哈哈.
经典CV工程师,CTRL+C/CTRL+V。

STM32串口中断接收帧数据并返回给上位机总结(配合MAX3483)相关推荐

  1. STM32串口中断接收实验

    STM32串口中断接收实验的详细说明 准备 代码实现 总结 准备 材料:STM32F407ZGT6最小系统板,串口1通过跳线帽连接到了CH340上. 需求:从电脑向板子的串口1发送一个字符串(以回车和 ...

  2. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

  3. STM32串口读取一帧数据USART_IT_IDLE

    stm32 串口读取数据中断 USART_IT_RXNE:读取到一个数据产生中断 USART_IT_IDLE:读取到一帧数据产生中断 以前串口读取一帧数据的方法:收到数据后重置定时器的值,等到定时器超 ...

  4. STM32串口中断接收HAL库超详解析

    之前一直用的固件库跑c8t6和zet6,现在有幸接触到stm32H743用到HAL库,学习嘛都是踩坑,csdn,然后...理解底层库的代码 本人有幸遇到了H7的串口中断接收只进去一次的Bug,于是马上 ...

  5. STM32串口中断接收方式详细比较

    本例程通过PC机的串口调试助手将数据发送至STM32,STM32通过SP3232芯片采用中断接收方式完成,然后接收数据后将所接收的数据又发送至PC机. 实例一: void USART1_IRQHand ...

  6. STM32串口中断接收标记USART_RX_STA 学习

    对于串口中断函数USART_RX_STA接收标记位解析,费话不多说了,直接上代码. #define USART1_REC_LEN 200 u8 USART1_RX_BUF[USART1_REC_LEN ...

  7. stm32 USART_IT_IDLE中断 一帧数据

    USART_IT_IDLE和USART_IT_RXNE区别 当接收到1个字节,会产生USART_IT_RXNE中断 当接收到一帧数据,就会产生USART_IT_IDLE中断 清中断方法 //USART ...

  8. 教你使用stm32接收串口的一帧数据!

    stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!因此在stm32的串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说 ...

  9. STM32使用串口中断接收HWT101的数据

    因研究生阶段项目需求,需要采用HWT101给单片机提供角度信息. HWT101是维特智能公司下的一款角度传感器,它可以通过计算角速度测量绕Z轴旋转的水平方向的偏航角,具有高精度.几乎无漂移.不受磁场干 ...

最新文章

  1. LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
  2. 一周冲刺计划第七天11.21
  3. 一些常规形几何形状的绘制和效果填充(三)
  4. linux下tmp目录属性,Linux:文件夹属性及umask
  5. 平面海报设计素材|几何风格极简流行风,继续
  6. c语言中线程的特性,具有C 11多线程的特征库
  7. 转太强了!一文讲透了标准Web系统的架构分层~
  8. jquery学习系列1(Ready)
  9. windows版redis安装教程
  10. 如何学习摸具设计?怎样学习摸具设计?学习摸具设计的方法。
  11. 认识netty+实战
  12. 修改VNR源码接入新版有道中文翻译API
  13. RabbitMQ 使用规范
  14. 《如何有效阅读一本书》:读再多书,不如先学会如何读书
  15. 2022年30本新年书单(要么旅行,要么读书,身体和灵魂总有一个在路上)
  16. linux查看压缩文件的大小,Linux下不解压压缩文件如何直接查看某个文件大小
  17. JAVA 算法中Map 使用技巧,持续更新,边学边更
  18. HDU - 3194 Median
  19. 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
  20. vscode查看历史代码_VSCode中数据科学家的四大代码查看器

热门文章

  1. 北京旅行——博物馆概览
  2. 单细胞论文记录(part14)--CoSTA: unsupervised convolutional neural network learning for ST analysis
  3. 反向传播求偏导原理简单理解
  4. 区间重合算法:多个时间段重合判断:python代码实现
  5. 张氏标定法求相机模型中的内参(Intrinsics)
  6. 区块链开发语言python_Python:不同区块链智能合约开发语言的选择
  7. Several ports (8005, 8080, 8009) required by MyEclipse Tomcat v7.0 are already in use.
  8. iOS 第三方库汇总(超全!!!!)
  9. SpringBoot集成Spring Data JPA多数据源(二)
  10. 关于android开发中使用VideoView切换视频源时同时改变大小会出现下一个视频第一帧为上一个视频最后显示帧问题解决