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闪亮
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的方波的主要内容,如果未能解决你的问题,请参考以下文章