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

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

[复制链接]
hjl240 发布时间:2015-2-4 10:08
本帖最后由 hjl240 于 2015-2-4 10:09 编辑
, D! U/ V2 \, T( [' X2 }/ Z$ Y3 D3 R+ d
此次用到STM32F411RENucleo开发板,用到Keil MDK5.12和STM32CubeMx软件。
首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。
1.png
图1 PWM配置
2.png
图2 按键IO口配置
然后生成Keil工程。
用Keil打开。
         首先修改有关PWM方面的代码。

" Q$ j/ i4 Y' d- D
PWM初始化代码如下:
  1. /* TIM10 init function */
    $ G3 K5 z4 D. ~& i( ]
  2. void MX_TIM10_Init(void)
    1 t0 P+ p  A, `
  3. {; S: H8 B  j, \) l! J) n3 G: Z7 q
  4.   TIM_OC_InitTypeDef sConfigOC;
    2 ~8 C$ O! }5 n' a/ Y/ v$ N: L

  5. ; k$ o  k, @  A
  6.   htim10.Instance = TIM10;) C( N  d$ W7 a0 r+ D
  7.   htim10.Init.Prescaler = 0;' o4 u" r( |- F; B
  8.   htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
    - J/ o! i; V) R1 ]
  9.   htim10.Init.Period = 0;0 G2 ^( y$ _: b- h! d
  10.   htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    ) m; x7 i+ U' }5 T) \' ]% c9 m
  11.   HAL_TIM_Base_Init(&htim10);
    1 ~# h3 q& W$ {" z) w! N; e
  12. , u3 J0 r) Z+ b' Z4 r* O# U
  13.   HAL_TIM_PWM_Init(&htim10);
    * E" b6 z* J1 E5 q6 q
  14. ' }& o# T$ A0 \. f
  15.   sConfigOC.OCMode = TIM_OCMODE_PWM1;* {1 n+ A( s( u8 T* m" C( P" ]
  16.   sConfigOC.Pulse = 0;
    ; [9 h, R, I+ F6 g/ {7 B1 h
  17.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;; n. Y% X5 e9 y) l+ V
  18.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    9 ~: Q+ u" i- {2 {+ N
  19.   HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1);
    , P) B) K3 W8 N$ q+ v( `: |
  20. }( u( ^8 i4 \$ L
复制代码
查看头文件stm32f4xx_hal_tim.h,可以知道定时器初始化参数的含义如下:
3.png
4.png
从头文件中可以看出,要想简单配置PWM很简单,只要改变PWM周期的值与脉冲值就好。
比如将改变一下两个语句:
htim10.Init.Period = 1000;
sConfigOC.Pulse = 200;
便将PWM配置为周期为1000个定时器周期,高电平持续时间为200个定时器时钟周期,占空比为200/1000=20%

! t8 I) A% Y3 b8 ]8 ?4 j
要想用按键控制PWM占空比,我们只需要修改一下PWM初始化函数,修改如下:
5.png

8 R- c) r, h; }6 e
修改此函数之后,前面的函数声明也要改。改为:static void MX_TIM10_Init(int period,intpulse);

8 O3 O  _8 \& K+ H; n4 d/ v2 \
要想PWM工作,需要启动PWM查看头文件stm32f4xx_hal_tim.h,可以看到如下函数:
6.png

2 m2 k/ P: T; Q9 k" K& h4 _' u. ?
这是PWM启动与停止的函数。
最后看看按键,只需要把按键配置为上拉模式就好。
在按键初始化中,将
GPIO_InitStruct.Pull= GPIO_NOPULL;
改为
GPIO_InitStruct.Pull= GPIO_PULLUP;
  Z! r9 T7 @3 Z; I# ]; R
接下来便可以写主函数。
  1. int main(void)
    / {: [; `/ d3 q5 F. s) S
  2. {
    # E6 N) m1 n5 t7 p  o% I
  3. ) i9 j6 |# R% q8 L# z
  4.   /* USER CODE BEGIN 1 */
    , x9 Y* ?  J0 m, A4 j* V
  5.         int i=100;/ y  E7 o3 K) }) L
  6.   /* USER CODE END 1 */  D: A8 A. c7 @2 J& Z$ }- o+ g9 p; }
  7. 2 A" ~" t* V9 B+ b+ X' N5 c, t
  8.   /* MCU Configuration----------------------------------------------------------*/
    $ J2 _. A, `' e& q6 T; O/ _

  9. ; C0 V8 R3 H/ _$ H: d# x
  10.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */0 F" p2 e+ Y" i5 Y+ e! |- |& v
  11.   HAL_Init();
    5 _: x1 ^, ^$ i( E  v' {; P
  12. ) j  e7 ?7 I- E
  13.   /* Configure the system clock */
    * P. R% S, a" r* N3 s( I' r# V
  14.   SystemClock_Config();7 ?, V  e& x7 z7 n2 @/ D

  15. # {' W9 a5 W: J: D. _
  16.   /* System interrupt init*/
    ) I& d& ]5 L2 O0 j, W
  17.   /* Sets the priority grouping field */$ L, A* K/ n- T; z# V: T
  18.   HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
    ; I8 L+ p  B7 O; b7 N
  19.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    , ], q& y" ^7 G. @! b3 i
  20. 8 J! m/ F& @" m
  21.   /* Initialize all configured peripherals */
    # I6 O1 j( ~) q5 S4 q* t
  22.   MX_GPIO_Init();
    . x+ H1 s! g+ P! v% t: t' |, g
  23.   MX_TIM10_Init(1000,100);//PWM初始化
    ! J) Q# Z- h1 v; l* G

  24. / x; E5 Y. F: C* r; X3 p$ |
  25.   /* USER CODE BEGIN 2 */
    ' @" g+ x  J0 U8 b! E7 X
  26.         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
    2 z) ^1 W" q* |! ^
  27.   /* USER CODE END 2 */
    7 S0 g9 }* B6 b7 @

  28. $ @' e% a! G$ h" f5 l
  29.   /* USER CODE BEGIN 3 */
    - M3 Y( A, M6 [+ n: F' q( H0 z2 y
  30.   /* Infinite loop */% x9 M! q2 a- r: g6 x: N* S
  31.   while (1)# S+ ?# p$ j& U7 [3 }
  32.   {) M- V  C* B  h2 [
  33.                 if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))//如果按键按下. Z0 R6 X( T2 c2 J1 B. ~
  34.                 {9 A" p# k7 @* R2 S% ?. u0 o
  35.                         i=i+100;( d0 j1 h" w; K8 ~" K) S
  36.                         if(i==1000) i=100;% p( j0 r7 u4 U  e& x
  37.                         HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);//停止PWM6 y# z/ D" i- ?6 W" {, p) h# M/ x
  38.                         MX_TIM10_Init(1000,i);//PWM重新配置,周期为1000,高电平持续时间为i( ?* ~4 V" _1 B
  39.                         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
    & c+ g6 I- J) {2 m1 g. y
  40.                         while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按键释放- E* `* i4 [5 s; P9 n4 [
  41.                 }( _) e% j. k# C8 U
  42.   }5 Z$ Y/ a  O# |( p' J+ `
  43.   /* USER CODE END 3 */
    ! S: g' \4 P2 D! G" h. e( e

  44. , ]9 |- y( |# s9 c, @, a2 {
  45. }
    ; _: V3 r1 `- r! w6 I3 _( y
复制代码
编译程序,下载程序,可以看到现象:
7.jpg

! T/ ~* F( M7 P( G# J! f; V* y9 ~( m6 g7 ?
参考代码:
PWMChangeTest.zip (4.25 MB, 下载次数: 2480)
收藏 1 评论20 发布时间:2015-2-4 10:08

举报

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

* e3 n0 t# U9 M3 B6 t4 w我是用STM32CubeMX软件直接生产的Keil工程,简单又方便,不用自己添加其他文件,,,,你可以试试用STM32CubeMX软件
tcmax 回答时间:2015-2-5 00:43:04
hjl240 发表于 2015-2-4 19:10. H6 f0 M6 |5 q# X9 t- s
有的,,可以更新一下软件包
" B. I. G  Y0 W/ k! e
我已经弄好了 可是固件库怎么加载啊?我百度了下说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的选项吗 我的是最新版的怎么没有啊% y: h0 @5 f: T# s* b
hjl240 回答时间:2015-2-4 19:10:11
tcmax 发表于 2015-2-4 14:29
5 S8 E( N/ Q. o$ _请问你的keil里有那个411re的选项吗 我的是最新版的怎么没有啊

, N& R" \9 t2 V$ |% A- d7 R; c9 s有的,,可以更新一下软件包
3 ^, R, z3 @: W" N- W3 j) E  w3 Q# ^9 ]7 L0 Q" r, W2 {
411.png # Z% T: k+ T: f. L& m# m2 I
拼命三郎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
3 h! L7 u9 H! {5 @) Q) d恩,刚用CUBX 还是有点不习惯哦

% j# i& g$ M5 i$ a+ b多用几次就习惯了
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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版