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

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

[复制链接]
hjl240 发布时间:2015-2-4 10:08
本帖最后由 hjl240 于 2015-2-4 10:09 编辑
2 G" D* v, k8 R7 q" R2 X& I8 f0 H5 l
此次用到STM32F411RENucleo开发板,用到Keil MDK5.12和STM32CubeMx软件。
首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。
1.png
图1 PWM配置
2.png
图2 按键IO口配置
然后生成Keil工程。
用Keil打开。
         首先修改有关PWM方面的代码。

! @5 t0 W& a: n$ ], h% f, r
PWM初始化代码如下:
  1. /* TIM10 init function */
    ! O9 I0 t) ?: ]  A
  2. void MX_TIM10_Init(void)$ J1 h7 F/ Z- {# X) s/ Z8 f, \
  3. {
    " J( K5 F3 ~' R
  4.   TIM_OC_InitTypeDef sConfigOC;
    ! M6 U& U% j$ @& ~7 S( h
  5. ' h# O8 x, \/ j1 p0 l" H
  6.   htim10.Instance = TIM10;
    ; J7 A* t0 @% N) R# C
  7.   htim10.Init.Prescaler = 0;* Y5 a  o3 ^# m/ ^
  8.   htim10.Init.CounterMode = TIM_COUNTERMODE_UP;# N7 Y; g, c4 o( l- k" N
  9.   htim10.Init.Period = 0;
    5 B& h6 H; O- M* m$ Z$ x
  10.   htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    5 i! G+ t! n5 p1 b2 A7 }. p1 U, y
  11.   HAL_TIM_Base_Init(&htim10);
    * A4 p. M$ N- a' R# _3 y8 Q

  12. $ a, A1 L" g1 {
  13.   HAL_TIM_PWM_Init(&htim10);
    5 ]7 \) S' B) E. Y* {" B) l

  14. ) `& X2 k5 ^! z8 m  m+ F
  15.   sConfigOC.OCMode = TIM_OCMODE_PWM1;& s& H3 |7 n5 `! x! w
  16.   sConfigOC.Pulse = 0;4 L- F0 y2 B$ j3 `5 ?* v
  17.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    6 L% r2 H9 A) K" W( ^
  18.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;# s3 T$ B9 n" u1 R+ f. V/ X( m" {
  19.   HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1);
    0 V! F0 z. Q# c# F' k# k, T7 }, a
  20. }
    # O8 u( b7 w& H) G. j
复制代码
查看头文件stm32f4xx_hal_tim.h,可以知道定时器初始化参数的含义如下:
3.png
与
4.png
从头文件中可以看出,要想简单配置PWM很简单,只要改变PWM周期的值与脉冲值就好。
比如将改变一下两个语句:
htim10.Init.Period = 1000;
sConfigOC.Pulse = 200;
便将PWM配置为周期为1000个定时器周期,高电平持续时间为200个定时器时钟周期,占空比为200/1000=20%。

3 q& g* J" N# g  ], R8 z
要想用按键控制PWM占空比,我们只需要修改一下PWM初始化函数,修改如下:
5.png
" `) h/ Z% K* C. G  u# t9 C8 D; j
修改此函数之后,前面的函数声明也要改。改为:static void MX_TIM10_Init(int period,intpulse);

- q, k2 ]6 w7 ?6 ]( h( I
要想PWM工作,需要启动PWM。查看头文件stm32f4xx_hal_tim.h,可以看到如下函数:
6.png
5 j6 k* I7 ?5 F# c) {% `
这是PWM启动与停止的函数。
最后看看按键,只需要把按键配置为上拉模式就好。
在按键初始化中,将
GPIO_InitStruct.Pull= GPIO_NOPULL;
改为
GPIO_InitStruct.Pull= GPIO_PULLUP;

  w8 w' i+ D2 N* V, p
接下来便可以写主函数。
  1. int main(void)6 c& V. F# Z) x0 y
  2. {, b1 _+ J- q8 j0 V+ b

  3. , y6 G, U  s1 y1 \' ?. q0 I
  4.   /* USER CODE BEGIN 1 */
      u' o" U* n2 j/ r. S
  5.         int i=100;
    + B! X0 Z" Y1 R$ F3 [+ O& {, U
  6.   /* USER CODE END 1 */3 z, I6 ^5 m; ^+ c& W+ f
  7. 4 H/ V! d# [- b" u
  8.   /* MCU Configuration----------------------------------------------------------*/
    ( I$ h' c- j4 l# l0 M4 w: E* E# T, ?
  9. / M$ h! [9 o" v
  10.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */5 @$ F) q3 ?; d- l1 d5 X3 k" v
  11.   HAL_Init();( _/ T8 g$ l/ I1 K

  12. " [. r5 ?8 ~! H& H% [
  13.   /* Configure the system clock */7 U. S: D; C) c" U- e
  14.   SystemClock_Config();
    + }( A9 \2 \: S! w1 b1 @: g

  15. " y! X9 N% R/ c3 J+ x' C+ `- N
  16.   /* System interrupt init*/* l& U& S8 p, }+ A% d! _( f* `
  17.   /* Sets the priority grouping field */
    4 ^! ^. \  X) d8 M
  18.   HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);. |& r! C4 x% f
  19.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);" _& b9 X' b: ?' {

  20. . l3 D/ ~: {* Y9 \* J) Q& _0 _7 ?
  21.   /* Initialize all configured peripherals */
    $ d" @9 s& G3 z* X6 `+ h/ }. q2 K
  22.   MX_GPIO_Init();
    ' s$ {  C9 J: _) ^) }
  23.   MX_TIM10_Init(1000,100);//PWM初始化' a# k% o0 d: R$ Z- v/ d' t
  24. " H7 X4 G: m* ?/ Q! a0 a
  25.   /* USER CODE BEGIN 2 */
    ( _+ ~; H6 u8 U! F. p  d
  26.         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM- b0 b! l# L  m( _2 t0 _4 ^9 V
  27.   /* USER CODE END 2 */
    2 G4 D$ x/ A! A$ H: P# ^8 {3 a

  28. 2 t( V1 g" C( B0 S+ i# O- ^9 S
  29.   /* USER CODE BEGIN 3 */
    1 f% B8 m9 v3 @4 |8 [) d
  30.   /* Infinite loop */1 J+ n) Z9 P: P- W0 _7 a) k9 [
  31.   while (1). `: _/ v, V4 t6 v% d% e
  32.   {! m* z: V: w  E4 \( E# M1 Y
  33.                 if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))//如果按键按下$ T4 W0 Z; q2 Q9 N
  34.                 {
    $ e* y( e: ]9 ]' l) ?
  35.                         i=i+100;9 `, n0 N; {9 `0 r1 P
  36.                         if(i==1000) i=100;3 e" ^  Y- r2 `) {
  37.                         HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);//停止PWM+ R1 g" W$ n- Y5 {- R
  38.                         MX_TIM10_Init(1000,i);//PWM重新配置,周期为1000,高电平持续时间为i
    4 g( K- ]8 [, f4 W# W( [
  39.                         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM- a& K6 w" d; r3 B5 V& H# m
  40.                         while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按键释放+ t( e: T# M, p
  41.                 }
    ' [9 U  U9 d! Z0 Q% S# S
  42.   }; N: }. D# L9 S
  43.   /* USER CODE END 3 */" @" c! h2 Y  D$ [

  44. $ j2 q2 g$ h" ~
  45. }2 [0 s4 }1 t! Q+ e* G
复制代码
编译程序,下载程序,可以看到现象:
7.jpg
1 Y* _& X9 B5 |6 f7 r- p
; k: p( `  C& l3 y5 y! @' T
参考代码:
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
; r! K9 @8 G, T% Q7 a1 E7 r我已经弄好了 可是固件库怎么加载啊?我百度了下说keil自带的固件库,可是找半天411的只有这些,请问你是 ...

( m! Z$ }/ U8 A* c& G$ \5 Y0 }我是用STM32CubeMX软件直接生产的Keil工程,简单又方便,不用自己添加其他文件,,,,你可以试试用STM32CubeMX软件
tcmax 回答时间:2015-2-5 00:43:04
hjl240 发表于 2015-2-4 19:10
& p8 q/ x# ~7 C有的,,可以更新一下软件包
% L  c' c/ q7 K# b
我已经弄好了 可是固件库怎么加载啊?我百度了下说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的选项吗 我的是最新版的怎么没有啊3 \; ?, g( `( X9 J3 X
hjl240 回答时间:2015-2-4 19:10:11
tcmax 发表于 2015-2-4 14:29  x1 u+ D- Q. ?7 O! ~4 F
请问你的keil里有那个411re的选项吗 我的是最新版的怎么没有啊

% H9 ~& f) d6 X" {. Q# Y有的,,可以更新一下软件包
: V0 Y$ O: a8 d9 H* v
+ J0 N; K+ F. }4 L 411.png
% o& r/ K" h: t, A
拼命三郎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:041 E7 }, K$ F+ a% u9 a6 E
恩,刚用CUBX 还是有点不习惯哦

6 ^  b& Q# O) f# J多用几次就习惯了
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版