stm32C8t6 通用定时器输出PWM+定时中断控制板载LED

stm32f103c8t6只有高级定时器和通用定时器,没有基本定时器
在这里插入图片描述
在这里插入图片描述

通过定时器3使能中断1s一次控制板载LED
基本步骤
*开启定时器时钟
*定时器初始化结构体配置
*定时器中断开启
*定时器使能

void led_init(void)
{
  GPIO_InitTypeDef   GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC,&GPIO_InitStruct);

}
void tim_init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_InitStruct;
	NVIC_InitTypeDef   NVIC_InitStruct;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	TIM_InitStruct.TIM_Prescaler = 7200 - 1 ;  //预分频      72M/7200 = 10000 
	TIM_InitStruct.TIM_Period =  10000 - 1;   //自动重装载值  10000 / 10000 = 1Hz   1/1 = 1s 
	TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_InitStruct.TIM_ClockDivision = 0;
	TIM_TimeBaseInit(TIM3,&TIM_InitStruct);
	TIM_ClearFlag(TIM3, TIM_FLAG_Update);
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
	TIM_Cmd(TIM3,ENABLE);
	
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
}

int num = 0;
void TIM3_IRQHandler(void)   //TIM3中断 1s一次
{ 
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
			num++;
			TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源 
		}
}

定时器4控制输出pwm 实现led呼吸灯
/*
打开GPIO时钟 PA0 – CH1
打开定时器时钟
初始化定时器
初始化输出比较
*/

void TIM4_init(void)
{
  GPIO_InitTypeDef   GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef  TIM_InitStruct;
	TIM_OCInitTypeDef   TIM_OCInitStruct;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	TIM_InitStruct.TIM_Prescaler = 720 - 1 ;  // 预分频 PSC 72M/(720) =  100000  
	TIM_InitStruct.TIM_CounterMode =  TIM_CounterMode_Up;
	TIM_InitStruct.TIM_Period = 100 - 1;  //自动重装载值 ARR 100/100000 =  0.001S  输出频率 = 72M/720/100 = 1KHZ
	TIM_InitStruct.TIM_ClockDivision = 0;
	TIM_TimeBaseInit(TIM4,&TIM_InitStruct);

	
	
	TIM_OCStructInit(&TIM_OCInitStruct);
  TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStruct.TIM_OutputState =  TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStruct.TIM_Pulse = 50;  //占空比 CCR  占空比 = CCR/(ARR+1) = 50% ,可以通过TIM_SetCompare2来改变,这里只是一个初始化
	TIM_OC2Init(TIM4,&TIM_OCInitStruct); //输出比较通道2初始化
	TIM_Cmd(TIM4,ENABLE);
//	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
	
}

占空比控制:

for(i = 0;i<100;i++)
{
TIM_SetCompare2(TIM4,i);  //输出比较通道2 这个函数是改变定时器的CCR寄存器的值,也就是可以改变占空比
	delay_ms(10);
}
for(i = 100;i> 0;i--)
{
TIM_SetCompare2(TIM4,i);
	delay_ms(10);
}

pwm输出的占空比,频率,分辨率计算
在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用STM32C8T6微控制器编写PWM波时,你可以按照以下步骤进行操作: 1. 配置定时器:选择一个合适的定时器通道和模式,以及计数器的预分频和周期设置。 2. 配置GPIO引脚:选择一个合适的GPIO引脚,并将其配置为PWM输出模式。 3. 配置PWM参数:设置PWM的占空比和频率。 4. 初始化定时器:根据之前的配置参数,初始化定时器。 5. 配置PWM输出:配置PWM输出通道,并设置占空比。 6. 启动定时器:启动定时器以开始生成PWM波。 以下是一个简单的示例代码,演示如何在STM32C8T6上生成PWM波: ```c #include "stm32c8t6.h" void PWM_Configuration(void) { // 步骤1:配置定时器 TIM_TypeDef *TIMx = TIM1; // 选择定时器 TIMx->PSC = 0; // 设置预分频值 TIMx->ARR = 999; // 设置周期值 // 步骤2:配置GPIO引脚 GPIO_TypeDef *GPIOx = GPIOA; // 选择GPIO引脚 GPIOx->MODER |= GPIO_MODER_MODER8_1; // 设置引脚为复用模式 GPIOx->AFR[1] |= GPIO_AFRH_AFRH0_0; // 设置引脚复用功能为定时器 // 步骤3:配置PWM参数 uint32_t channel = TIM_CHANNEL_1; // 选择PWM输出通道 TIMx->CCR1 = 500; // 设置占空比 // 步骤4:初始化定时器 TIMx->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // 设置PWM模式 TIMx->CCER |= TIM_CCER_CC1E; // 启用PWM输出 // 步骤5:启动定时器 TIMx->CR1 |= TIM_CR1_CEN; // 启动定时器 } int main(void) { // 步骤6:初始化系统和PWM配置 SystemInit(); PWM_Configuration(); while (1) { // 在这里可以添加其他逻辑代码 } } ``` 请根据你的具体需求修改代码中的参数和引脚配置。这只是一个简单的示例,你可以根据自己的应用场景进行更详细的配置和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值