1. 使用 CubeMx 创建 PWM 工程5 n h2 s n6 a
打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.: ?3 B/ n8 p, T
s9 `' o. S9 O- O1 |$ S
配置定时器/ j0 Z1 j L) B& k
* ]1 S1 w& ?4 b' o: A3 }9 R5 O( W# j r4 @& c) {: Y
3 P8 y J# [4 ~配置定时器1的通道1和通道2 产生PWM;
; V+ H7 L$ a' ^& ~ ^设置定时器1的主频:设置了( 63 + 1) 分频即定时器主频为1M% {* D9 F3 T. E, n
设置PWM定时的周期计数为 1000 即 1000HZ! x& w: t; f; t. ]0 p( b8 e
~) X4 ]2 T3 P+ r {( W% \
2 a4 }+ V+ [; M+ g9 E/ p5 T0 X
% J* ^: T3 t0 h. a4 F$ z设置通道一 翻转的计数值为 500 即占空比为 50%% `% n9 J* Z% g; x$ V+ w* X$ N
设置通道二 翻转的计数值为 200 即占空比为 20%0 G" U! a- x! V) L1 K
~8 T0 |7 I* e配置时钟* h( @, ?! B2 r
2 [( B4 x8 L" M1 q- S/ H
: J% s& j h. S使用内部高速时钟,将主频倍频到64MHZ
' K# F, Y# m4 |! Z& A
6 {. z! w# c, d" A% ~配置工程相关选项* p( O9 o0 w3 o b4 c* F! L3 c6 ^' j! n8 P
0 ^6 p; q% H: N# d. g( \: U. J6 v" N4 ~: @: F; Y; g
; X% r% S; U& s- c9 a" q2 J6 p6 |
配置完成后点击右上角 GENERATE CODE完成工程的创建3 b1 U$ R7 T& t0 o! K, T
4 ]( K. m6 z. t9 [
2. 编程
8 O8 Q5 h$ D7 r8 r定时器的初始化函数都已经由CubeMx生成,我们仅需要打开 PWM的使能即可
2 H7 R G- V2 i' \( N+ G( \6 U, ?/ @. v4 [
- /**/ {* y: a+ `0 n1 ]
- * @brief The application entry point.2 R, J8 Y& u6 L$ y) J
- * @retval int
- v, t' O( P. n/ {4 F( w3 D7 q% Z; s - */
5 q0 C ]& G: ?0 j, g - int main(void)
" R% G' Q4 G5 f/ d - {
4 J$ e g: n* r) B7 b - /* USER CODE BEGIN 1 */1 ^( B R8 N. Y* j/ ?
7 C G7 l) |5 h1 T" M/ Y1 Z$ D- /* USER CODE END 1 */1 E) V- ?" }, @3 U( {
5 h' F( O6 e1 D |% v- /* MCU Configuration--------------------------------------------------------*/
5 y# b _$ E3 J9 V& R% d - 6 S9 v9 V1 S/ p. u8 s5 n: x8 d- ~
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
8 D! p9 k# A0 b$ v; l' B0 M - HAL_Init();
4 H0 f4 N: }( O - 8 _# l$ N9 l' K" n p! k- C/ H
- /* USER CODE BEGIN Init */ K& q9 n& j, f) `
- + p- }7 N& |( V+ U
- /* USER CODE END Init */7 y4 N/ z; Z8 v6 @1 c
- 0 A, \; ^0 _, Z- D0 N9 ]
- /* Configure the system clock */
9 t* B0 R9 E2 _; G - SystemClock_Config();9 N* q5 h# ^% d
. a/ K/ g( |/ e( d- /* USER CODE BEGIN SysInit */
% t2 K3 j* v$ i! L
( e/ @. d/ ]. ~( Z/ @+ Q2 M; [" Q5 k- /* USER CODE END SysInit */8 W! }$ o. ?# P a1 d* B& B
- 9 j1 B( I- x2 k4 D& ]6 h$ n
- /* Initialize all configured peripherals */& H- S1 d( B K- H6 R0 l% Y) [
- MX_GPIO_Init();& p' B& a: B6 j0 j8 o
- MX_TIM1_Init();( u! s9 {% _8 z
- /* USER CODE BEGIN 2 */" }7 ^% R, W3 c
- HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); //1000HZ 50%占空比的PWM
. y/ [/ v6 d8 |1 X% a/ U6 i/ L - HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); //1000HZ 20%占空比的PWM
, X9 q2 {* c; R2 a5 q4 o* T8 N! p - /* USER CODE END 2 */- p' I( u9 B4 T; q3 K9 H8 u
- 4 a; @( ]8 {& v8 x1 B$ x
- /* Infinite loop */
* }/ w2 a1 M' l: ~+ E - /* USER CODE BEGIN WHILE */: D$ J/ _ |; {7 d; Z3 h) z: k
- while(1)
. ?$ Y: x5 D) Z) O - {
- P( {' S' s/ ]" l% M" N - /* USER CODE END WHILE */
9 b' B9 Z! h. @7 @ - ' Z: b6 |! @% [7 U4 }4 f0 ~
- /* USER CODE BEGIN 3 */9 d! @, B+ l- q7 O- s5 U
- }
/ O. _* }. d) k! T: Q0 {; g+ j - /* USER CODE END 3 */& i. L9 J" ?7 Y( Y8 [
- }
复制代码
3 g8 O0 }4 _1 W可以使用一下函数修改PWM的占空比- H6 v) D0 C( ^& W. p
! \; y! C" D2 y& j$ s: U- // 使用此宏定义修改占空比
6 a$ ^5 y5 M. v1 M" I - __HAL_TIM_SetCompare(__HANDLE__, __CHANNEL__, __COMPARE__)
复制代码 例如:
! b% W# b) c0 p5 |& J- L' ^' j! E) H8 [: U8 v* ]# o, c
- // 将定时器1的通道1 翻转计数修改为 800,在我们的例程上正好就是800/1000 即 80% 的占空比' p& ~, q7 f" L) H0 v
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1,800);
复制代码
, b# W E! [! j) E& ^. O5 A% \3. 实验现象
# [( x5 Y( z6 A7 }# n编译并将工程下载到开发板后,使用示波器或者逻辑分析器查看 PA8 和 PB3 引脚是否输出 1000HZ 且占空比分别为 50% 和 20% 的方波。. T1 b( P& n" V& H" i. U
1 u; ^2 j" c2 Z, `: c3 K) G7 V
* Q' b6 Z4 n7 T
; d5 U% @% c. y* S! Q# G. H
|