#申请原创# @21小跑堂
6.IWDG+CRC+HASH测试
6.1IWDG测试
IWDG(Independent Watchdog)独立看门狗,独立看门狗一般用来检测和解决由程序引起的故障,如果程序因为某些原因一直卡在一个位置,超过一段时间没有“喂狗”就会使系统复位。
打开STM32CubeMX,先看看时钟树,找到IWDG,可以看到IWDG是用的32Khz的内部时钟
找到IWDG的设置开启它,配置超时时间为1秒
接下来写个程序,按键按下时保持死循环,看看看门狗会不会触发
void usercode_loop(void)
{
yuyy_delay_ms(400);
HAL_GPIO_TogglePin(LED2_YELLOW_GPIO_Port,LED2_YELLOW_Pin);
yuyy_delay_ms(200);
HAL_GPIO_TogglePin(LED3_RED_GPIO_Port,LED3_RED_Pin);
yuyy_delay_ms(200);
HAL_IWDG_Refresh(&hiwdg);
if(HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(LED1_GREEN_GPIO_Port,LED1_GREEN_Pin,GPIO_PIN_SET);
yuyy_delay_ms(10);
while(HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin) == GPIO_PIN_SET);
}
}
这段代码会让红色和黄色LED循环亮起熄灭,按下按键后绿色LED会亮起,触发看门狗复位后所有LED都会熄灭,运行效果
6.2CRC测试
CRC(Cyclic Redundancy Check)即循环冗余校验码,是数据通信领域中最常用的一种查错校验码,常用于验证接收到的数据是否完整,例如之前用到的DHTC12在接收到数据后就要用CRC来校验。
STM32H563拥有硬件CRC校验,接下来写个程序,用CRC校验串口发送的数据,并将校验结果用串口返回
打开STM32CubeMX,找到CRC并开启,先用默认的CRC测试一下
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
uint8_t out[20] = {0},len=0;
uint32_t crc;
if(huart->RxEventType == HAL_UART_RXEVENT_IDLE)
{
crc = HAL_CRC_Calculate(&hcrc,uartrxbuffer,Size);
len = sprintf(out,"CRC结果:%08X",crc);
HAL_UART_Transmit(huart,out,len,100);
HAL_UARTEx_ReceiveToIdle_IT(huart,uartrxbuffer,UARTRXBUFFERLEN);
}
}
看看效果
另外还可以使用其它CRC校验公式,换成CRC16的试试
计算结果
6.3HASH测试
HASH算法能将将任意长度的二进制明文映射为较短的二进制串的算法,该过程是不可逆的,并且不同的明文很难映射为相同的HASH值。
STM32H563提供了HASH硬件加速,接下来尝试一下
打开STM32CubeMX,找到HASH并开启
仍然通过串口输入数据,将HASH结果返回
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
uint8_t sha256[32];
if(huart->RxEventType == HAL_UART_RXEVENT_IDLE)
{
HAL_HASH_Start(&hhash,uartrxbuffer,Size,sha256,1000);
HAL_UART_Transmit(huart,sha256,32,100);
HAL_UARTEx_ReceiveToIdle_IT(huart,uartrxbuffer,UARTRXBUFFERLEN);
}
}
计算结果
|