STM32单片机使用定时器中断产生1khz的方波

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32单片机使用定时器中断产生1khz的方波相关的知识,希望对你有一定的参考价值。

如题 一个i/o口输出 完整可编译程序采纳

STM32有硬件PWM功能,但应用比较复杂,我也刚学,不知是否能产生1KHZ
用时器中断比较简单,但你要知道要添加哪些头文件
int main(void)

  LED_GPIO_Config();/* led 端口配置,也就是配置哪个管脚输出方波 这里以LED代替,这可是最基本 的操作,方法略 */
TIM2_Configuration(); /* TIM2 定时配置 */
TIM2_NVIC_Configuration();/* 定时器的中断优先级配置 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); /* TIM2 重新开时钟,开始计时 */
while(1);


void TIM2_NVIC_Configuration(void)(); /* 定时器的中断优先级配置 */

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/*
void TIM2_Configuration(void)

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

/* 设置TIM2CLK 为 72MHZ */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
//TIM_DeInit(TIM2);

/* 自动重装载寄存器周期的值(计数值) */
TIM_TimeBaseStructure.TIM_Period=1000; //这里改成500就是0.5ms中断一次了
/* 累计 TIM_Period个频率后产生一个更新或者中断 */
/* 时钟预分频数为72 */
TIM_TimeBaseStructure.TIM_Prescaler= 71;

/* 对外部时钟进行采样的时钟分频,这里没有用到 */
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

TIM_Cmd(TIM2, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE); /*先关闭等待使用*/

中断程序:
void TIM2_IRQHandler(void)

if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )

LED1_TOGGLE; //对LED1管脚取反 0.5ms一次
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);

  

还是把GPIO配置也帖出来吧,这里是3个引脚接3个LED,你可以只设一个引脚就可以了
void LED_GPIO_Config(void)

/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
/*选择要控制的GPIOB引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIOB0*/
GPIO_Init(GPIOB, &GPIO_InitStructure);

/*选择要控制的引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;

GPIO_Init(GPIOC, &GPIO_InitStructure);

/* 关闭所有led灯 */
GPIO_SetBits(GPIOB, GPIO_Pin_0);

/* 关闭所有led灯 */
GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);
追问

怎么运行不了

追答

你是库开发吗?编译通过了吗?要添加相应的头文件及其源文件
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
//#include "stm32f10x_tim.h"
#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
#include "bsp_led.h"
void LED_GPIO_Config(void) 是写在"bsp_led.c" 中,其头文件中还有许多宏定义 总之,不用定时器的情况下你要能让LED闪亮

参考技术A 这个问题很傲特,我不懂追问

out? 对于一个刚入门单片机的我 表示已经做了三天都没做好

stm32 如何产生秒脉冲中断

void SysTick_Handler(void)

if(Timer1)
Timer1--;


if (SysTick_Config(SystemFrequency / 1000))

/* Capture error */
while (1);

volatile u16 Timer1;
void SysTickDelay(u16 dly_ms)

Timer1=dly_ms;
while(Timer1);

这是systick产生毫秒级的中断,非常准
参考技术A RTC秒中断或者定时器中断 参考技术B 用定时器计时就行啦

以上是关于STM32单片机使用定时器中断产生1khz的方波的主要内容,如果未能解决你的问题,请参考以下文章

stm32输出的pwm有啥用

stm32 如何产生秒脉冲中断

汇编深度理解中断

STM32 PWM设定输出

STM32F103定时器最多可以输出多少路PWM波

怎么使stm32的蜂鸣器发出1kHz频率的声音?程序怎么写?