單片機(jī)型號(hào):STM32F401
本文講述移植STM32CubeMX生成的驅(qū)動(dòng)程序到自己的項(xiàng)目中,以定時(shí)器為例。為什么要寫這篇文章呢?是因?yàn)槎〞r(shí)器移植這件事情耗費(fèi)了我整整2天的時(shí)間,只因?yàn)橐粋€(gè)特殊的地方?jīng)]有注意到。把整個(gè)移植過程用文字記錄下來,以利于自身其它程序的移植,并對本文的讀者提供一些技術(shù)上的參考。
1、如果僅完成計(jì)時(shí)功能,在STM32CubeMX中設(shè)置比較簡單,如下圖所示,只需指定其時(shí)鐘源即可。
2、對時(shí)鐘進(jìn)行進(jìn)一步設(shè)置,這個(gè)在先前的日志中已經(jīng)描述過,將分頻系數(shù)與MCU的主頻系數(shù)設(shè)置成一致,例如我現(xiàn)在MCU的主頻是72M,則進(jìn)行72分頻即可,這樣單位計(jì)數(shù)周期是1us,按照下圖所示,我在Counter Period中設(shè)置為1000,則定時(shí)器的中斷時(shí)間是1ms。
3、設(shè)置定時(shí)器中斷。
4、生成工程文件。
5、有了上述準(zhǔn)備后,我們就可已將工程移植到自己的項(xiàng)目中了。
6、建立定時(shí)器相應(yīng)的CPP和H文件,H文件的代碼如下:
/*
* Timer3ê???2úéú1ms?¨ê±
*/
#ifndef TIMER3_H_
#define TIMER3_H_
void CommonTimer_InterruptFunction(void);
#ifdef __cplusplus
extern "C"{
class CTimer3
{
public:
void SetMode(uint8_t mode);
};
}
#endif
#endif
7、復(fù)制定時(shí)器初始化函數(shù)中的程序到SetMode函數(shù)中。
8、復(fù)制中斷函數(shù)中的內(nèi)容到CPP文件中。
9、復(fù)制初始化文件中的內(nèi)容到CPP文件中。
10、在CPP文件中定義自己的中斷服務(wù)處理函數(shù),以方便在main.cpp中調(diào)用,完整的CPP文件如下:
#include "include.h"
TIM_HandleTypeDef htim3;
void CTimer3::SetMode(uint8_t mode)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim3.Instance = TIM3;
if (mode == 0)
{
htim3.Init.Prescaler = 72;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 1000;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
}
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
HAL_TIM_Base_Start_IT(&htim3);
}
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim3);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim3.Instance)
{
CommonTimer_InterruptFunction();
}
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_DISABLE();
HAL_NVIC_DisableIRQ(TIM3_IRQn);
}
}
11、完成上述步驟后,還需對2個(gè)文件進(jìn)行設(shè)置,首先設(shè)置stm32f4xx_hal_conf.h文件,打開相應(yīng)的驅(qū)動(dòng)模塊,如下所示。
/* ########################## Module Selection ############################## */
/**
* @brief This is the list of modules to be used in the HAL driver
*/
#define HAL_MODULE_ENABLED
#define HAL_ADC_MODULE_ENABLED
/* #define HAL_CRYP_MODULE_ENABLED */
/* #define HAL_CAN_MODULE_ENABLED */
/* #define HAL_CRC_MODULE_ENABLED */
/* #define HAL_CRYP_MODULE_ENABLED */
/* #define HAL_DAC_MODULE_ENABLED */
/* #define HAL_DCMI_MODULE_ENABLED */
/* #define HAL_DMA2D_MODULE_ENABLED */
/* #define HAL_ETH_MODULE_ENABLED */
/* #define HAL_NAND_MODULE_ENABLED */
/* #define HAL_NOR_MODULE_ENABLED */
/* #define HAL_PCCARD_MODULE_ENABLED */
/* #define HAL_SRAM_MODULE_ENABLED */
/* #define HAL_SDRAM_MODULE_ENABLED */
/* #define HAL_HASH_MODULE_ENABLED */
/* #define HAL_I2C_MODULE_ENABLED */
/* #define HAL_I2S_MODULE_ENABLED */
/* #define HAL_IWDG_MODULE_ENABLED */
/* #define HAL_LTDC_MODULE_ENABLED */
/* #define HAL_RNG_MODULE_ENABLED */
/* #define HAL_RTC_MODULE_ENABLED */
/* #define HAL_SAI_MODULE_ENABLED */
/* #define HAL_SD_MODULE_ENABLED */
/* #define HAL_MMC_MODULE_ENABLED */
#define HAL_SPI_MODULE_ENABLED
#define HAL_TIM_MODULE_ENABLED
/* #define HAL_UART_MODULE_ENABLED */
/* #define HAL_USART_MODULE_ENABLED */
/* #define HAL_IRDA_MODULE_ENABLED */
/* #define HAL_SMARTCARD_MODULE_ENABLED */
/* #define HAL_WWDG_MODULE_ENABLED */
#define HAL_PCD_MODULE_ENABLED
/* #define HAL_HCD_MODULE_ENABLED */
/* #define HAL_DSI_MODULE_ENABLED */
/* #define HAL_QSPI_MODULE_ENABLED */
/* #define HAL_QSPI_MODULE_ENABLED */
/* #define HAL_CEC_MODULE_ENABLED */
/* #define HAL_FMPI2C_MODULE_ENABLED */
/* #define HAL_SPDIFRX_MODULE_ENABLED */
/* #define HAL_DFSDM_MODULE_ENABLED */
/* #define HAL_LPTIM_MODULE_ENABLED */
#define HAL_GPIO_MODULE_ENABLED
#define HAL_DMA_MODULE_ENABLED
#define HAL_RCC_MODULE_ENABLED
#define HAL_FLASH_MODULE_ENABLED
#define HAL_PWR_MODULE_ENABLED
#define HAL_CORTEX_MODULE_ENABLED
12、在stm32f4xx_it.h中添加相應(yīng)的中斷服務(wù)處理函數(shù),如下所示。
void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void TIM3_IRQHandler(void);
void OTG_FS_IRQHandler(void);
至此,就完成了整個(gè)驅(qū)動(dòng)程序的移植工作,我所忽略的地方就是stm32f4xx_it.h文件,必須在這個(gè)文件中添加相應(yīng)的中斷服務(wù)處理函數(shù),才能夠使startup_stm32f401xc.s文件中中斷向量與C文件中的中斷服務(wù)處理函數(shù)對應(yīng)上,否則中斷服務(wù)處理函數(shù)得不到調(diào)用。
上一篇:STM32開發(fā)筆記33:解決USB CDC “該設(shè)備無法啟動(dòng)”問題
下一篇:STM32開發(fā)筆記31: STM32F4系列LQFP64封裝引腳的兼容性
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 貿(mào)澤授權(quán)代理Texas Instruments 豐富多樣的產(chǎn)品
- 美國為何恢復(fù)英偉達(dá)H20對華銷售?白宮AI負(fù)責(zé)人回應(yīng)
- Cadence 率先推出業(yè)內(nèi)首款 LPDDR6/5X 14.4Gbps 內(nèi)存 IP,為新一代 AI 基礎(chǔ)架構(gòu)助力
- 手把手教你從零設(shè)計(jì)一款算力超過 1000Tops 的智能駕駛芯片
- OrangeBox汽車連接域控制器(CDC)開發(fā)平臺(tái)
- 采用反激式轉(zhuǎn)換器進(jìn)行高功率應(yīng)用設(shè)計(jì)
- Vishay推出PLCC-6封裝RGB LED通過獨(dú)立控制紅色、綠色和藍(lán)色芯片實(shí)現(xiàn)寬色域
- 芯對話 | CBMG719單刀雙擲模擬開關(guān):高精度信號(hào)切換低阻高速寬溫
- 大聯(lián)大詮鼎集團(tuán)推出基于Qualcomm和Thundercomm產(chǎn)品的AI電子圍欄方案
- AMD:AI加速卡MI308將恢復(fù)出貨,許可證申請將被推進(jìn)至審核流程
- EEworld獨(dú)家原創(chuàng)視頻:大話TI CC2650,邀你來看!
- 觀看TI IOT解決方案研討會(huì) 答題即可贏取更多精美好禮!
- 【EEWORLD第三十九屆】2012年06月社區(qū)明星人物揭曉!
- 永不過時(shí)的物聯(lián)網(wǎng)解決方案 Intel帶你6的飛起來!
- ADI有獎(jiǎng)下載活動(dòng)之25:ADI汽車傳感器和傳感器接口解決方案
- Vicor 更好的供電方式提升無人機(jī)飛行時(shí)間飛行半徑及有效載荷
- 考眼力:高速數(shù)字設(shè)計(jì)的秘籍 藏在哪里? 走近Keysight PATHWAVE,提升工作效率
- TI 最新電容式觸控套件,免費(fèi)嘗鮮中
- TI有獎(jiǎng)直播|借助Sitara™ AM263x MCU 創(chuàng)造電氣化的未來
- 沉寂已久的幣圈再次沸騰,Libra的入局敲響了幣圈喪鐘?
- WiSA協(xié)會(huì)陣容壯大,已擴(kuò)展到6家領(lǐng)先全球性電視制造商
- 貿(mào)澤與Xilinx簽訂全球分銷協(xié)議
- 凌華科技智能觸控電腦:無縫集成 實(shí)現(xiàn)生產(chǎn)力的最大化
- VR產(chǎn)業(yè)遇冷伏蟄2年,5G助力迎接將迎來新契機(jī)?
- 如果沒有ARM,未來哪個(gè)架構(gòu)能適合IOT?
- 超緊湊型TDK DC-DC電源模塊貿(mào)澤開售
- 更快的STM32H7微控制器,為產(chǎn)品帶來更高的性能和經(jīng)濟(jì)性
- ARMv8架構(gòu)哪里強(qiáng)?史上最高性能功耗最大可擴(kuò)展性
- 成為ARM嵌入式系統(tǒng)硬件高手的要素