2.系統定時器

阿Q熊發表於2024-08-22

系統定時器SYSTEM資料夾介紹
1,sys資料夾介紹
sys_nvic_set_vector_table():設定中斷向量表地址
sys_intx_enable():開啟所有中斷
sys_intx_disable():關閉所有中斷(但是不包括fault和NMI中斷)
sys_wfi_set():執行: WFI指令(執行完該指令進入低功耗狀態)
sys_standby():進入待機模式
sys_soft_reset():系統軟復位
sys_msr_msp():設定棧頂地址
sys_stm32_clock_init():設定系統時鐘
sys_cache_enable():使能I-Cache和D-Cache, 開啟D-Cache強制透寫


2,deley資料夾介紹
delay_init():初始化系統滴答定時器

void delay_init(uint16_t sysclk) 
{ 
	SysTick->CTRL = 0; 
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); //配置CLKSOURCE暫存器置0,8分頻
    //計數頻率=系統時鐘(72M)/8(分頻)=9M
	g_fac_us = sysclk / 8; //全域性變數,賦值=引數uint16_t sysclk/8,標誌這1us的次數
    
}


delay_us():用系統滴答定時器實現微秒延時

void delay_us(uint32_t nus) 
{ 
	uint32_t temp; //定義變數temp
	SysTick->LOAD = nus * g_fac_us; 	/* 時間載入,重灌載值一般要-1 */ 
	SysTick->VAL = 0x00; 			/* 清0計數器 */ 
	SysTick->CTRL |= 1 << 0 ; 		/* 開始倒數 */ 
	do 
	{ 
		temp = SysTick->CTRL; 
	} while ((temp & 0x01) && !(temp & (1 << 16))); /* (temp &(1<<16))非0則跳出迴圈 */

 
	SysTick->CTRL &= ~(1 << 0) ; 		/* 關閉SYSTICK */ 
	SysTick->VAL = 0X00; 			/* 清空計數器 */ 
}

時間 = 計數個數 / 計數頻率
while迴圈條件判斷是為0跳出迴圈
&&運算子:A && B: 如果A和B都是1,則 A&&B整體表示式為真,如果A && B中只要有一個為0,則整體為0.
!取反
A && !B則A固定不變B要為1
temp&0x01只要temp的最低位是1(真),那麼結果就是1,反之就是0(假)。
(temp &(1<<16))非0則跳出迴圈

delay_ms():用微秒延時函式實現毫秒延時

void delay_ms(uint16_t nms) 
{ 
    /* 這裡用1000,是考慮到可能有超頻應用, 
	 * 比如128Mhz的時候, delay_us最大隻能延時1/(128 000 000/8)*2^24=1.048576s
	*/ 
	uint32_t repeat = nms / 1000;	  //大於1s的整數部分
	uint32_t remain = nms % 1000;     //大於1s的小數部分
	while (repeat) 
	{ 
		delay_us(1000 * 1000); 	/* 利用delay_us 實現 1000ms 延時 */ 
		repeat--; 
	} 
	if (remain) 
	{ 
		delay_us(remain * 1000); 	/* 利用delay_us, 把尾數延時(remain ms)給做了 */ 
	} 
}

SysTick,即系統滴答定時器,包含在M3/4/7核心裡面,核心是一個24位的遞減計數器
2.系統定時器

測試:魔術棒->Utilities->Settings->Trace->Core Clock:輸入系統時鐘->模擬->打斷點執行延時->看t1變化->->

3.usart資料夾介紹
printf函式輸出流程:printf()->C標準庫->fputc()->->
使用者需要根據fputc最終輸出的硬體重新定義該函式,此過程稱為:printf重定向

printf函式支援:
1,避免使用半主機模式,兩種方法:微庫法、程式碼法
半主機模式:就是透過模擬器實現開發板在電腦上的輸入和輸出
微庫法:魔術棒->Target->勾選:Use Micro LIB
2,實現fputc函式



相關文章