You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

61 lines
2.1 KiB

#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<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
}
};
#endif
}
void hard_fault_handler_c(unsigned int *hardfault_args)
{
unsigned int stacked_lr = hardfault_args[5];
unsigned int stacked_pc = hardfault_args[6]; // 程序计数器
unsigned int stacked_psr = hardfault_args[7]; // 状态寄存器
uint32_t sp = (uint32_t)hardfault_args;
// 打印寄存器现场
log_a("====== HardFault Detected ======\nPSR= 0x%08X\nPC = 0x%08X, LR = 0x%08X\nHFSR = 0x%08X\tCFSR = 0x%08X\nBFAR = 0x%08X\tMMFAR= 0x%08X\nsp = 0x%08X\n",
stacked_psr, stacked_pc, stacked_lr, SCB->HFSR, SCB->CFSR, SCB->BFAR, SCB->MMFAR, sp);
}