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

物聯(lián)網(wǎng)|按鍵實驗---學習I/O的輸入及中斷的編程|函數(shù)說明的格式|如何使用CMSIS的延時|讀取通過外部中斷實現(xiàn)按鍵捕獲代碼的實現(xiàn)及分析-學習筆記(14)

這篇具有很好參考價值的文章主要介紹了物聯(lián)網(wǎng)|按鍵實驗---學習I/O的輸入及中斷的編程|函數(shù)說明的格式|如何使用CMSIS的延時|讀取通過外部中斷實現(xiàn)按鍵捕獲代碼的實現(xiàn)及分析-學習筆記(14)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

通過外部中斷實現(xiàn)按鍵捕獲代碼的實現(xiàn)及分析

1 代碼的流程分析
2 代碼的實現(xiàn)
庫函數(shù)HAL_Init(void)分析:

HAL_StatusTypeDef HAL_Init(void)
{
  /* Configure Flash prefetch, Instruction cache, Data cache */
#if (INSTRUCTION_CACHE_ENABLE != 0U) //0U表示無符號整型 0 , 1U 表示無符號整型1 ~0U就是對無符號數(shù)0取反。
  __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
#endif /* INSTRUCTION_CACHE_ENABLE  允許指令緩存*/

#if (DATA_CACHE_ENABLE != 0U)
  __HAL_FLASH_DATA_CACHE_ENABLE();
#endif /* DATA_CACHE_ENABLE */

#if (PREFETCH_ENABLE != 0U)
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif /* PREFETCH_ENABLE */

  /* Set Interrupt Group Priority 中斷優(yōu)先級分組*/
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  HAL_InitTick(TICK_INT_PRIORITY); //初始化系統(tǒng)時鐘

  /* Init the low level hardware 初始化底層硬件(堆棧指針)*/
  HAL_MspInit();  //使用HAL_Delay延時

  /* Return function status */
  return HAL_OK;
}

Tip1:函數(shù)說明的格式

/****************
*函數(shù)名:main
*函數(shù)的描述:通過中斷實現(xiàn)按鍵的捕獲
*輸入?yún)⒔?
*輸出參數(shù):
*返回值:
*圖數(shù)作者:
*創(chuàng)建時間:
*更改說明:
*****************/

Tip2:如何使用CMSIS的延時

HAL_Delay()系統(tǒng)延時的步驟:
它的實現(xiàn)步驟如下:
1.用變量獲得系統(tǒng)時鐘源計數(shù)器的值
2.獲得要延遲時間的參數(shù)值
3.比較兩者大小,若時鐘計數(shù)器的值大于要實現(xiàn)延遲的值,就會困在循環(huán)里;反之,跳出循環(huán),延時完成。

/**
    * @brief此函數(shù)提供最小延遲(以毫秒為單位)對變量遞增。
    * @note在默認實現(xiàn)中,SysTick計時器是基準時間的來源。
    *它用于在固定的時間間隔生成中斷,其中uwTick是遞增的。
    這個函數(shù)被聲明為__weak,在其他情況下會被覆蓋實現(xiàn)在用戶文件。
    *@param Delay指定延遲時間長度,單位為毫秒。
    *@retval無
  */
__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick(); //獲得起始時鐘
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)   //#define HAL_MAX_DELAY      0xFFFFFFFFU=1111 1111 1111 1111 1111 1111 1111 1111
  {

    //  HAL_TICK_FREQ_1KHZ         = 1U,
    //  HAL_TICK_FREQ_DEFAULT      = HAL_TICK_FREQ_1KHZ

    wait += (uint32_t)(uwTickFreq);  //作用是給wait加1。HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT;  /* 1KHz */

  }

  while((HAL_GetTick() - tickstart) < wait) //當前時鐘-起始時鐘的值小于wait(delay)就重復操作,直到計時結(jié)束
  {
  }
}

GetTick函數(shù)原型

/**
 調(diào)用這個函數(shù)是為了增加一個全局變量“uwTick”用作申請時基。
在默認實現(xiàn)中,這個變量每1ms增加一次在SysTick ISR。
這個函數(shù)被聲明為__weak,在其他情況下會被覆蓋實現(xiàn)在用戶文件。
* @retval無
  */
__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}

/**
* @brief提供以毫秒為單位的tick值。
這個函數(shù)被聲明為__weak,在其他情況下會被覆蓋實現(xiàn)在用戶文件。
@retval tick value
  */
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

對于裸機程度,沒有其他的隱蔽的東西,自己好好分析還是可以理清程序運行的細節(jié)及時序關(guān)系。遵守的原則:
1、盡量不要在主程序中使用死等的延時,二、每個子程序(也可以叫任務吧)的查詢頻率要大于主程序運行的時間。比如:ad采樣,100ms采樣一次,那么,主程序一定要在100ms以內(nèi)執(zhí)行完畢。
死等的延時可以是us級別的,時序性較高的地方,大的延時就使用定時器。

stm32f407_intr_handle.c解析

中斷處理函數(shù):void EXTI4_IRQHandler

根據(jù)startup_stm32f407xx.s中對于handler的描述,編寫相應的斷點處理函數(shù):

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

執(zhí)行函數(shù):HAL_GPIO_EXTI_IRQHandler(KEY0_PIN),調(diào)用stm32f4xx_hal_gpio.c中的void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin),函數(shù)的定義為:

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  //#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__))
  //__EXTI_LINE__ specifies the EXTI line flag to check.
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) // RESET = 0U(stm32f4xx.h),表明檢測到了中斷
  {
    /**
  * @brief  Clears the EXTI's line pending bits.
  * @param  __EXTI_LINE__ specifies the EXTI lines to clear.
  *          This parameter can be any combination of GPIO_PIN_x where x can be (0..15)
  * @retval None
  */
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);

    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

回調(diào)函數(shù)在HAL_GPIO_EXTI_Callback在HAL中未明確實現(xiàn)(弱聲明),需要自己構(gòu)造實現(xiàn)函數(shù)。
原型為:

/**
  * @brief  EXTI line detection callbacks.
  * @param  GPIO_Pin Specifies the pins connected EXTI line
  * @retval None
  */
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}

在key.c中對回調(diào)函數(shù)進行了重寫:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == KEY0_PIN) // KEY0_PIN被按下
	{
		Led_Ctrl(LED0_PIN_ROW, LED0_PIN, LED_ON); //執(zhí)行點燈操作
  }
}

本節(jié)中uint16_t Detect_key(uint16_t key_pin)未使用。

調(diào)試流程

在中斷處理函數(shù)和uwTick自加操作函數(shù)處設立中斷進行調(diào)試:

void EXTI4_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(KEY0_PIN);
}


void SysTick_Handler(void)
{
		HAL_IncTick(); //uwTick自加操作 uwTick += uwTickFreq;

}

物聯(lián)網(wǎng)|按鍵實驗---學習I/O的輸入及中斷的編程|函數(shù)說明的格式|如何使用CMSIS的延時|讀取通過外部中斷實現(xiàn)按鍵捕獲代碼的實現(xiàn)及分析-學習筆記(14),物聯(lián)網(wǎng)開發(fā)入門與實戰(zhàn),物聯(lián)網(wǎng),學習,筆記
物聯(lián)網(wǎng)|按鍵實驗---學習I/O的輸入及中斷的編程|函數(shù)說明的格式|如何使用CMSIS的延時|讀取通過外部中斷實現(xiàn)按鍵捕獲代碼的實現(xiàn)及分析-學習筆記(14),物聯(lián)網(wǎng)開發(fā)入門與實戰(zhàn),物聯(lián)網(wǎng),學習,筆記

軟件模擬調(diào)試

采用軟件模擬方式,進入調(diào)試,停在了main函數(shù)底下的LED0_Init()函數(shù):

運行出現(xiàn)錯誤:*** error 65: access violation at 0x40023830 : no ‘write’ permission
由于沒有指定相應的cpu:
解決方法:

  • 1 新建cpu.ini,寫入:
map 0x40000000,0x400FFFFF read write
  • 2 將cpu.ini添加入debug:
    物聯(lián)網(wǎng)|按鍵實驗---學習I/O的輸入及中斷的編程|函數(shù)說明的格式|如何使用CMSIS的延時|讀取通過外部中斷實現(xiàn)按鍵捕獲代碼的實現(xiàn)及分析-學習筆記(14),物聯(lián)網(wǎng)開發(fā)入門與實戰(zhàn),物聯(lián)網(wǎng),學習,筆記

兩種代碼的比較

中斷模式對CPu占用率更小,等待時間更短,減小CPU占有率

課后作業(yè):

1:預習繽程手冊關(guān)于USART控制器的描述(第30章)
2:通過中斷的方式實現(xiàn)一個程序,要求按下KEY1以后:讓LED1間隔0.5S閃爍,并持續(xù)5S后關(guān)閉,實現(xiàn)代碼并在板調(diào)試文章來源地址http://www.zghlxwxcb.cn/news/detail-630410.html

到了這里,關(guān)于物聯(lián)網(wǎng)|按鍵實驗---學習I/O的輸入及中斷的編程|函數(shù)說明的格式|如何使用CMSIS的延時|讀取通過外部中斷實現(xiàn)按鍵捕獲代碼的實現(xiàn)及分析-學習筆記(14)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包