STM32F103串口实现MODBUS通信

Modbus是一种串行通信协议,是Modicon于1979年,为使用可编程逻辑控制器(PLC)而发表的。Modbus是工业领域通信协议的业界标准,并且现在是工业电子设备之间相当常用的连接方式。Modbus比其他通信协议使用的更广泛的主要原因有:
【1】公开发表并且无版税要求
【2】相对容易的工业网络部署
【3】对供应商来说,修改移动原生的位元或字节没有很多限制

1、实现f103作为从机,上位机作为主机通信(从站程序)。

1.1 配置时钟

作为保证串口接收数据完整。

//通用定时器3中断初始化
//APB1为SYSCLK的2分频,即36M,因此定时器时钟为APB1的2倍频,即72M
//arr:自动重装值
//psc:时钟分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能时钟
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; /设置用来作为TIMx时钟频率数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); /使能指定的TIM3中断,允许更新中断

	//中断优先级NVIC配置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


	TIM_Cmd(TIM3, ENABLE);  //使能TIMx					 
}
//定时器3中断服务程序,100us
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
		{
			TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清理TIMx更新中断标志
			if(time3_usart1<=200)
        time3_usart1++;
			if(time3_usart2<=200)
        time3_usart2++;
			if(time3_usart3<=5000)
        time3_usart3++;
		}
		
}

1.2 配置串口USART

配置使用到串口,用于实际的通信端口。

1.2.1 串口优先级配置

 /**
  * @brief 配置嵌套向量中断控制器NVIC
  * @param  ÎÞ
  * @retval ÎÞ
  */
static void NVIC_usart1_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 嵌套向量中断控制器组选择 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  
  /*配置USART为中断源*/
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART1_IRQ;
  /* 抢断优先级*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  /* 子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /*初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

static void NVIC_usart2_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART2_IRQ;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);
}

1.2.2 串口初始化

void USART1_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// 打开串口GPIO的时钟
	DEBUG_USART1_GPIO_APBxClkCmd(DEBUG_USART1_GPIO_CLK, ENABLE);
	
	// 打开串口外设的时钟
	DEBUG_USART1_APBxClkCmd(DEBUG_USART1_CLK, ENABLE);

	// 将USART Tx的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART1_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DEBUG_USART1_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART1_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(DEBUG_USART1_RX_GPIO_PORT, &GPIO_InitStructure);
	
	// 配置串口的工作参数
	// 配置波特率
	USART_InitStr
  • 14
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: stm32f103是一款32位的单片机芯片,常用于嵌入式系统和物联网设备中。在stm32f103串口通信功能中,通过串口可以实现与上位机的通信串口通信协议是指不同设备之间传递数据所遵循的一种规定和约定。对于stm32f103与上位机通信,常用的协议有UART、RS232、RS485等。 UART(通用异步收发传输)是一种常用的串口通信协议,在stm32f103中有多个串口接口可以用于UART通信。UART通过发送和接收数据帧来实现通信。通常,上位机会发送一帧数据给stm32f103,然后接收单片机返回的数据。 RS232是一种常见的串口通信协议,使用基于电压的信号进行通信。RS232在物理层和电气层面上定义了通信规范,可以在较长距离上进行通信。 RS485是一种多点通信串口通信协议,常用于多个设备之间的通信。RS485比RS232更适合多个设备之间的通信,可以在1200米的距离上进行通信。 当stm32f103与上位机进行通信时,通信双方需要事先约定好使用的通信协议,包括数据传输的格式、通信速率、数据位数、校验位、停止位等参数的设置。 总之,stm32f103通过串口与上位机进行通信时,需要根据具体需求选择合适的串口通信协议,并在通信过程中遵循相应的协议规范和参数设置。这样才能确保通信的稳定和可靠。 ### 回答2: STM32F103是一款32位的ARM Cortex-M3处理器,具有很多功能丰富的外设模块,其中包括串口(USART)模块,用于与上位机进行通信串口通信协议是一种用于在通信设备之间发送和接收数据的规则集合。为使STM32F103与上位机进行通信,我们需要理解如何使用正确的串口通信协议。 首先,我们需要选择适当的串口通信模式和参数设置。STM32F103串口模块支持多种通信模式,包括UART、USART、LIN和IrDA。在选择模式时,需要考虑通信的要求和上位机的支持能力。 然后,我们需要配置串口的参数,包括波特率、数据位、停止位和校验位等。这些参数必须与上位机的配置相匹配,以确保数据可以正确地传输和解析。 在STM32F103上编程时,我们可以使用相关的库函数或驱动程序来配置串口实现通信。例如,在HAL库中,可以使用以下函数进行串口配置和操作: 1. `HAL_UART_Init()`:用于初始化串口模块。 2. `HAL_UART_Transmit()`:用于向上位机发送数据。 3. `HAL_UART_Receive()`:用于接收上位机发送的数据。 此外,我们还需要定义一种上位机通信协议来组织数据的传输和解析。例如,可以使用常见的协议,如ASCII、Modbus或自定义协议。其中,ASCII协议将数据以ASCII码的形式发送和解析,而Modbus协议是一种通用的串行通信协议,支持多种数据类型和功能码。自定义协议可以根据特定的需求来定义数据传输的格式和解析规则。 最后,在STM32F103上编写完整的通信程序时,需要根据协议规范实现数据的解析和处理逻辑,以实现与上位机的稳定通信。 总结来说,实现STM32F103与上位机的通信涉及选择适当的串口模式和参数,配置串口及相关库函数的调用,定义上位机通信协议以及编写数据处理逻辑。通过合理的设计和编程,可以实现可靠的STM32F103与上位机的通信。 ### 回答3: STM32F103是一款高性能的单片机,具有多个串口接口可以用于与上位机进行通信。在与上位机通信时,需要确定通信协议,以便双方能够正确地交换数据。 首先,STM32F103串口通信协议可以选择使用UART(通用异步收发器)协议。UART协议是一种串行通信协议,通过一条数据线和一条时钟线来实现数据的传输。在使用UART协议时,需注意以下几点: 1. 波特率:双方需要约定好相同的波特率,波特率决定了数据传输的速率。常用的波特率有9600、115200等。 2. 数据位:可以选择使用7位或8位数据位。一般情况下,8位数据位使用更为普遍。 3. 停止位:可以选择使用1位或2位停止位。一般情况下,使用1位停止位即可。 4. 校验位:可选择使用奇校验、偶校验或无校验。校验位用于检测数据传输过程中的错误。 5. 流控制:可以选择使用硬件流控制(如RTS/CTS)或软件流控制(如XON/XOFF)来控制数据的传输速度和数据的流动。 上位机通常通过串口调试助手等工具与STM32F103进行通信。具体的通信协议可以根据需要进行约定,例如可以约定一条命令由特定的起始字节、命令内容和校验位组成,从而实现双方的数据交换和通信。 总之,STM32F103通过串口可以与上位机进行通信通信协议的选择以及具体通信规则需要双方协商确定。以上是关于STM32F103串口与上位机通信协议的说明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值