STM32F103 -- LIN从机通讯 -- 程序代码 -- 详细讲解版(2万字长文)

本文详细介绍了STM32F103如何实现LIN从机通讯,包括usart.c的LIN模式初始化和串口代码,lin_buffer.c的环形缓冲区代码,以及lin_driver.c的从机驱动代码。通过讲解关键函数和代码实现,帮助理解LIN从机通信的全过程。
摘要由CSDN通过智能技术生成

        由于本人已经上班,无法有更多时间回复大家,故代码文件网盘自取,链接在文章最后。

        由于本人已经上班,无法有更多时间回复大家,故代码文件网盘自取,链接在文章最后。

        由于本人已经上班,无法有更多时间回复大家,故代码文件网盘自取,链接在文章最后。

        关于LIN,这里就不多介绍,但写代码前还是得知道我们应该发什么,接收什么,这一部分可以看看我对LIN总线的介绍博文,博文中还加入了我的一点理解。

        知道了我们应该发什么接收什么,那么下面内容就讲解我们如何进行收发,如何编写代码。

        主要代码分为3个文件,usart文件是对GPIO端口和串口Lin模式的初始化,lin_buffer文件是对串口环形缓冲区的编写,lin_driver文件是Lin从机模式驱动代码。通过这三个文件的代码便可实现STM32F103的LIN从机通讯。


目录

一.  全部完整 .H 文件代码

1. usart.h 文件代码 

2. lin_buffer.h 文件代码 

3.lin_driver.h 文件代码 

二.  全部完整 .C 文件代码

1. usart.c 文件代码 

2. lin_buffer.c 文件代码 

3.lin_driver.c 文件代码  

 三.  usart.c 初始化代码讲解

1. 串口的LIN模式初始化

2. 串口的LIN模式代码编写

四.  lin_buffer.c 环形缓冲区代码讲解

1. 环形缓冲区简介

2. 为什么用环形缓冲区

3. 环形缓冲区代码编写

(1)写缓冲区

(2)读缓冲区

五.  lin_driver.c 从机驱动代码讲解

1.  LIN同步间隔段发送函数   

2. LIN发送多字节函数   

3. 校验和获取函数   

4. PID获取函数   

5. LIN从机中断函数

6. LIN从机接收处理函数

六. main.c主函数代码

STM32可以通过UART模块实现LIN通信,需要在代码中配置UART的LIN模式,并设置波特率为20Kbps。同时,还需要在发送数据时添加LIN帧头和校验位,接收数据时需要进行校验和解析。 以下是一个简单的示例代码: ```c // 配置UART为LIN模式 huart1.Instance = USART1; huart1.Init.BaudRate = 20000; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } // 发送LIN帧 uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; uint8_t header = 0x55; uint8_t checksum = 0x00; HAL_UART_Transmit(&huart1, &header, 1, HAL_MAX_DELAY); HAL_UART_Transmit(&huart1, data, 8, HAL_MAX_DELAY); for (int i = 0; i < 8; i++) { checksum += data[i]; } checksum = ~checksum; HAL_UART_Transmit(&huart1, &checksum, 1, HAL_MAX_DELAY); // 接收LIN帧 uint8_t rx_data[8]; uint8_t rx_header; uint8_t rx_checksum = 0x00; HAL_UART_Receive(&huart1, &rx_header, 1, HAL_MAX_DELAY); HAL_UART_Receive(&huart1, rx_data, 8, HAL_MAX_DELAY); HAL_UART_Receive(&huart1, &rx_checksum, 1, HAL_MAX_DELAY); for (int i = 0; i < 8; i++) { rx_checksum += rx_data[i]; } rx_checksum = ~rx_checksum; if (rx_header == 0x55 && rx_checksum == 0xFF) { // LIN帧接收成功 } ```
评论 89
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴朗luo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值