你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F411RE Nucleo笔记-按键控制PWM占空比

[复制链接]
hjl240 发布时间:2015-2-4 10:08
本帖最后由 hjl240 于 2015-2-4 10:09 编辑

此次用到STM32F411RENucleo开发板,用到Keil MDK5.12和STM32CubeMx软件。
首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。
1.png
图1 PWM配置
2.png
图2 按键IO口配置
然后生成Keil工程。
用Keil打开。
         首先修改有关PWM方面的代码。

PWM初始化代码如下:
  1. /* TIM10 init function */
  2. void MX_TIM10_Init(void)
  3. {
  4.   TIM_OC_InitTypeDef sConfigOC;

  5.   htim10.Instance = TIM10;
  6.   htim10.Init.Prescaler = 0;
  7.   htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
  8.   htim10.Init.Period = 0;
  9.   htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  10.   HAL_TIM_Base_Init(&htim10);

  11.   HAL_TIM_PWM_Init(&htim10);

  12.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  13.   sConfigOC.Pulse = 0;
  14.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  15.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  16.   HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1);
  17. }
复制代码
查看头文件stm32f4xx_hal_tim.h,可以知道定时器初始化参数的含义如下:
3.png
4.png
从头文件中可以看出,要想简单配置PWM很简单,只要改变PWM周期的值与脉冲值就好。
比如将改变一下两个语句:
htim10.Init.Period = 1000;
sConfigOC.Pulse = 200;
便将PWM配置为周期为1000个定时器周期,高电平持续时间为200个定时器时钟周期,占空比为200/1000=20%

要想用按键控制PWM占空比,我们只需要修改一下PWM初始化函数,修改如下:
5.png

修改此函数之后,前面的函数声明也要改。改为:static void MX_TIM10_Init(int period,intpulse);

要想PWM工作,需要启动PWM查看头文件stm32f4xx_hal_tim.h,可以看到如下函数:
6.png

这是PWM启动与停止的函数。
最后看看按键,只需要把按键配置为上拉模式就好。
在按键初始化中,将
GPIO_InitStruct.Pull= GPIO_NOPULL;
改为
GPIO_InitStruct.Pull= GPIO_PULLUP;

接下来便可以写主函数。
  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */
  4.         int i=100;
  5.   /* USER CODE END 1 */

  6.   /* MCU Configuration----------------------------------------------------------*/

  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  8.   HAL_Init();

  9.   /* Configure the system clock */
  10.   SystemClock_Config();

  11.   /* System interrupt init*/
  12.   /* Sets the priority grouping field */
  13.   HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
  14.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

  15.   /* Initialize all configured peripherals */
  16.   MX_GPIO_Init();
  17.   MX_TIM10_Init(1000,100);//PWM初始化

  18.   /* USER CODE BEGIN 2 */
  19.         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
  20.   /* USER CODE END 2 */

  21.   /* USER CODE BEGIN 3 */
  22.   /* Infinite loop */
  23.   while (1)
  24.   {
  25.                 if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))//如果按键按下
  26.                 {
  27.                         i=i+100;
  28.                         if(i==1000) i=100;
  29.                         HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);//停止PWM
  30.                         MX_TIM10_Init(1000,i);//PWM重新配置,周期为1000,高电平持续时间为i
  31.                         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
  32.                         while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按键释放
  33.                 }
  34.   }
  35.   /* USER CODE END 3 */

  36. }
复制代码
编译程序,下载程序,可以看到现象:
7.jpg


参考代码:
PWMChangeTest.zip (4.25 MB, 下载次数: 2481)
收藏 1 评论20 发布时间:2015-2-4 10:08

举报

20个回答
hjl240 回答时间:2015-2-5 08:07:08
tcmax 发表于 2015-2-5 00:43
我已经弄好了 可是固件库怎么加载啊?我百度了下说keil自带的固件库,可是找半天411的只有这些,请问你是 ...

我是用STM32CubeMX软件直接生产的Keil工程,简单又方便,不用自己添加其他文件,,,,你可以试试用STM32CubeMX软件
tcmax 回答时间:2015-2-5 00:43:04
hjl240 发表于 2015-2-4 19:10
有的,,可以更新一下软件包

我已经弄好了 可是固件库怎么加载啊?我百度了下说keil自带的固件库,可是找半天411的只有这些,请问你是怎么添加固件库的?难道是手动复制到文件夹里?
QQ图片20150205004211.jpg
yaowei 回答时间:2015-10-12 19:38:34
楼主,请问STM32F411RET复用IO口是哪个函数,我用的HAL库 ,怎么在GPIO.h里都没找到类似与407标准库的GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)的函数
大秦正声 回答时间:2015-2-4 10:49:50
谢谢分享!
tcmax 回答时间:2015-2-4 14:29:19
请问你的keil里有那个411re的选项吗 我的是最新版的怎么没有啊
hjl240 回答时间:2015-2-4 19:10:11
tcmax 发表于 2015-2-4 14:29
请问你的keil里有那个411re的选项吗 我的是最新版的怎么没有啊

有的,,可以更新一下软件包

411.png
拼命三郎V5 回答时间:2015-2-5 08:33:50
ssss.jpg
Ljmp 回答时间:2015-2-6 16:04:49
恩,刚用CUBX 还是有点不习惯哦
hjl240 回答时间:2015-2-8 08:51:45
Ljmp 发表于 2015-2-6 16:04
恩,刚用CUBX 还是有点不习惯哦

多用几次就习惯了
chuanc 回答时间:2015-6-9 09:17:57
这里所说的定时器周期,这个周期时间是多少呢?这个怎么确定呢?
lslp 回答时间:2015-7-14 16:12:21
我想问一下cubmax时钟树怎么设置的,怎么和我生成的系统时钟函数有好大的区别啊
新建位图图像.jpg
二愣子 回答时间:2015-7-15 09:49:44
楼主有简单点的方法么  比如说直接用sConfigOC.Pulse = 200;这一句改脉冲宽度,。。。因为我觉得每次改脉宽,就得重新初始化 ,效率会不会有点低。。当然我是没搞出来。。
stary666 回答时间:2015-7-15 12:18:54
看看,,,,,,,,,,,,
112207301219 回答时间:2015-8-8 17:20:33
不错,讲的很详细,很有学习价值。
你好我好大家好! 回答时间:2015-8-8 21:09:06
帮顶                 
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版