本帖最后由 hjl240 于 2015-2-4 10:09 编辑
此次用到STM32F411RENucleo开发板,用到Keil MDK5.12和STM32CubeMx软件。 首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。 图1 PWM配置 图2 按键IO口配置 然后生成Keil工程。 用Keil打开。 首先修改有关PWM方面的代码。
PWM初始化代码如下: - /* TIM10 init function */
- void MX_TIM10_Init(void)
- {
- TIM_OC_InitTypeDef sConfigOC;
- htim10.Instance = TIM10;
- htim10.Init.Prescaler = 0;
- htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim10.Init.Period = 0;
- htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- HAL_TIM_Base_Init(&htim10);
- HAL_TIM_PWM_Init(&htim10);
- sConfigOC.OCMode = TIM_OCMODE_PWM1;
- sConfigOC.Pulse = 0;
- sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
- sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
- HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1);
- }
复制代码查看头文件stm32f4xx_hal_tim.h,可以知道定时器初始化参数的含义如下: 与 从头文件中可以看出,要想简单配置PWM很简单,只要改变PWM周期的值与脉冲值就好。 比如将改变一下两个语句: htim10.Init.Period = 1000; sConfigOC.Pulse = 200; 便将PWM配置为周期为1000个定时器周期,高电平持续时间为200个定时器时钟周期,占空比为200/1000=20%。
要想用按键控制PWM占空比,我们只需要修改一下PWM初始化函数,修改如下:
修改此函数之后,前面的函数声明也要改。改为:static void MX_TIM10_Init(int period,intpulse);
要想PWM工作,需要启动PWM。查看头文件stm32f4xx_hal_tim.h,可以看到如下函数:
这是PWM启动与停止的函数。 最后看看按键,只需要把按键配置为上拉模式就好。 在按键初始化中,将 GPIO_InitStruct.Pull= GPIO_NOPULL; 改为 GPIO_InitStruct.Pull= GPIO_PULLUP;
接下来便可以写主函数。 - int main(void)
- {
- /* USER CODE BEGIN 1 */
- int i=100;
- /* USER CODE END 1 */
- /* MCU Configuration----------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* Configure the system clock */
- SystemClock_Config();
- /* System interrupt init*/
- /* Sets the priority grouping field */
- HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
- HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_TIM10_Init(1000,100);//PWM初始化
- /* USER CODE BEGIN 2 */
- HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
- /* USER CODE END 2 */
- /* USER CODE BEGIN 3 */
- /* Infinite loop */
- while (1)
- {
- if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))//如果按键按下
- {
- i=i+100;
- if(i==1000) i=100;
- HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);//停止PWM
- MX_TIM10_Init(1000,i);//PWM重新配置,周期为1000,高电平持续时间为i
- HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
- while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按键释放
- }
- }
- /* USER CODE END 3 */
- }
复制代码
参考代码: |
我是用STM32CubeMX软件直接生产的Keil工程,简单又方便,不用自己添加其他文件,,,,你可以试试用STM32CubeMX软件
我已经弄好了 可是固件库怎么加载啊?我百度了下说keil自带的固件库,可是找半天411的只有这些,请问你是怎么添加固件库的?难道是手动复制到文件夹里?
有的,,可以更新一下软件包
多用几次就习惯了