Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
H
haoJin750TFT
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
时昊
haoJin750TFT
Commits
e89a14b5
Commit
e89a14b5
authored
Aug 13, 2024
by
时昊
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
✨
feat:修改pwm相关驱动
parent
4d5a0069
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
49 additions
and
26 deletions
+49
-26
TrmerM.c
...are/Source/Device/Cmsemicon/BAT32A279/RTE/TrmerM/TrmerM.c
+49
-26
No files found.
Firmware/Source/Device/Cmsemicon/BAT32A279/RTE/TrmerM/TrmerM.c
View file @
e89a14b5
/*
* TrmerM.c
*
* Created on: 2024
年2月21日
* Created on: 2024
�?2�?21�?
*/
#include <stdint.h>
// #include "gpio.h"
...
...
@@ -25,21 +25,21 @@ typedef struct
// /*占空比精度千分之一*/
// extern void TimerB_PWM_Channel_Duty_Set(TIMERB_Channel_en_t enTimerBChannel, uint16_t u16Duty);
// extern void TimerB_PWM_Channel_Start(TIMERB_Channel_en_t enTimerBChannel);
// /*调用该函数后,仅重新调用开始函数功能即可正常使
用
*/
// /*调用该函数后,仅重新调用开始函数功能即可正常使
�?
*/
// extern void TimerB_PWM_Channel_Stop(TIMERB_Channel_en_t enTimerBChannel);
// /*仅休眠时可调用,调用该函数后需要重新初始化相关通道才可以正常使用
。
*/
// /*仅休眠时可调用,调用该函数后需要重新初始化相关通道才可以正常使用
�?
*/
// extern void TimerB_PWM_Channel_Sleep(TIMERB_Channel_en_t enTimerBChannel);
TMM_InitTypeDef
TIMM_InitStructure
[
2
]
=
{
0
};
static
uint32_t
cycle_pulse
[
2
];
//一个周期的时钟
数
//频率
static
uint32_t
high_level_Pulse
[
2
][
3
];
//高电平时钟数 //占空
比
static
uint32_t
cycle_pulse
[
2
];
//一个周期的时钟
�?
//频率
static
uint32_t
high_level_Pulse
[
2
][
3
];
//高电平时钟数 //占空
�?
static
uint32_t
pwm_duty
[
2
][
3
];
/**
* @brief 设置TimerM的定时器x的模式为比较输出
*
* @param counter 定时
器
* @param counter 定时
�?
* @param freq 比较输出频率
* @return uint8_t 返回0成功,非0失败
*/
...
...
@@ -48,20 +48,32 @@ uint8_t TimerM_PWM_counter_Output_Init(TIMERM_PWM_Counter_en_t counter, uint16_t
if
(
counter
==
TIMERM_COUNTER0
)
{
TIMM_InitStructure
[
counter
].
TMM_Select
=
TMM0
;
TIMM_InitStructure
[
counter
].
TMM_Channel
=
TMM_Channel_A
|
TMM_Channel_B
|
TMM_Channel_C
|
TMM_Channel_D
;
TIMM_InitStructure
[
counter
].
TMM_Mode
=
TMM_Mode_PWM
;
TIMM_InitStructure
[
counter
].
TMM_CounterClear
=
TM_Clear_Match_TMGRA
;
//when TM is matched with TMGRA, TM0 is cleared
TIMM_InitStructure
[
counter
].
TMM_Intp
=
TMM_Int_NONE
;
///compare match interrupt enable A (IMIEA)
}
else
if
(
counter
==
TIMERM_COUNTER1
)
{
TIMM_InitStructure
[
counter
].
TMM_Select
=
TMM1
;
TIMM_InitStructure
[
counter
].
TMM_Channel
=
TMM_Channel_A
|
TMM_Channel_B
;
//|TMM_Channel_C|TMM_Channel_D;
TIMM_InitStructure
[
counter
].
TMM_Mode
=
TMM_Mode_PWM
;
TIMM_InitStructure
[
counter
].
TMM_CounterClear
=
TM_Clear_Match_TMGRA
;
//when TM is matched with TMGRA, TM0 is cleared
TIMM_InitStructure
[
counter
].
TMM_Intp
=
TMM_Int_NONE
;
///compare match interrupt enable A (IMIEA)
}
else
{
return
1
;
}
TIMM_InitStructure
[
counter
].
TMM_Channel
=
TMM_Channel_A
|
TMM_Channel_B
|
TMM_Channel_C
|
TMM_Channel_D
;
TIMM_InitStructure
[
counter
].
TMM_Mode
=
TMM_Mode_PWM
;
TIMM_InitStructure
[
counter
].
TMM_CounterClear
=
TM_Clear_Match_TMGRA
;
//when TM is matched with TMGRA, TM0 is cleared
TIMM_InitStructure
[
counter
].
TMM_Intp
=
TMM_Int_IMIA
;
///compare match interrupt enable A (IMIEA)
//
TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_A|TMM_Channel_B|TMM_Channel_C|TMM_Channel_D;
//
TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
//
TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
//
TIMM_InitStructure[counter].TMM_Intp = TMM_Int_IMIA; ///compare match interrupt enable A (IMIEA)
if
(
freq
>
2000
)
{
...
...
@@ -83,7 +95,7 @@ uint8_t TimerM_PWM_counter_Output_Init(TIMERM_PWM_Counter_en_t counter, uint16_t
return
1
;
}
TIMM_InitStructure
[
counter
].
TMM_CHA_Pulse
=
cycle_pulse
[
counter
]
&
0x0FFFF
;
//这里需要计算,调试
下
period; //周期设置为period
TIMM_InitStructure
[
counter
].
TMM_CHA_Pulse
=
cycle_pulse
[
counter
]
&
0x0FFFF
;
//这里需要计算,调试
�?
period; //周期设置为period
...
...
@@ -103,23 +115,34 @@ uint8_t TimerM_PWM_counter_Output_Init(TIMERM_PWM_Counter_en_t counter, uint16_t
//uint8_t TimerM_PWM_counter_Output_Init(TIMERM_PWM_Counter_en_t counter, uint16_t freq)//, uint32_t PWM_Clock //SystemCoreClock
//{
// if (counter == TIMERM_COUNTER0)
// SystemCoreClock = 64000000UL;
//
// if (counter == TIMERM_COUNTER0)
// {
// TIMM_InitStructure[counter].TMM_Select = TMM0;
//
// TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_B|TMM_Channel_C|TMM_Channel_D;
// TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
// TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
// TIMM_InitStructure[counter].TMM_Intp = TMM_Int_IMIA; ///compare match interrupt enable A (IMIEA)
// }
// else if (counter == TIMERM_COUNTER1)
// {
// TIMM_InitStructure[counter].TMM_Select = TMM1;
// TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_B;
// TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
// TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
// TIMM_InitStructure[counter].TMM_Intp = TMM_Int_IMIA; ///compare match interrupt enable A (IMIEA)
// }
// else
// {
// return 1;
// }
//
// TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_A|TMM_Channel_B|TMM_Channel_C|TMM_Channel_D;
// TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
// TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
// TIMM_InitStructure[counter].TMM_Intp = TMM_Int_IMIA; ///compare match interrupt enable A (IMIEA)
//
//
TIMM_InitStructure[counter].TMM_Channel = TMM_Channel_A|TMM_Channel_B|TMM_Channel_C|TMM_Channel_D;
//
//
TIMM_InitStructure[counter].TMM_Mode = TMM_Mode_PWM;
//
//
TIMM_InitStructure[counter].TMM_CounterClear = TM_Clear_Match_TMGRA; //when TM is matched with TMGRA, TM0 is cleared
//
//
TIMM_InitStructure[counter].TMM_Intp = TMM_Int_IMIA; ///compare match interrupt enable A (IMIEA)
//
// if (freq > 2000)
// {
...
...
@@ -141,7 +164,7 @@ uint8_t TimerM_PWM_counter_Output_Init(TIMERM_PWM_Counter_en_t counter, uint16_t
// return 1;
// }
//
// TIMM_InitStructure[counter].TMM_CHA_Pulse = cycle_pulse[counter] & 0x0FFFF;//这里需要计算,调试
下
period; //周期设置为period
// TIMM_InitStructure[counter].TMM_CHA_Pulse = cycle_pulse[counter] & 0x0FFFF;//这里需要计算,调试
�?
period; //周期设置为period
//
//
//
...
...
@@ -164,9 +187,9 @@ uint8_t TimerM_PWM_counter_Output_Init(TIMERM_PWM_Counter_en_t counter, uint16_t
/**
* @brief 设置timerM定时器x通道x的占空比
*
* @param counter 定时
器
* @param counter 定时
�?
* @param ch 通道
* @param duty 占空
比 xxxx/1000 千分之
* @param duty 占空
�? xxxx/1000 千分�?
* @param ActiveLevel 0负占空比 1正占空比
* @return uint8_t 返回0成功,非0失败
*/
...
...
@@ -178,7 +201,7 @@ uint8_t TimerM_PWM_CH_Output_init(TIMERM_PWM_Counter_en_t counter, TIMERM_PWM_Ch
switch
(
ch
)
{
case
TIMERM_CHB
:
TIMM_InitStructure
[
counter
].
TMM_CHB_Pulse
=
((
cycle_pulse
[
counter
])
)
&
0x0FFFF
;
//TM计数达到TMGRB. 占空
比
:duty2/period
TIMM_InitStructure
[
counter
].
TMM_CHB_Pulse
=
((
cycle_pulse
[
counter
])
)
&
0x0FFFF
;
//TM计数达到TMGRB. 占空
�?
:duty2/period
TIMM_InitStructure
[
counter
].
TMM_PWM
.
TMM_CHB
.
TMM_PWMInitLevel
=
TMM_PWMInitLevel_High
;
TIMM_InitStructure
[
counter
].
TMM_PWM
.
TMM_CHB
.
TMM_PWMActiveLevel
=
ActiveLevel
;
if
(
counter
==
TIMERM_COUNTER0
)
...
...
@@ -194,7 +217,7 @@ uint8_t TimerM_PWM_CH_Output_init(TIMERM_PWM_Counter_en_t counter, TIMERM_PWM_Ch
break
;
case
TIMERM_CHC
:
TIMM_InitStructure
[
counter
].
TMM_CHC_Pulse
=
((
cycle_pulse
[
counter
])
)
&
0x0FFFF
;
//TM计数达到TMGRC. 占空
比
:duty2/period
TIMM_InitStructure
[
counter
].
TMM_CHC_Pulse
=
((
cycle_pulse
[
counter
])
)
&
0x0FFFF
;
//TM计数达到TMGRC. 占空
�?
:duty2/period
TIMM_InitStructure
[
counter
].
TMM_PWM
.
TMM_CHC
.
TMM_PWMInitLevel
=
TMM_PWMInitLevel_High
;
TIMM_InitStructure
[
counter
].
TMM_PWM
.
TMM_CHC
.
TMM_PWMActiveLevel
=
ActiveLevel
;
if
(
counter
==
TIMERM_COUNTER0
)
...
...
@@ -209,7 +232,7 @@ uint8_t TimerM_PWM_CH_Output_init(TIMERM_PWM_Counter_en_t counter, TIMERM_PWM_Ch
break
;
case
TIMERM_CHD
:
TIMM_InitStructure
[
counter
].
TMM_CHD_Pulse
=
((
cycle_pulse
[
counter
])
)
&
0x0FFFF
;
//TM计数达到TMGRD. 占空
比
:duty3/period
TIMM_InitStructure
[
counter
].
TMM_CHD_Pulse
=
((
cycle_pulse
[
counter
])
)
&
0x0FFFF
;
//TM计数达到TMGRD. 占空
�?
:duty3/period
TIMM_InitStructure
[
counter
].
TMM_PWM
.
TMM_CHD
.
TMM_PWMInitLevel
=
TMM_PWMInitLevel_High
;
//TMM_PWMInitLevel_High;//
TIMM_InitStructure
[
counter
].
TMM_PWM
.
TMM_CHD
.
TMM_PWMActiveLevel
=
ActiveLevel
;
//TMM_PWMActiveLevel_Low;//TMM_PWMActiveLevel_High;//
if
(
counter
==
TIMERM_COUNTER0
)
...
...
@@ -264,7 +287,7 @@ extern void TMM1_Set_Counter(uint8_t ch,uint16_t value);
*
* @param counter 定时器x
* @param ch 通道x
* @param duty 占空
比
千分之一
* @param duty 占空
�?
千分之一
* @return uint8_t 返回0成功,非0失败
*/
uint8_t
TimerM_PWM_set_duty
(
TIMERM_PWM_Counter_en_t
counter
,
TIMERM_PWM_Channel_en_t
ch
,
uint16_t
duty
)
...
...
@@ -302,11 +325,11 @@ uint8_t TimerM_PWM_set_duty(TIMERM_PWM_Counter_en_t counter, TIMERM_PWM_Channel_
*
* @param counter 定时器x
* @param freq PWM频率
* @return uint8_t 0成功
非
0失败
* @return uint8_t 0成功
�?
0失败
*
* @note 频率范围有两种,50~2000 2001~最大,如果初始话的频率和目标频率在一个区间可以使用TimerM_PWM_set_freq2函数来优雅的切换频率
,
* @note 频率范围有两种,50~2000 2001~最大,如果初始话的频率和目标频率在一个区间可以使用TimerM_PWM_set_freq2函数来优雅的切换频率
�?
* 如果不在一个频率区间就需要使用TimerM_PWM_set_freq来不优雅的切换频率,
* 如果看不懂注释也使用TimerM_PWM_set_freq来切换频率
。
* 如果看不懂注释也使用TimerM_PWM_set_freq来切换频率
�?
*/
uint8_t
TimerM_PWM_set_freq
(
TIMERM_PWM_Counter_en_t
counter
,
uint16_t
freq
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment