|
更新一下,我好像發(fā)現(xiàn)問題所在了
問題出在缺少語句__HAL_RCC_AFIO_CLK_ENABLE();
而且這個語句必須在PWM輸出引腳重映射語句前執(zhí)行,否則就不會執(zhí)行PWM輸出引腳重映射,PWM不會從PB5輸出。
現(xiàn)在在我的程序中單獨執(zhí)行PWM輸出,PB5就可以正常亮滅了
- //Main.c
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
- void SystemClock_Config(void);
- void LED_Init(void);
- #define LED1_ON HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_RESET)
- #define LED1_OFF HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_SET)
- #define LED1_Toggle HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5)
- #define LED2_ON HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5, GPIO_PIN_RESET)
- #define LED2_OFF HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5, GPIO_PIN_SET)
- #define LED2_Toggle HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5)
- void Tim3_Init(void);
- void Tim3B_Init(void);
- TIM_HandleTypeDef TIM3_Handler; //定時器句柄
- TIM_OC_InitTypeDef TIM3_CH2Handler; //定時器3通道2句柄
- uint ret;
- int compare=0;
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
-
- // LED_Init();
- // LED1_OFF;
- // LED2_OFF;
-
- //Tim3B_Init();
-
- Tim3_Init();
-
- while (1)
- {
-
- }
- }
- /**
- * @brief System Clock Configuration
- * The system Clock is configured as follow :
- * System Clock source = PLL (HSE)
- * SYSCLK(Hz) = 72000000
- * HCLK(Hz) = 72000000
- * AHB Prescaler = 1
- * APB1 Prescaler = 2
- * APB2 Prescaler = 1
- * HSE Frequency(Hz) = 8000000
- * HSE PREDIV1 = 1
- * PLLMUL = 9
- * Flash Latency(WS) = 2
- * @param None
- * @retval None
- */
- void SystemClock_Config(void)
- {
- RCC_ClkInitTypeDef clkinitstruct = {0};
- RCC_OscInitTypeDef oscinitstruct = {0};
-
- /* Enable HSE Oscillator and activate PLL with HSE as source */
- oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
- oscinitstruct.HSEState = RCC_HSE_ON;
- oscinitstruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
- oscinitstruct.PLL.PLLState = RCC_PLL_ON;
- oscinitstruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- oscinitstruct.PLL.PLLMUL = RCC_PLL_MUL9;
- if (HAL_RCC_OscConfig(&oscinitstruct)!= HAL_OK)
- {
- /* Initialization Error */
- while(1);
- }
- /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
- clocks dividers */
- clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
- clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;
- clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;
- if (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2)!= HAL_OK)
- {
- /* Initialization Error */
- while(1);
- }
- }
- void LED_Init(void)
- {
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOE_CLK_ENABLE();
-
- GPIO_InitTypeDef GPIO_Init_Struct;
-
- GPIO_Init_Struct.Pin=GPIO_PIN_5;
- GPIO_Init_Struct.Mode=GPIO_MODE_OUTPUT_PP;
- GPIO_Init_Struct.Pull=GPIO_PULLUP;
- GPIO_Init_Struct.Speed=GPIO_SPEED_FREQ_HIGH;
-
- HAL_GPIO_Init(GPIOB, &GPIO_Init_Struct);
-
- HAL_GPIO_Init(GPIOE, &GPIO_Init_Struct);
- }
- void Tim3_Init(void)
- {
- TIM3_Handler.Instance=TIM3; //定時器3
- TIM3_Handler.Init.Prescaler=(7200-1); //定時器分頻
- TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上計數(shù)模式
- TIM3_Handler.Init.Period=(50000-1); //自動重裝載值
- TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
- HAL_TIM_PWM_Init(&TIM3_Handler); //初始化PWM
-
- TIM3_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式選擇PWM1
- TIM3_CH2Handler.Pulse=(50000-1)/2; //設(shè)置比較值,此值用來確定占空比,默認(rèn)比較值為自動重裝載值的一半,即占空比為50%
- TIM3_CH2Handler.OCPolarity=TIM_OCPOLARITY_LOW; //輸出比較極性為低
-
- HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_2);//配置TIM3通道2
-
- HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_2);//開啟PWM通道2
- }
- void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
- {
- GPIO_InitTypeDef GPIO_Initure;
-
- if(htim->Instance==TIM3)
- {
- __HAL_RCC_TIM3_CLK_ENABLE(); //使能定時器3
- __HAL_RCC_AFIO_CLK_ENABLE();
- __HAL_AFIO_REMAP_TIM3_PARTIAL(); //TIM3通道引腳部分重映射使能
- __HAL_RCC_GPIOB_CLK_ENABLE(); //開啟GPIOB時鐘
-
-
- GPIO_Initure.Pin=GPIO_PIN_5; //PB5
- GPIO_Initure.Mode=GPIO_MODE_AF_PP; //復(fù)用推挽輸出
- //GPIO_Initure.Pull=GPIO_PULLUP; //上拉
- GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
- HAL_GPIO_Init(GPIOB,&GPIO_Initure);
- }
- }
- void Tim3B_Init(void)
- {
- TIM3_Handler.Instance=TIM3; //定時器3
- TIM3_Handler.Init.Prescaler=(72-1); //定時器分頻
- TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上計數(shù)模式
- TIM3_Handler.Init.Period=(50000-1); //自動重裝載值
- TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
- HAL_TIM_Base_Init(&TIM3_Handler); //初始化PWM
-
- HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定時器3和定時器3更新中斷:TIM_IT_UPDATE
- }
- void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
- {
- if(htim->Instance==TIM3)
- {
- __HAL_RCC_TIM3_CLK_ENABLE(); //使能TIM3時鐘
- HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //設(shè)置中斷優(yōu)先級,搶占優(yōu)先級1,子優(yōu)先級3
- HAL_NVIC_EnableIRQ(TIM3_IRQn); //開啟ITM3中斷
- }
- }
- //定時器3中斷服務(wù)函數(shù)
- void TIM3_IRQHandler(void)
- {
- HAL_TIM_IRQHandler(&TIM3_Handler);
- }
- //回調(diào)函數(shù),定時器中斷服務(wù)函數(shù)調(diào)用
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- if(htim==(&TIM3_Handler))
- {
- LED1_Toggle; //LED1反轉(zhuǎn)
- }
- }
復(fù)制代碼
|
|