1、概要
在一個項目中,使用STM32F103RCT6單片機,定時器引腳使用的PC6,PC6默認復用定時器為TIM8_CH1,但是由于其他原因,不能使用TIM8_CH1,因此需要使用其重定義功能TIM3_CH1,本文分享了本人在該項目中定時器TIM3引腳復用功能重定義的一些問題及解決過程,希望對大家能有幫助。
2、背景
在一個激光器產(chǎn)品控制項目中,需要一個占空比和頻率均可調的PWM對激光進行調制,硬件工程師選用的單片機為STM32F103RCT6,將該PWM端口設計為PC6,在做程序設計時發(fā)現(xiàn),該端口的默認復用定時器為TIM8_CH1,但是TIM8有其他用途,不能使用,好在PC6有引腳重定義功能,可將TIM3_CH1重定義到該引腳使用。
?
3、解決過程
本人一直使用HAL庫開發(fā)STM32單片機程序,之前未使用過引腳重定義功能,因此上網(wǎng)查了些資料,使用引腳重定義功能時,使用HAL庫的引腳重定義功能使能函數(shù)即可,TIM3的全部引腳重定義功能函數(shù)為stm32f1xx_hal_gpio_ex.h頭文件內宏定義的__HAL_AFIO_REMAP_TIM3_ENABLE(),具體如下:
/**
* @brief Enable the remapping of TIM3 alternate function channels 1 to 4
* @note ENABLE: Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9)
* @note TIM3_ETR on PE0 is not re-mapped.
* @retval None
*/
#define __HAL_AFIO_REMAP_TIM3_ENABLE() do{ CLEAR_BIT(AFIO->MAPR, AFIO_MAPR_TIM3_REMAP); \
SET_BIT(AFIO->MAPR, AFIO_MAPR_TIM3_REMAP_FULLREMAP); \
}while(0U)
但是在定時器引腳配置函數(shù)中調用該函數(shù),配置后還是不能使用,具體的GPIO配置如下,(只列出GPIO配置,PWM配置未列出)
/**
* @brief 定時器GPIO外設配置
* @param 無
* @retval 無
*/
static void TIMx_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* 通用定時器GPIO外設時鐘使能 */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*TIM3_CH1使用的PC6引腳,需重定義引腳功能*/
__HAL_AFIO_REMAP_TIM3_ENABLE();
/*TIM3_CH1功能引腳IO初始化*/
GPIO_InitStruct.Pin = GPIO_PIN_6; //引腳
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //模式為復用推挽輸出
GPIO_InitStruct.Pull = GPIO_PULLDOWN; //下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); //PC6初始化
/*TIM4_CH1功能引腳IO初始化*/
GPIO_InitStruct.Pin = GPIO_PIN_6; //引腳
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //PB6初始化
}
這樣配置之后,TIM3_CH1還是無法正常使用,即PC6引腳無響應配置PWM輸出,但是一起配置的默認復用功能的PB6引腳的TIM4_CH1引腳PWM正常。
后來又改變__HAL_AFIO_REMAP_TIM3_ENABLE()位置等等,折騰了好多次,還是不行,后來甚至懷疑是不是芯片的內部硬件故障,重新更換板子,還是不行。
再后來也網(wǎng)上查了查,還是沒有解決,然后就重頭來,重新翻看STM32F1的參考手冊,終于找到了問題原因。
引腳重定義功能配置的是復用重映射和調試I/O配置寄存器(AFIO_MAPR),而手冊中明確注明,對寄存器 AFIO_EVCR , AFIO_MAPR 和 AFIO_EXTICRX 進行讀寫操作前,應當首先打開 AFIO
的時鐘。
因此在HAL庫中找到開啟AFIO時鐘的函數(shù)__HAL_RCC_AFIO_CLK_ENABLE(),在__HAL_AFIO_REMAP_TIM3_ENABLE()之前開啟時鐘,重新配置后PC6輸出PWM正常,最終的TIM3_CH1的GPIO配置如下:
/**
* @brief 定時器GPIO外設配置
* @param 無
* @retval 無
*/
static void TIMx_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* 通用定時器GPIO外設時鐘使能 */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*使用重定義引腳功能之前需打開AFIO時鐘*/
__HAL_RCC_AFIO_CLK_ENABLE();
/*TIM3_CH1使用的PC6引腳,需重定義引腳功能*/
__HAL_AFIO_REMAP_TIM3_ENABLE();
/*TIM3_CH1功能引腳IO初始化*/
GPIO_InitStruct.Pin = GPIO_PIN_6; //引腳
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //模式為復用推挽輸出
GPIO_InitStruct.Pull = GPIO_PULLDOWN; //下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); //PC6初始化
/*TIM4_CH1功能引腳IO初始化*/
GPIO_InitStruct.Pin = GPIO_PIN_6; //引腳
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //PB6初始化
}
4、小結
遇到問題上網(wǎng)查,如果有同樣的問題可能會比較快速解決,但是如果找不到同樣的問題,翻翻數(shù)據(jù)手冊和參考手冊可能更有利于問題快速解決。文章來源:http://www.zghlxwxcb.cn/news/detail-496107.html
官方資料是個好東西,后續(xù)還是要多翻翻參考手冊和HAL庫使用說明,加深印象,溫故而知新。文章來源地址http://www.zghlxwxcb.cn/news/detail-496107.html
到了這里,關于STM32F103定時器引腳重定義功能問題處理的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!