慢慢的来郑州上班也三周了,搞了两个项目的,也从中新学到了点东西...记录一下
项目一(三相电芯片的数据读取)

项目简介:
mcu通过spi读取三相电芯片寄存器里的数据,按照modbus+rtu协议把读到的数据再作为应答从机返回给读取设备。
其实项目很简单说白了就是把三相电的芯片数据的输出方式由spi转成485,协议就是遵从modbus。而且max485芯片还做了硬件使能。
学习收货:
从中学到的是使用debug仿真,以前调试一直用的uart的printf,当然也有rtt的打印,在这项目里硬件没有引多余的uart用来调试,领导现场简单教了一下debug,当当然以前师傅也有带着用过,不过那时候迷迷糊糊的看过也就忘了,只有是现在不得不用了才会熟练些。

项目二(lora数传)

项目简介:
还是modbus+rtu的协议 上位机发送命令给mcu,mcu再通过lora_send_spi转发给相应的的设备,从机设备接收到lora传送的数据后通过uart转发给传感器,来读取传感器数据,传感器返回的数据再调用lora_send_spi传输回主机设备,主机mcu再通过uart把读到的传感器数据传回上位机。上位机也可以是mcu,另外当传送距离超过规定时候需增加一台中继设备,做为中转站。所有设备共用的是一套程序。最后要编写上位机。
相关协议:(有省略)

学习收货:
1、HardFault问题的解决
移植lora代码,debug时候进入HardFault且出不来了。以前从来没遇到过,还是蛮棘手的。看了几篇文章,知道了是咋回事,但是没解决问题,看哔站的一步一步走找到了问题所在并解决。
【0基础】必学MCU的Hardfault异常调试与函数调用_哔哩哔哩_bilibili

2、找到了标准库版的uart空闲中断demo(以前一直用hal库没咋用过标准库的)
链接:https://pan.baidu.com/s/1uGLSneChe8DMpkpuBEAgEw?pwd=1234 提取码:1234
3、串口错误中断处理(下面的是hal库,标准库的有点不太一样需要手搓了),反正就是当串口出现错误时候一种自我解决的处理机制,但是目前为止还没遇到过串口导致死机的,不过老大说一些用户不懂的乱搞会出现,他以前吃过亏,那就加上把。
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
// 检查是否是UART2的错误
if(huart == &huart2)
{
// 1. 检查奇偶校验错误(Parity Error)
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
{
// 可选:通过DMA发送错误码"00000"到其他UART用于调试
// HAL_UART_Transmit_DMA(&huart1, (uint8_t *)"00000", 5);
// 解锁UART(防止死锁)
__HAL_UNLOCK(huart);
// 清除奇偶校验错误标志
__HAL_UART_CLEAR_PEFLAG(huart);
}
// 2. 检查帧错误(Frame Error)
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
{
// 可选:发送错误码"00001"
// HAL_UART_Transmit_DMA(&huart1, (uint8_t *)"00001", 5);
__HAL_UNLOCK(huart);
// 清除帧错误标志
__HAL_UART_CLEAR_FEFLAG(huart);
}
// 3. 检查噪声错误(Noise Error)
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
{
// 可选:发送错误码"00002"
// HAL_UART_Transmit_DMA(&huart1, (uint8_t *)"00002", 5);
__HAL_UNLOCK(huart);
// 清除噪声错误标志
__HAL_UART_CLEAR_NEFLAG(huart);
}
// 4. 检查过载错误(Overrun Error)
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)
{
// 可选:发送错误码"00003"
// HAL_UART_Transmit_DMA(&huart1, (uint8_t *)"00003", 5);
__HAL_UNLOCK(huart);
// 清除过载错误标志
__HAL_UART_CLEAR_OREFLAG(huart);
}
// 重新配置UART2:
// 1. 使能空闲中断(用于检测数据接收完成)
// 2. 重新启动DMA接收,将数据存储到RS485_USART_RX_BUF缓冲区
// 3. 错误计数器递增,用于统计错误次数
rs485_error_Num++;
// 注意:此处理方式适用于RS485通信,错误恢复后重新开始接收
}
}
4、防止死机处理措施,加看门狗,这个没啥好说的,第二个就是HardFault里边加重启函数。不展示了。
5、使用visual studio 制作上位机 c#