定时器2+串口发送

作者:number007cool

转自:http://blog.chinaunix.net/uid-21658993-id-1820024.html


USART.c

#include "STM32Lib\\stm32f10x.h"
/**********************************************
**串口配置函数,这里使能了两个串口,其中串口2使用了中断接收模式
**
**********************************************/
u8 Uart1_Get_Flag; //串口1接收到数据标志
u8 Uart1_Get_Data; //串口1接收的数据

void USART_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
 USART_ClockInitTypeDef USART_ClockInitStructure;
 
 //使能串口1,PA,AFIO总线
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
            RCC_APB2Periph_AFIO |
            RCC_APB2Periph_USART1 ,
            ENABLE);

    /* A9 USART1_Tx */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出-TX
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* A10 USART1_Rx  */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入-RX
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    USART_InitStructure.USART_BaudRate = 9600;
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 USART_InitStructure.USART_Parity = USART_Parity_No;
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 
 USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

 USART_ClockInit(USART1, &USART_ClockInitStructure);
    USART_Init(USART1, &USART_InitStructure);
    /* Enable the USARTx */
    USART_Cmd(USART1, ENABLE);
 //串口1使用接收中断
 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
 
 
 //使能串口2时钟
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
 
 // A2 做T2X
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // A3 做R2X
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 USART_InitStructure.USART_BaudRate = 9600;
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 USART_InitStructure.USART_Parity = USART_Parity_No;
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 
 USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

    USART_ClockInit(USART2, &USART_ClockInitStructure);
    USART_Init(USART2, &USART_InitStructure);
   
    USART_Cmd(USART2, ENABLE);
 //串口2使用接收中断
 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}

void USART1_Putc(unsigned char c)
{
    USART_SendData(USART1, c);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
}

void USART1_Puts(char * str)
{
    while(*str)
    {
        USART_SendData(USART1, *str++);
        /* Loop until the end of transmission */
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    }
}

void USART2_Putc(unsigned char c)
{
    USART_SendData(USART2, c);
    while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
}

void USART2_Puts(char * str)
{
    while(*str)
    {
        USART_SendData(USART2, *str++);
        /* Loop until the end of transmission */
        while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
    }

}

hal.h

#ifndef HAL_H
#define HAL_H

//硬件初始化
extern void  ChipHalInit(void);
extern void  ChipOutHalInit(void);


//输出宏定义
//清零
#define LED1_OFF  GPIO_ResetBits(GPIOA, GPIO_Pin_8)
//置一
#define LED1_ON      GPIO_SetBits(GPIOA, GPIO_Pin_8)

#define LED2_OFF  GPIO_ResetBits(GPIOA, GPIO_Pin_7)
#define LED2_ON         GPIO_SetBits(GPIOA, GPIO_Pin_7)

#define LED3_OFF  GPIO_ResetBits(GPIOC, GPIO_Pin_7)
#define LED3_ON   GPIO_SetBits(GPIOC, GPIO_Pin_7)

#define LED4_OFF  GPIO_ResetBits(GPIOC, GPIO_Pin_5)
#define LED4_ON   GPIO_SetBits(GPIOC, GPIO_Pin_5)

#define LED5_OFF  GPIO_ResetBits(GPIOB, GPIO_Pin_9)
#define LED5_ON   GPIO_SetBits(GPIOB, GPIO_Pin_9)

#define LED6_OFF  GPIO_ResetBits(GPIOB, GPIO_Pin_8)
#define LED6_ON   GPIO_SetBits(GPIOB, GPIO_Pin_8)

#define LED7_OFF  GPIO_ResetBits(GPIOB, GPIO_Pin_5)
#define LED7_ON   GPIO_SetBits(GPIOB, GPIO_Pin_5)

#define LED8_OFF  GPIO_ResetBits(GPIOB, GPIO_Pin_0)
#define LED8_ON   GPIO_SetBits(GPIOB, GPIO_Pin_0)

 


//串口
extern void USART1_Putc(u8 c);
extern void USART1_Puts(char * str);
extern void USART2_Putc(u8 c);
extern void USART2_Puts(char * str);

extern u8 flag;
extern u32 count;
extern u8 Uart1_Get_Flag;
extern u8 Uart1_Get_Data;

#endif

TIM.c

#include "STM32Lib\\stm32f10x.h"


void TIM_Configuration(void)
{
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;
 u16 CCR1_Val = 4000;//捕获比较值1
 u16 CCR2_Val = 2000;//捕获比较值2
 u16 CCR3_Val = 1000;//捕获比较值3
 u16 CCR4_Val = 500; //捕获比较值4
 
 /* TIM2 clock enable */
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

 /* 基础设置*/
 TIM_TimeBaseStructure.TIM_Period = 8000;   //计数值  
 TIM_TimeBaseStructure.TIM_Prescaler = 72-1;     //预分频,此值+1为分频的除数,分频系数
 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   //
 //向上计数,从0计数到自动加载值,然后重新从0开始计数,并产生一个计数溢出事件
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
 
 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
 
 /* 比较通道1*/
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive;        //输出比较非主动模式
 TIM_OCInitStructure.TIM_Pulse = CCR1_Val; 
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //极性为正
  
 TIM_OC1Init(TIM2, &TIM_OCInitStructure);
 TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);    //禁止OC1重装载,其实可以省掉这句,因为默认是4路都不重装的.
 
 /*比较通道2 */       
 TIM_OCInitStructure.TIM_Pulse = CCR2_Val; 
 
 TIM_OC2Init(TIM2, &TIM_OCInitStructure);
 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);
 
 /* 比较通道3 */        
 TIM_OCInitStructure.TIM_Pulse = CCR3_Val; 
 
 TIM_OC3Init(TIM2, &TIM_OCInitStructure);
 TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);
 
 /* 比较通道4 */      
 TIM_OCInitStructure.TIM_Pulse = CCR4_Val; 
 
 TIM_OC4Init(TIM2, &TIM_OCInitStructure);
 TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);
 
 /*使能预装载*/
 TIM_ARRPreloadConfig(TIM2, ENABLE);
 /*预先清除所有中断位*/
 TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update);

 /* 4个通道和溢出都配置中断*/
 TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update, ENABLE);
 
 
 /* 允许TIM2开始计数 */
 TIM_Cmd(TIM2, ENABLE);
}

 

 

NVIC.c

#include "STM32Lib\\stm32f10x.h"

void NVIC_Configuration(void)
{
 NVIC_InitTypeDef NVIC_InitStructure;
 
 /* Configure one bit for preemption priority */
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


 /* Timer2中断*/
 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);

 /*UART1*/
 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);
}

GPIO.c

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
/*******************************************************************************
* Function Name  : GPIO_Configuration
* 设置PD3,PD4,PD5,PD6为键盘输入
* 设置PB0,5,8,9; PC5,7; PD7 ;PA8 为输出LED灯
*******************************************************************************/
void GPIO_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

 
 /*允许总线CLOCK,在使用GPIO之前必须允许相应端的时钟.
 从STM32的设计角度上说,没被允许的端将不接入时钟,也就不会耗能,
 这是STM32节能的一种技巧,*/
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

 /*初始化LED输出为0*/
 LED1_OFF;
 LED2_OFF;
 LED3_OFF;
 LED4_OFF;
 LED5_OFF;
 LED6_OFF;
 LED7_OFF;
 LED8_OFF;
 
 /* PB0,5,8,9输出 */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 /* PC5,7输出*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
 GPIO_Init(GPIOC, &GPIO_InitStructure);
 
 /*PA7,输出*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 /*PA8,输出*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 
}

hal.c

/***************************************************
**HAL.c
**主要用于芯片硬件的内部外围和外部外围的初始化,两大INIT函数
**在MAIN中调用,使MAIN函数中尽量与硬件库无关
***************************************************/

#include "STM32Lib\\stm32f10x.h"


//各个内部硬件模块的配置函数
extern void GPIO_Configuration(void);   //GPIO
extern void RCC_Configuration(void);   //RCC
extern void TIM_Configuration(void);   //TIM
extern void USART_Configuration(void);   //串口
extern void NVIC_Configuration(void);   //NVIC
/*******************************
**函数名:ChipHalInit()
**功能:片内硬件初始化
*******************************/
void  ChipHalInit(void)
{
 //初始化时钟源
 RCC_Configuration();
 
 //初始化GPIO
 GPIO_Configuration();
 
 //初始化中断源
 NVIC_Configuration();

 //初始化串口
 USART_Configuration();
 
 //初始化定时器
 TIM_Configuration();
}


/*********************************
**函数名:ChipOutHalInit()
**功能:片外硬件初始化
*********************************/
void  ChipOutHalInit(void)
{
 
}

stm32f10x_it.c

/*******************************************************************************
* Function Name  : TIM2_IRQHandler TIM2中断
* Description    : This function handles TIM2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/

extern u32 count=0;
extern u8 flag=0;
void TIM2_IRQHandler(void)
{
  
 if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
 {
  //必须清空标志位/ /
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
 
  //点亮LED5//
  LED5_ON;
  //LED1直接操作寄存器方式的闪烁
  GPIOA->ODR^=GPIO_Pin_8;
 
 }
 else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
 {
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
 
  //点亮LED6//
  LED6_ON;
 }
 else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
 {
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
  
  // 点亮LED7//
  LED7_ON;
 }
 else if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)
 {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
    
    //点亮LED8//
  LED8_ON;
 
 }
 else if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
 {
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  //熄灭所有LED//
   count++;
      flag=1;
      if(count>=99999999)
      count=0; 
    
  LED5_OFF;
  LED6_OFF;
  LED7_OFF;
  LED8_OFF;
 }
}

/*******************************************************************************
* Function Name  : TIM3_IRQHandler
* Description    : This function handles TIM3 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TIM3_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name  : TIM4_IRQHandler
* Description    : This function handles TIM4 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TIM4_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name  : I2C1_EV_IRQHandler
* Description    : This function handles I2C1 Event interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C1_EV_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name  : I2C1_ER_IRQHandler
* Description    : This function handles I2C1 Error interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C1_ER_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name  : I2C2_EV_IRQHandler
* Description    : This function handles I2C2 Event interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C2_EV_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name  : I2C2_ER_IRQHandler
* Description    : This function handles I2C2 Error interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C2_ER_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name  : SPI1_IRQHandler
* Description    : This function handles SPI1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SPI1_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name  : SPI2_IRQHandler
* Description    : This function handles SPI2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SPI2_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name  : USART1_IRQHandler
* Description    : This function handles USART1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
extern u8 Uart1_Get_Flag;
extern u8 Uart1_Get_Data;

void USART1_IRQHandler(void)
{
 //接收中断
 if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
 {
  USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  Uart1_Get_Data=USART_ReceiveData(USART1);
  Uart1_Get_Flag=1;
 }
 
 //溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题
 if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
 {
  USART_ClearFlag(USART1,USART_FLAG_ORE); //读SR
  USART_ReceiveData(USART1);    //读DR
 }
}

main.c

/************************************************************
**实验名称:Timer
**功能:实现Timer2的4组比较中断,此为STM32定时器的其中一个功能.4段捕获比较分别驱动四个LED点亮,
  溢出中断则负责熄灭LED.
  对于其它的定时器,基本用法均一样(除T1,T8高级定时器)
**注意事项:注意要开放stm32f10x_conf.h中的 #include "stm32f10x_tim.h" ,#include "misc.h"
**作者:电子白菜
*************************************************************/

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
#define SIZE 0
u8    table[11]={"0123456789 "};
char buffer[10]={"0000000000"};
void Delay(u16 n);

void d_2_char(u32 x)
{
 buffer[SIZE+0]=table[x%10000000000/100000];
 buffer[SIZE+1]=table[x%1000000000/100000];
 buffer[SIZE+2]=table[x%100000000/100000];
 buffer[SIZE+3]=table[x%10000000/10000];
 buffer[SIZE+4]=table[x%1000000/10000];
 buffer[SIZE+5]=table[x%100000/10000];
 buffer[SIZE+6]=table[x%10000/1000];
 buffer[SIZE+7]=table[x%1000/100];
 buffer[SIZE+8]=table[x%100/10];
 buffer[SIZE+9]=table[x%10];
}
int main(void)
{
 
 ChipHalInit();   //片内硬件初始化
 ChipOutHalInit();  //片外硬件初始化
 
 for(;;)
 {
     if(flag==1)
  {
  flag=0;
  d_2_char(count);
  USART1_Puts(buffer);
  USART1_Puts("\r\n");
  //Delay(2000);
  }
   
 }
  
}

//延迟函数
void Delay(u16 speed)
{
 u16 i;
 while(speed!=0)
 {
  speed--;
  for(i=0;i<400;i++);
 }
}

 

 

RCC.c

#include "STM32Lib\\stm32f10x.h"

RCC_ClocksTypeDef RCC_ClockFreq;

void RCC_Configuration(void)
{
 SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置.具体请看2_RCC

 /**************************************************
 获取RCC的信息,调试用
 请参考RCC_ClocksTypeDef结构体的内容,当时钟配置完成后,
 里面变量的值就直接反映了器件各个部分的运行频率
 ***************************************************/
 RCC_GetClocksFreq(&RCC_ClockFreq);
 
 /* 这个配置可使外部晶振停振的时候,产生一个NMI中断,不需要用的可屏蔽掉*/
 //RCC_ClockSecuritySystemCmd(ENABLE);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值