#include "main.h" #include "bsp_pin.h" void bsp_pin_init(GPIO_TypeDef *port, uint16_t pin, uint8_t mode) { GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = pin; GPIO_InitStruct.Mode = (mode == 0) ? GPIO_MODE_OUTPUT_PP : GPIO_MODE_INPUT; if (mode == 1) GPIO_InitStruct.Pull = GPIO_PULLUP; else if (mode == 2) GPIO_InitStruct.Pull = GPIO_PULLDOWN; else GPIO_InitStruct.Pull = GPIO_NOPULL; if (mode == 0) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(port, &GPIO_InitStruct); } void bsp_dwt_init(void) { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // 使能 DWT DWT->CYCCNT = 0; // 清零周期计数器 DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; // 使能周期计数器 } void delay_us(int nus) { #ifdef USE_FREERTOS uint32_t start = DWT->CYCCNT; // 记录起始计数值 uint32_t ticks = nus * (SystemCoreClock / 1000000); // 计算需要的时钟周期数 while ((DWT->CYCCNT - start) < ticks); // 等待达到目标周期数 #else uint32_t ticks; uint32_t told,tnow,tcnt=0; uint32_t reload=SysTick->LOAD; //LOAD的值 ticks=nus*72; //需要的节拍数 told=SysTick->VAL; //刚进入时的计数器值 while(1) { tnow=SysTick->VAL; if(tnow!=told) { if(tnow=ticks)break; //时间超过/等于要延迟的时间,则退出. } }; #endif } void hard_fault_handler_c(unsigned int *hardfault_args) { unsigned int stacked_r0 = hardfault_args[0]; unsigned int stacked_r1 = hardfault_args[1]; unsigned int stacked_r2 = hardfault_args[2]; unsigned int stacked_r3 = hardfault_args[3]; unsigned int stacked_r12 = hardfault_args[4]; unsigned int stacked_lr = hardfault_args[5]; // 链接寄存器 unsigned int stacked_pc = hardfault_args[6]; // 程序计数器 unsigned int stacked_psr = hardfault_args[7]; // 状态寄存器 // 打印寄存器现场 log_a("====== HardFault Detected ======\r\n"); log_a("R0 = 0x%08X, R1 = 0x%08X\r\n", stacked_r0, stacked_r1); log_a("R2 = 0x%08X, R3 = 0x%08X\r\n", stacked_r2, stacked_r3); log_a("R12= 0x%08X, LR = 0x%08X\r\n", stacked_r12, stacked_lr); log_a("PC = 0x%08X, PSR= 0x%08X\r\n", stacked_pc, stacked_psr); // 打印故障状态寄存器 log_a("HFSR = 0x%08X\r\n", SCB->HFSR); log_a("CFSR = 0x%08X\r\n", SCB->CFSR); log_a("BFAR = 0x%08X\r\n", SCB->BFAR); log_a("MMFAR= 0x%08X\r\n", SCB->MMFAR); }