
此示例演示了在PIC18F47Q10微控制器中使用CRC外围的。 PIC MicroControllers中的CRC模块是硬件实现的校验和生成器,该校验和发电机可通过可编程多项式计算16位CRC。它与内存扫描仪相结合,以进行更快的CRC计算。内存扫描仪可以自动向CRC模块提供数据,此示例使用CRC-16-CCITT标准参数。该演示首次对设备进行编程后,计算程序内存的CRC并将其存储在控制器的EEPROM区域中。在随后的电源上,该设备在启动时计算Flash CRC,并根据存储在Eeprom区域中的CRC进行检查。如果不匹配,程序执行表示CRC错误。可以在设备操作期间定期安排此CRC检查,以确保闪存完整性。

图1:程序流程图
凭借完整的程序和调试功能,PIC18F47Q10好奇心Nano评估套件为新设计提供了完整的支持。该套件使用Mplab®X IDE和MPLAB®代码配置器(MCC),可在PIC18F47Q10上访问智能模拟和核心独立外围设备。

图2:PIC18F47Q10好奇心纳米板
Microchip的免费MPLAB X IDE,编译器和MPLAB代码配置器(MCC)图形代码生成器在整个应用程序固件开发中都使用,以提供简单且轻松的用户体验。以下是用于此演示应用程序的工具版本:
注意:要运行演示,安装的工具版本必须相同或以后。此示例未使用以前的版本进行测试。
首先创建一个新项目并打开MCC
配置硬件外围设备
打开“系统”下拉菜单下的“时钟控制设置”中的“项目资源”选项卡中的“系统”下拉菜单。

图3:时钟控制
打开“系统资源”选项卡中“系统”下拉菜单下存在的配置位设置。

图4:配置位
将CRC,UART2,TMR0和NVM外围设备添加到项目中。
确保在设备资源选项卡中添加驱动程序下拉菜单下存在的外围设备。

图5:外围设备
配置CRC外围
验证CRC已启用
验证使用预定义的多项式已启用
从预定义的多项式列表中选择CRC-16-CCITT
将种子价值设置为0xffff
将增强模式设置为未使用0增强的数据
将数据字宽度(位)设置为16(因为闪存数据宽度为16位)
验证启用扫描仪(我们将使用扫描仪从内存获取数据)

图6:CRC配置
验证设置生成EEPROM API(我们将使用这些API编写EEPROM数据)

图7:内存配置
在此演示中,UART2用于在终端窗口上传输数据,以显示存储和计算的CRC值以及如果检测到CRC中的任何不匹配的错误消息。

图8:UART2配置
在此演示计时器中,0用于生成一个定期事件,以检查程序内存的CRC。计时器0期间可以调整以更改CRC计算频率。

图9:计时器0配置
配置设备上使用的引脚
使用PIN Manager:网格视图将RE0设置为输出引脚。 LED连接到引脚RE0。
选择RD0作为EUSART2:TX2输出。
RB7用于RX2。

图10:PIN管理器:网格视图
使用项目资源→系统→引脚,将自定义名称作为LED添加为LED。检查“启动高”复选框,以获取LED PIN RE0,以关闭LED。

图11:PIN经理
打开main.c文件。
使用MCC生成的API计算Flash CRC的步骤:
CRC_SetScannerAddressLimit(START_ADDRESS, END_ADDRESS);
(此演示中使用的启动地址为0x00000,使用的终端地址为0x7ffe。因此,用于CRC计算的内存的总块大小为32KB。)
注意:如果程序大小超过32kb,则通过更改结束地址来增加块大小
CRC_StartScanner();
while(CRC_IsCrcBusy() || CRC_IsScannerBusy());
CRC_GetCalculatedResult(false,0x00);

图12:编程设备
//#define ERASE_EEPROM_CRC ,以删除存储CRC的EEPROM位置。这确保先前在该位置存储的CRC值没有任何不正确或更早的CRC值。构建项目并编程设备。观察终端窗口上显示的消息。(可以使用任何终端模拟器(例如MPLAB数据可视化器)。将BAUD速率设置为9600。)

图13:EEPROM擦除消息
#define ERASE_EEPROM_CRC行。构建项目并编程设备。
图14:首次CRC计算

图15:定期CRC
注意:图15中的CRC使用具有-0优化级别的编译器v2.41计算。
CRC模块是一种实现的硬件校验和生成器,可以使用可编程多项式计算16位CRC。它还使用内存扫描仪功能,该功能为CRC计算提供了自动闪光灯读取。使用MCC GUI,配置CRC模块很容易。除了模块配置外,MCC还可以生成准备使用API,用于在PIC MicroController中使用CRC和内存扫描硬件外围设备的程序内存的无用计算。