久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32F401xx輸出指定個數,可調頻率、占空比的PWM波形 源程序
[打印本頁]
作者:
wx18114342591
時間:
2022-7-19 16:39
標題:
STM32F401xx輸出指定個數,可調頻率、占空比的PWM波形 源程序
單片機源程序如下:
/**
******************************************************************************
* @文件名 : main.c
* @作者 : strongerHuang
* @版本 : V1.0.0
* @日期 : 2018年06月23日
* @摘要 : 主函數 - Demo軟件工程
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2018-06-23 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的頭文件 --------------------------------------------------------------*/
#include "bsp.h"
#include "bsp_timer.h"
/************************************************
函數名稱 : Delay
功 能 : 軟件延時
參 數 : Cnt --- 延時計數
返 回 值 : 無
作 者 : strongerHuang
*************************************************/
static void Delay(uint32_t Cnt)
{
uint32_t i;
while(Cnt--)
{
for(i=0; i<0x100000; i++);
}
}
/************************************************
函數名稱 : System_Initializes
功 能 : 系統初始化
參 數 : 無
返 回 值 : 無
作 者 : strongerHuang
*************************************************/
void System_Initializes(void)
{
BSP_Initializes();
}
/************************************************
函數名稱 : main
功 能 : 主函數入口
參 數 : 無
返 回 值 : int
作 者 : strongerHuang
*************************************************/
int main(void)
{
System_Initializes();
while(1)
{
LED_TOGGLE(); //LED變化
Delay(5); //延時(約240ms)
PWM_Output(1000, 20, 10); //1KHz, 20%占空比, 10個脈沖
}
}
復制代碼
/**
******************************************************************************
* @文件名 : bsp_timer.c
* @作者 : strongerHuang
* @版本 : V1.0.0
* @日期 : 2018年06月23日
* @摘要 : 定時器底層源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2018-06-23 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的頭文件 --------------------------------------------------------------*/
#include "bsp_timer.h"
/******************************************* PWM輸出 ********************************************/
/************************************************
函數名稱 : PWM_TIM_Configuration
功 能 : PWM輸出定時器配置
參 數 : 無
返 回 值 : 無
作 者 : strongerHuang
*************************************************/
void PWM_TIM_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* 時鐘配置 */
RCC_APB1PeriphClockCmd(PWM_TIM_CLK, ENABLE);
RCC_AHB1PeriphClockCmd(PWM_TIM_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = PWM_TIM_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(PWM_TIM_GPIO_PORT, &GPIO_InitStructure);
/* 映射配置 */
GPIO_PinAFConfig(PWM_TIM_GPIO_PORT, PWM_TIM_SOURCE, PWM_TIM_AF);
/* 時基配置 */
TIM_TimeBaseStructure.TIM_Prescaler = PWM_PRESCALER; //預分頻值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //定時周期
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //分頻因子
TIM_TimeBaseInit(PWM_TIMx, &TIM_TimeBaseStructure);
/* PWM模式配置 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能輸出
TIM_OCInitStructure.TIM_Pulse = 0xFFFF; //脈寬值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性
PWM_TIM_OCxInit(PWM_TIMx, &TIM_OCInitStructure);
TIM_Cmd(PWM_TIMx, DISABLE);
}
/************************************************
函數名稱 : CNT_TIM_Configuration
功 能 : 計時定時器配置
參 數 : 無
返 回 值 : 無
作 者 : strongerHuang
*************************************************/
void CNT_TIM_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 時鐘配置 */
RCC_APB1PeriphClockCmd(CNT_TIM_CLK, ENABLE);
RCC_AHB1PeriphClockCmd(CNT_TIM_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = CNT_TIM_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(CNT_TIM_GPIO_PORT, &GPIO_InitStructure);
/* 映射配置 */
GPIO_PinAFConfig(CNT_TIM_GPIO_PORT, CNT_TIM_SOURCE, CNT_TIM_AF);
/* NVIC配置 */
NVIC_InitStructure.NVIC_IRQChannel = CNT_TIM_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = CNT_TIM_Priority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 使用外部時鐘源 */
TIM_ETRClockMode2Config(CNT_TIMx, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0);
/* 時基配置 */
TIM_TimeBaseStructure.TIM_Prescaler = 0; //預分頻值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //定時周期
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //分頻因子
TIM_TimeBaseInit(CNT_TIMx, &TIM_TimeBaseStructure);
TIM_ClearFlag(CNT_TIMx, TIM_FLAG_Update);
TIM_ITConfig(CNT_TIMx, TIM_IT_Update, ENABLE); //使能"更新"中斷
TIM_Cmd(CNT_TIMx, DISABLE);
}
/************************************************
函數名稱 : PWM_Output
功 能 : 輸出PWM
參 數 : Frequency --- 頻率
Dutycycle --- 占空比(12代表占空比為12%)
NumPulse --- 脈沖個數
返 回 值 : 無
作 者 : strongerHuang
*************************************************/
void PWM_Output(uint32_t Frequency, uint32_t Dutycycle, uint32_t NumPulse)
{
uint32_t pwm_period;
uint32_t pwm_pulse;
/* 輸出PWM */
pwm_period = PWM_CK_CNT/Frequency - 1; //計算出計數周期(決定輸出的頻率)
pwm_pulse = (pwm_period + 1)*Dutycycle / 100; //計算出脈寬值(決定PWM占空比)
/* 判斷是否為32位定時器 */
if((TIM2 == PWM_TIMx) || (TIM5 == PWM_TIMx)) //32位定時器:
{
}
else
{
if((0xFFFF < pwm_period) || (0xFFFF < pwm_pulse)) //16位定時器:period和pulse都不能超過0xFFFF
{
return;
}
}
TIM_Cmd(PWM_TIMx, DISABLE); //失能TIM
TIM_SetCounter(PWM_TIMx, 0); //計數清零
TIM_SetAutoreload(PWM_TIMx, pwm_period); //更改頻率
PWM_TIM_SetComparex(PWM_TIMx, pwm_pulse); //更改占空比
TIM_Cmd(PWM_TIMx, ENABLE); //使能TIM
/* 脈沖個數計時 */
TIM_Cmd(CNT_TIMx, DISABLE);
TIM_SetCounter(CNT_TIMx, 0);
TIM_SetAutoreload(CNT_TIMx, NumPulse-1); //設置中斷更新數
TIM_ClearFlag(CNT_TIMx, TIM_FLAG_Update);
TIM_Cmd(CNT_TIMx, ENABLE);
}
/************************************************
函數名稱 : TIM_Initializes
功 能 : TIM定時器初始化
參 數 : 無
返 回 值 : 無
作 者 : strongerHuang
*************************************************/
void TIM_Initializes(void)
{
PWM_TIM_Configuration();
CNT_TIM_Configuration();
}
復制代碼
/**
******************************************************************************
* @文件名 : bsp.c
* @作者 : strongerHuang
* @版本 : V1.0.0
* @日期 : 2018年06月23日
* @摘要 : BSP底層源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2018-06-23 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的頭文件 --------------------------------------------------------------*/
#include "bsp.h"
#include "bsp_timer.h"
/************************************************
函數名稱 : RCC_Configuration
功 能 : 時鐘配置
參 數 : 無
返 回 值 : 無
作 者 : strongerHuang
*************************************************/
void RCC_Configuration(void)
{
/* 使能AHB1時鐘 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD |
RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF |
RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH, ENABLE);
/* 使能AHB2時鐘 */
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);
/* 使能APB1時鐘 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* 使能APB2時鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}
/************************************************
函數名稱 : LED_Initializes
功 能 : LED初始化
參 數 : 無
返 回 值 : 無
作 者 : strongerHuang
*************************************************/
void LED_Initializes(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能時鐘 */
RCC_AHB1PeriphClockCmd(LED_GPIO_CLK, ENABLE);
/* 引腳配置 */
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
LED_OFF();
#if 0
/* MCO時鐘輸出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_2);
#endif
}
/************************************************
函數名稱 : BSP_Initializes
功 能 : 底層初始化
參 數 : 無
返 回 值 : 無
作 者 : strongerHuang
*************************************************/
void BSP_Initializes(void)
{
LED_Initializes(); //LED初始化
TIM_Initializes();
}
復制代碼
本人初學,僅供參考,存在錯誤和不足之處,請大家回帖多多指教,切勿照搬,文件下載:
Keil代碼下載:
Keil代碼.7z
(388.56 KB, 下載次數: 34)
2022-7-19 17:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
美女毛片免费看
|
日韩成人av在线
|
xnxx 日本免费
|
欧美电影在线
|
久久综合一区
|
毛片在线免费
|
国精产品一区一区三区免费完
|
精品亚洲一区二区三区四区五区高
|
日本在线视频一区二区
|
黑人精品欧美一区二区蜜桃
|
91视视频在线观看入口直接观看
|
天天操天天插天天干
|
爽爽免费视频
|
欧美精品一区二区在线观看
|
午夜精品在线观看
|
久久精品成人热国产成
|
国产成人久久精品一区二区三区
|
成人在线免费av
|
日韩av一区二区在线观看
|
国产精品视频不卡
|
国产成人福利在线观看
|
神马福利
|
精品av
|
在线免费视频一区
|
国产ts人妖一区二区三区
|
伊人网综合在线观看
|
国产精品国产精品国产专区不片
|
日韩视频高清
|
欧美在线一区二区视频
|
91精品国产91久久久久福利
|
成人影院在线视频
|
精品一区二区在线观看
|
欧美日韩a
|
色就是色欧美
|
久久精品视频在线观看
|
亚洲一区国产
|
久久黄色
|
视频在线一区二区
|
自拍视频网站
|
麻豆视频国产在线观看
|
麻豆成人在线视频
|