国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向

這篇具有很好參考價值的文章主要介紹了【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.sys文件夾介紹(掌握)

??下面函數(shù)都是以sys_開頭,定義在sys.c中。正點原子函數(shù)現(xiàn)階段命名規(guī)則如果是在led.c中,則以led_開頭。在F7/H7系列中會存在Cache配置函數(shù),I-Cache中存儲指令,D-Cache中存儲數(shù)據(jù)。
【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫

2.deley文件夾介紹(掌握)

2.1deley文件夾函數(shù)簡介

【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫

2.2SysTick工作原理

??SysTick,即系統(tǒng)滴答定時器,包含在M3/4/7內(nèi)核里面,核心是一個24位的遞減計數(shù)器(最大計數(shù)值為224=16777216)。當計數(shù)器減至0時,證明延時成功,則讓COUNTFLAG置1,并將重裝載寄存器中的值賦給計數(shù)器,重裝載值可以自己設(shè)置,取值范圍是從0開始0~16777215。
【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫
??每次VAL到0時,VAL自動從LOAD重載,開始新一輪遞減計數(shù)。

2.3SysTick寄存器介紹

??SysTick控制及狀態(tài)寄存器(CTRL)(摘自:Cortex M3權(quán)威指南(中文).pdf)。其中,CLKSOURCE并不是時鐘源選擇位,而是配置分頻系數(shù)。
【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫
SysTick重裝載數(shù)值寄存器(LOAD)(摘自:Cortex M3權(quán)威指南(中文).pdf),LOAD中的值會重裝載到VAL寄存器中。
【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫

SysTick當前數(shù)值寄存器(VAL) (摘自:Cortex M3權(quán)威指南(中文).pdf
【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫

2.4delay_init()函數(shù)(F1)

??形參sysclk為系統(tǒng)時鐘,單位是M,比如在F1系列中系統(tǒng)時鐘為72MHz,則填入72。
??下列代碼第一行是設(shè)置系統(tǒng)滴答定時器的狀態(tài)控制寄存器為0,在進行dellay_init()函數(shù)之前可能會調(diào)用HAL庫的初始化函數(shù),可以將系統(tǒng)滴答定時器的中斷以及其他設(shè)置配置好,這里需要按照我們自己的意愿來設(shè)置,所以需要將HAL庫設(shè)置的清0,不會干擾后面的配置;第二行是調(diào)用HAL庫的函數(shù)來選擇系統(tǒng)滴答定時器時鐘源分頻系數(shù),這里選擇8分頻,也就是將CTRL寄存器的位CLKSOURCE置0;第三行是定義全局變量,作為1us時基的來源,如果系統(tǒng)滴答定時器的計數(shù)頻率為1MHz,1秒鐘計數(shù)1000 000次,計數(shù)一次用1/1000 000次,F(xiàn)1系列的系統(tǒng)時鐘為72Mhz,系統(tǒng)滴答定時器進行8分頻,系統(tǒng)滴答定時器真正計數(shù)頻率為9Mhz,用sysclk除以8得到9Mhz,得到1us需要計數(shù)多少次。1/1000 000s=1us=g_fac_us ×1/9000 000,其中g_fac_us 為達到1us需要計數(shù)的次數(shù)。

void delay_init(uint16_t sysclk) 
{ 
	SysTick->CTRL = 0; 
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); 
	g_fac_us = sysclk / 8; 
}

2.5delay_us()函數(shù)(F1)

??在9MHz的計數(shù)頻率上得到1us,需要進行計數(shù)9次,其中g_fac_us為9,使用變量temp來判斷滴答定時器是否在工作,位16是判斷計數(shù)是否完成,如果計數(shù)未完成則為0。

void delay_us(uint32_t nus) 
{ 
	uint32_t temp; 
	SysTick->LOAD = nus * g_fac_us; 	/* 時間加載 */ 
	SysTick->VAL = 0x00; 			/* 清空計數(shù)器 */ 
	SysTick->CTRL |= 1 << 0 ; 		/* 開始倒數(shù) */ 
	do 
	{ 
		temp = SysTick->CTRL; 
	} while ((temp & 0x01) && !(temp & (1 << 16))); /* CTRL.ENABLE位必須為1, 并等待時間到達 */

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

2.6delay_ms()函數(shù)(F1)

??毫秒延時函數(shù)是利用us延時函數(shù)來實現(xiàn)的,那么就需要知道微秒延時函數(shù)的,所能延時的最大us數(shù),F(xiàn)1系統(tǒng)時鐘為72Mhz,經(jīng)過8分頻得到滴答定時器時鐘9Mhz計數(shù)頻率,計一個數(shù)為1/9000 000,可以計數(shù)224,則最大為1/9000 000 ×224≈1.864s,這是沒有考慮超頻,如果超頻到128Mhz,經(jīng)過8分頻為16Mhz,1/16000 000×224≈1.048576s。那么如果延時需要超過1ms,則可以調(diào)用多次delay_us()函數(shù),如果不超過1ms,可以直接使用delay_us()函數(shù)。
??代碼第一行首先對1000取整數(shù),將整數(shù)部分賦值給repeat 用于1s延時,小數(shù)部分賦值給remain用于小于1s的延時,用remain乘以1000是因為ms到us是相差1000倍。。

void delay_ms(uint16_t nms) 
{ 
	uint32_t repeat = nms / 1000;	/* 這里用1000,是考慮到可能有超頻應(yīng)用, 
							    	 * 比如128Mhz的時候, delay_us最大只能延時1048576us
								 */ 
	uint32_t remain = nms % 1000; 
	while (repeat) 
	{ 
		delay_us(1000 * 1000); 	/* 利用delay_us 實現(xiàn) 1000ms 延時 */ 
		repeat--; 
	} 
	if (remain) 
	{ 
		delay_us(remain * 1000); 	/* 利用delay_us, 把尾數(shù)延時(remain ms)給做了 */ 
	} 
}

3.usart文件夾介紹(掌握)

3.1printf函數(shù)輸出流程

??如果要使用printf()函數(shù),必須包含stdio.h頭文件,用工使用printf()函數(shù),然后自動調(diào)用C標準庫鐘內(nèi)容,最終會調(diào)用fputc()函數(shù),此函數(shù)與硬件相關(guān),通過屏幕或者串口來輸出內(nèi)容。
【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫

3.2printf的使用

  1. printf(“字符串\r\n”);使用\r\n實現(xiàn)換行,有些操作系統(tǒng)鐘只用\n即可,為了兼容不同的操作系統(tǒng)推薦使用\r\n來實現(xiàn)換行。
printf("Hello World!\r\n");
  1. printf(“輸出控制符”,輸出參數(shù));%d是輸出十進制數(shù)。
uint32_t  temp = 10;
printf("%d\r\n", temp);          /* %d是輸出控制符,temp是輸出參數(shù) */
  1. printf(“輸出控制符1輸出控制符2…”,輸出參數(shù)1,輸出參數(shù)2,…);%x以十六進制形式輸出,則輸出5A。
uint32_t  temp1 = 5;   
uint32_t  temp2 = 10;
printf("%d%x\r\n", temp1,temp2);  
  1. printf(“非輸出控制符 輸出控制符 非輸出控制符”,輸出參數(shù));
uint32_t  temp = 10;   
printf("temp=  %d  收到over\r\n", temp);  
  1. 如何輸出%、\和雙引號
printf("%% \r\n");
printf("\\\r\n");
printf("\"\"\r\n");

3.2.1常用輸出控制符表

【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫

3.2.2常用轉(zhuǎn)義字符表

【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫

3.3printf函數(shù)支持

  1. 避免使用半主機模式:兩種方法:微庫法、代碼法
  2. 實現(xiàn)fputc函數(shù)實現(xiàn)單個字符輸出

3.3.1半主機模式簡介

??用于 ARM 目標的一種機制,可將來自應(yīng)用程序代碼的輸入/輸出請求傳送至運行調(diào)試器的主機。簡單說,就是通過仿真器實現(xiàn)開發(fā)板在電腦上的輸入和輸出,一般我們不使用半主機模式。具體半主機模式的介紹可以查看參考鏈接。

3.3.2微庫法

??在魔術(shù)棒->Target選項卡,勾選【Use Micro LIB】,即可避免半主機模式。
【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫

3.3.3代碼法

??1個預處理、 2個定義、3個函數(shù)。

1.#pragma import(__use_no_semihosting),確保不從C庫中使用半主機函數(shù);
2.定義:__FILE結(jié)構(gòu)體,避免HAL庫某些情況下報錯;
3.定義: FILE __stdout,避免編譯報錯;
4.實現(xiàn):_ttywrch、_sys_exit和_sys_command_string等三個函數(shù)。
AC5和AC6不使用半主機模式稍有差異,詳見源碼

3.3.4微庫法VS代碼法

??推薦使用代碼法,正點原子源碼已做好。
【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫

/******************************************************************************************/
/* 加入以下代碼, 支持printf函數(shù), 而不需要選擇use MicroLIB */

#if 1

#if (__ARMCC_VERSION >= 6010050)            /* 使用AC6編譯器時 */
__asm(".global __use_no_semihosting\n\t");  /* 聲明不使用半主機模式 */
__asm(".global __ARM_use_no_argv \n\t");    /* AC6下需要聲明main函數(shù)為無參數(shù)格式,否則部分例程可能出現(xiàn)半主機模式 */

#else
/* 使用AC5編譯器時, 要在這里定義__FILE 和 不使用半主機模式 */
#pragma import(__use_no_semihosting)

struct __FILE
{
    int handle;
    /* Whatever you require here. If the only file you are using is */
    /* standard output using printf() for debugging, no file handling */
    /* is required. */
};

#endif

/* 不使用半主機模式,至少需要重定義_ttywrch\_sys_exit\_sys_command_string函數(shù),以同時兼容AC6和AC5模式 */
int _ttywrch(int ch)
{
    ch = ch;
    return ch;
}

/* 定義_sys_exit()以避免使用半主機模式 */
void _sys_exit(int x)
{
    x = x;
}

char *_sys_command_string(char *cmd, int len)
{
    return NULL;
}


/* FILE 在 stdio.h里面定義. */
FILE __stdout;

/* MDK下需要重定義fputc函數(shù), printf函數(shù)最終會通過調(diào)用fputc輸出字符串到串口 */
int fputc(int ch, FILE *f)
{
    while ((USART_UX->SR & 0X40) == 0);     /* 等待上一個字符發(fā)送完成 */

    USART_UX->DR = (uint8_t)ch;             /* 將要發(fā)送的字符 ch 寫入到DR寄存器 */
    return ch;
}
#endif

3.3.5實現(xiàn)fputc函數(shù)

??在fputc函數(shù)中,第一行等待上一個字符發(fā)送完成,也就是檢查串口狀態(tài)寄存器SR的位6是否為1,為1則發(fā)送成功;第二行是將要發(fā)送的字符寫入到串口的數(shù)據(jù)寄存器DR。如果注釋掉第一行,print()函數(shù)發(fā)送的數(shù)據(jù)會亂碼,因為fputc()函數(shù)是實現(xiàn)一個字符的輸出,printf()輸出很多個字符時,注釋掉第一行代碼將不再等待上一字符發(fā)送完成,將會一直發(fā)送疊加,導致亂碼。使用微庫法時,不能屏蔽掉fputc函數(shù),只需要屏蔽1個預處理、 2個定義、3個函數(shù)。

/* MDK下需要重定義fputc函數(shù), printf函數(shù)最終會通過調(diào)用fputc輸出字符串到串口 */
int fputc(int ch, FILE *f)
{
    while ((USART_UX->SR & 0X40) == 0);     /* 等待上一個字符發(fā)送完成 */

    USART_UX->DR = (uint8_t)ch;             /* 將要發(fā)送的字符 ch 寫入到DR寄存器 */
    return ch;
}
#endif

4.總結(jié)(了解)

【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向,# STM32-HAL庫,stm32,單片機,嵌入式硬件,C#,HAL庫文章來源地址http://www.zghlxwxcb.cn/news/detail-618130.html

到了這里,關(guān)于【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 正點原子STM32(基于HAL庫)1

    正點原子STM32(基于HAL庫)1

    正點原子B站視頻地址:https://www.bilibili.com/video/BV1bv4y1R7dp?p=1vd_source=cc0e43b449de7e8663ca1f89dd5fea7d STM32芯片分類 ST中文社區(qū)網(wǎng):https://www.stmcu.org.cn/ ST官網(wǎng):https://www.st.com/content/st_com/en.html 了解了STM32 的系列和命名以后,我們再進行STM32 選型就會比較容易了,這里我們只要遵循:由高

    2023年04月23日
    瀏覽(23)
  • STM32——STM32F103時鐘解析(正點原子資料+HAL庫代碼分析)

    STM32——STM32F103時鐘解析(正點原子資料+HAL庫代碼分析)

    上次寫系統(tǒng)時鐘解析的時候說出一篇103的時鐘解析,我就整理HAL庫開發(fā)的正點的資料,給小白梳理,我也是小白,不做權(quán)威使用。 在 STM32 中,有五個時鐘源,為 HSI、HSE、LSI、LSE、PLL。從時鐘頻率來分可以分為高速時鐘源和低速時鐘源,在這 5 個中 HIS,HSE 以及 PLL 是高速時鐘

    2024年02月19日
    瀏覽(25)
  • 【正點原子STM32】認識HAL庫(CMSIS、STM32Cube固件包、HAL庫框架結(jié)構(gòu)、使用HAL庫、注意事項)

    【正點原子STM32】認識HAL庫(CMSIS、STM32Cube固件包、HAL庫框架結(jié)構(gòu)、使用HAL庫、注意事項)

    一、初識HAL庫 1.1、CMSIS簡介 1.2、HAL庫簡介 二、STM32Cube固件包淺析 2.1、如何獲取STM32Cube固件包? 2.2、STM32Cube固件包文件夾簡介 2.3、CMSIS文件夾關(guān)鍵文件 三、HAL庫框架結(jié)構(gòu) 3.1、HAL庫文件夾結(jié)構(gòu) 3.2、HAL庫文件介紹 3.3、HAL庫API函數(shù)和變量命名規(guī)則 四、如何使用HAL庫 4.1、基于CM

    2024年02月21日
    瀏覽(32)
  • 正點原子STM32F103精英版+HAL庫實現(xiàn)4×4矩陣按鍵檢測

    正點原子STM32F103精英版+HAL庫實現(xiàn)4×4矩陣按鍵檢測

    首先聲明,本人小白一枚,所做的工作都是借鑒網(wǎng)上的大佬+自己摸索,但是都是親測實際有效的。 因為所需要的功能開發(fā)板自帶按鍵不夠用,所以購買了4×4矩陣按鍵,當時購買的時候以為一個按鍵對應(yīng)一個IO口,后來發(fā)現(xiàn)不是這樣的,會浪費太多的IO口,4×4矩陣鍵盤用8個

    2024年02月06日
    瀏覽(78)
  • 2.基于正點原子STM32F103的定時器中斷實驗(HAL庫實現(xiàn))(cubeMX)

    2.基于正點原子STM32F103的定時器中斷實驗(HAL庫實現(xiàn))(cubeMX)

    ? 基本上每一款MCU都會配備定時器這個外設(shè),STM32 的每個通用定時器都是完全獨立的,沒有互相共享的任何資源。 同樣,STM32F1系列的定時器功能也很強大,包括: TIM1和TIM8兩個高級定時器; TIM2~TIM5是個通用寄存器; TIM7,TIM8,兩個基本定時器。 由于本次實驗適用于新手入門

    2023年04月26日
    瀏覽(27)
  • 基于stm32F407的hal庫,移植FreeRTOS的具體步驟和遇到的問題(看正點原子的視頻)

    基于stm32F407的hal庫,移植FreeRTOS的具體步驟和遇到的問題(看正點原子的視頻)

    因為板子是stm32F407的第二版的,所以開始下的資料是舊版本的,但是舊版本的FreeRTOS工程沒有hal庫的,都是標準庫的,這里是下載stm32F407最新版的資料,進行移植。 資料可以在正點原子官網(wǎng)下載,如下: http://www.openedv.com/docs/boards/stm32/index.html 一定要下載最新的資料(開始用

    2024年02月06日
    瀏覽(25)
  • 關(guān)于windows下的System32與SysWOW64兩個文件夾

    今天編譯一個簡單的圖形程序,編譯時報錯 在提示下想到需要用到windows自帶的gdi32full.dll文件 想著我用的mingw64編出的是64位的程序 于是去?C:WindowsSysWOW64 目錄下找到?gdi32full.dll 然后編譯報? 然后在這里卡了很久 各種探索嘗試后發(fā)現(xiàn)把文件換成?C:WindowsSystem32 文件夾里面的

    2024年02月04日
    瀏覽(87)
  • 【正點原子STM32】RS485串行通信標準(串口基礎(chǔ)協(xié)議 和 MODBUS協(xié)議、總線連接、通信電路、通信波形圖、RS485相關(guān)HAL庫驅(qū)動、RS485配置步驟、)

    【正點原子STM32】RS485串行通信標準(串口基礎(chǔ)協(xié)議 和 MODBUS協(xié)議、總線連接、通信電路、通信波形圖、RS485相關(guān)HAL庫驅(qū)動、RS485配置步驟、)

    一、RS485介紹 二、RS485相關(guān)HAL庫驅(qū)動介紹 三、RS485配置步驟 四、編程實戰(zhàn) 五、總結(jié) 串口、UART、TTL、RS232、RS422和RS485之間的關(guān)系可以如此理解: 串口 :是一個廣義術(shù)語,通常指的是采用串行通信協(xié)議的接口,它可以包括多種具體的物理接口標準和邏輯電平標準。 UART (通用

    2024年04月13日
    瀏覽(30)
  • 【正點原子STM32連載】 第十章 STM32CubeMX簡介 摘自【正點原子】STM32F103 戰(zhàn)艦開發(fā)指南V1.2

    【正點原子STM32連載】 第十章 STM32CubeMX簡介 摘自【正點原子】STM32F103 戰(zhàn)艦開發(fā)指南V1.2

    1)實驗平臺:正點原子stm32f103戰(zhàn)艦開發(fā)板V4 2)平臺購買地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套實驗源碼+手冊+視頻下載地址: http://www.openedv.com/thread-340252-1-1.html STM32CubeMX是由ST公司開發(fā)的圖形化代碼自動生成工具,能夠快速生成初始化代碼,如配置GPIO,時鐘樹

    2024年01月15日
    瀏覽(32)
  • 【正點原子STM32連載】 第三十章 ADC實驗 摘自【正點原子】STM32F103 戰(zhàn)艦開發(fā)指南V1.2

    【正點原子STM32連載】 第三十章 ADC實驗 摘自【正點原子】STM32F103 戰(zhàn)艦開發(fā)指南V1.2

    1)實驗平臺:正點原子stm32f103戰(zhàn)艦開發(fā)板V4 2)平臺購買地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套實驗源碼+手冊+視頻下載地址: http://www.openedv.com/thread-340252-1-1.html 本章,我們將介紹STM32F103的ADC(Analog-to-digital converters,模數(shù)轉(zhuǎn)換器)功能。我們通過四個實驗來學習

    2024年02月03日
    瀏覽(35)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包