[开发工具] STM32CubeMX_16 | 使用硬件CRC校验数据(以SHT30为例)

[复制链接]
1405|25
 楼主| alternate 发表于 2020-4-9 10:37 | 显示全部楼层 |阅读模式
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件CRC外设校验数据,并用SHT30温湿度传感器为例检查是否可以正确校验。
 楼主| alternate 发表于 2020-4-9 10:38 | 显示全部楼层
1. 准备工作
硬件准备
开发板
首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):
358315e8e8a881a53f.png
 楼主| alternate 发表于 2020-4-9 10:38 | 显示全部楼层
软件准备
    需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;
    准备一个串口调试助手,这里我使用的是Serial Port Utility;

Keil MDK和串口助手Serial Port Utility 的安装包都可以在文末关注公众号获取,回复关键字获取相应的安装包:
102255e8e8ab4cb182.png
 楼主| alternate 发表于 2020-4-9 10:39 | 显示全部楼层
2.生成MDK工程
选择芯片型号
打开STM32CubeMX,打开MCU选择器:
611575e8e8aca3bb5e.png
 楼主| alternate 发表于 2020-4-9 10:39 | 显示全部楼层
搜索并选中芯片STM32L431RCT6:
781205e8e8aeb2b361.png
 楼主| alternate 发表于 2020-4-9 10:40 | 显示全部楼层
配置时钟源
     如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
     如果使用默认内部时钟(HSI),这一步可以略过;

这里我都使用外部时钟:
289885e8e8b10712dc.png
 楼主| alternate 发表于 2020-4-9 10:41 | 显示全部楼层
配置串口
小熊派开发板板载ST-Link并且虚拟了一个串口,原理图如下:
270255e8e8b36da4bb.png
这里我将开关拨到AT-MCU模式,使PC的串口与USART1之间连接。
 楼主| alternate 发表于 2020-4-9 10:42 | 显示全部楼层
接下来开始配置USART1:

731655e8e8b7add030.png
 楼主| alternate 发表于 2020-4-9 10:42 | 显示全部楼层
配置CRC外设
首先激活CRC:
669755e8e8b96e45ae.png
 楼主| alternate 发表于 2020-4-9 10:43 | 显示全部楼层
然后配置CRC校验的初始值:

这里我们以SHT30为例,其数据手册中已给出,如图:
712205e8e8bbd7c616.png
 楼主| alternate 发表于 2020-4-9 10:43 | 显示全部楼层
据此,CRC外设的配置如下:

662045e8e8bdb80c5f.png
 楼主| alternate 发表于 2020-4-9 10:44 | 显示全部楼层
配置时钟树
STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:
687435e8e8bf67b393.png
 楼主| alternate 发表于 2020-4-9 10:44 | 显示全部楼层
生成工程设置

379925e8e8c189d366.png
 楼主| alternate 发表于 2020-4-9 10:45 | 显示全部楼层
代码生成设置
最后设置生成独立的初始化文件:
886885e8e8c3cdd804.png
 楼主| alternate 发表于 2020-4-9 10:46 | 显示全部楼层
生成代码
点击GENERATE CODE即可生成MDK-V5工程:
54565e8e8c5dd1142.png
 楼主| alternate 发表于 2020-4-9 10:47 | 显示全部楼层
本帖最后由 alternate 于 2020-4-9 11:02 编辑

3. 在MDK中编写、编译、下载用户代码
重定向printf( )函数
参考:【STM32Cube_09】重定向printf函数到串口输出的多种方法。
https://bbs.21ic.com/icview-2938342-1-1.html



 楼主| alternate 发表于 2020-4-9 10:48 | 显示全部楼层
测试CRC校验
在main.c文件中添加如下代码:
  1. /* USER CODE BEGIN Includes */
  2. #include <stdio.h>
  3. /* USER CODE END Includes */
 楼主| alternate 发表于 2020-4-9 10:48 | 显示全部楼层
然后修改main函数:

  1. int main(void)
  2. {
  3.     /* USER CODE BEGIN 1 */
  4.     uint8_t dat[2] = {0xBE, 0xEF};
  5.     uint8_t crc = 0;

  6.     /* USER CODE END 1 */
  7.     HAL_Init();

  8.     SystemClock_Config();

  9.     MX_GPIO_Init();
  10.     MX_CRC_Init();
  11.     MX_USART1_UART_Init();

  12.     /* USER CODE BEGIN 2 */
  13.     printf("Test CRC check:\n");
  14.     crc = HAL_CRC_Accumulate(&hcrc, (uint32_t*)dat, 2);
  15.     printf("crc = %#x\n", crc);
  16.     /* USER CODE END 2 */

  17.     while (1)
  18.     {
  19.     }
  20. }
 楼主| alternate 发表于 2020-4-9 10:49 | 显示全部楼层
测试结果
测试结果如下:
249165e8e8d1ebbd93.png
 楼主| alternate 发表于 2020-4-9 10:49 | 显示全部楼层
至此,我们已经学会如何使用硬件CRC校验SHT30的数据,下一节将讲述如何使用硬件SPI驱动LCD屏幕(ST7789)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

457

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部