高级会员

- 积分
- 825
- 金钱
- 825
- 注册时间
- 2014-9-30
- 在线时间
- 139 小时
|
分享:简单而明确的 HAL库 通用us 微秒延时 程序。据说:原始作者就是【原子老大】_俺借花献佛了。
俺等平时无时间学习,要写程序了就临时抱佛脚。。
希望教程尽量祛除那些杂质性的东西,直接实用:
————————————————————————
实用STM32CubeMX直接新建工程:F103,F40x都行
本例以PB13为测量实例——定义晶体,定义PB13输出。
这段代码可以直接实用,很是方便。
。
//本微秒延迟程序只包含两个段落 Begin0,Begin2 很精简。
/* USER CODE BEGIN 0 */
typedef uint8_t u8;
typedef uint32_t u32;
u8 fac_us;
void delay_init(u8 SYSCLK)
{
#if SYSTEM_SUPPORT_OS
u32 reload;
#endif
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
//SysTick HCLK
fac_us=SYSCLK; // OS,fac_us
#if SYSTEM_SUPPORT_OS // OS.
reload=SYSCLK;
reload*=1000000/delay_ostickspersec; //delay_ostickspersec
//reload 24Bit 16777216, 180M 0.745s
fac_ms=1000/delay_ostickspersec; // OS.
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;// SYSTICK
SysTick->LOAD=reload; // 1/OS_TICKS_PER_SEC
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; // SYSTICK
#else
#endif
}
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD
ticks=nus*fac_us;
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;
}
}
}
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
delay_init(64); //根据你目标板CPU主频(64MHz)
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */
/* Infinite loop */
while (1)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
delay_us(4);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
delay_us(4);
}
/* USER CODE END 3 */
}
//——————完毕——————。
程序例是 4 微秒 实际调用子程序 会额外耗费 指令周期。
|
|